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();