phoneGap開發android,JS調用android方法
使用場景
在開放過程中很多會使用到android原生的東西,當然phoneGap也封裝了一些,不過那麼一點點想開發Android程序還是不夠的……我在開發中APP更新就要在JS中觸發事件調用android方法傳更新的URL過去,使用JAVA更新APP自動打開安裝。
方法1:
使用插件訪問Native code,見“PhoneGap 4.2.0插件指南.docx”。
方法2:
addJavascriptInterface
MainActivity.java
public class MainActivity extends DroidGap {
@Override
public void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
//解決錯誤:07-1508:52:09.035: ERROR/AndroidRuntime(491): FATAL EXCEPTION: main
//java.lang.RuntimeException: Unable to start activity ComponentInfo //{com.example/com.example.MainActivity}:java.lang.NullPointerException
//需添加super.init()
super.init();
//有Javascript的頁面必須設置setJavaScriptEnabled爲true
appView.getSettings().setJavaScriptEnabled(true);
//第一個參數就是我們一般會實現一個自己的類,類裏面提供我們要提供給javascript訪問的方法;第二個參數是訪問我們在obj中聲明的方法時候所用到的js對象
appView.addJavascriptInterface(new PluginMethod(this,appView), "SM");
super.loadUrl("file:///android_asset/www/index.html",5000);
}}
PluginMethod.java
package com.example;
import android.util.Log;
import android.webkit.WebView;
import android.widget.Toast;
import com.plugin.UpdateApplication;
import org.apache.cordova.DroidGap;
/**
*Created with IntelliJ IDEA.
*User: FakeMr
*Date: 13-7-15
*Time: 下午4:12
* Tochange this template use File | Settings | File Templates.
*/
public class PluginMethod{
private WebView webView;
private DroidGap droidGap;
public PluginMethod(DroidGap gap, WebView view) {
webView= view;
droidGap= gap;
}
/**
*JS調用 用於更新App
*@param path 更新門店的地址
* @JavascriptInterface 必須加,爲了解決Android 2.2所帶來的安全漏洞
*在Javascript Bridge對象下的所有回調方法使用@JavascriptInterface 進行註解聲明,表示index.html可以調用的addJavascriptInterface()的實例中的方法
*/
public void UpdateApp(final String path) {
Log.e("---------------",path); //注意這裏日誌輸出
}
}
JS使用:
window.SM.UpdateApp('http://192.168.0.1'); // 注意這裏的SM表示JavascriptInterface的實例
ERROR:
第二種方法我報錯
07-15 08:52:09.035:ERROR/AndroidRuntime(491): FATAL EXCEPTION: main
java.lang.RuntimeException:Unable to start activity ComponentInfo {com.example/com.example.MainActivity}: java.lang.NullPointerException
解決方法:
super.init();