有个汽车厂商提出需求,在我们提供的安卓设备上使用js来调用java硬件服务接口,一般我们有人写apk demo的。我没用过js,java只是能大概看懂,只是个开发驱动底层的,这可难住我了,我去,度娘你在哪里!?
在网上搜了一会,不少人还真有这样的需求,我估摸着,不少人从js转过来做安卓程序,又对android的apk不是很熟悉吧!
就当是笔记,我受益的博客列出来:
1、android中Webview与javascript的交互(互相调用) 该博客含demo
http://blog.youkuaiyun.com/beyond0525/article/details/9374301
2、Android WebView共5篇文章
http://blog.youkuaiyun.com/u010358168/article/details/40148213
3、Android targetSdkVersion 17 @JavascriptInterface
http://blog.youkuaiyun.com/zzf112/article/details/19546859
4、android addJavascriptInterface 不能生效 解决办法
http://blog.sina.com.cn/s/blog_4e1e357d0101gju8.html
至于如何js和java互相调用看博文1,下载博客中的demo,发现编译没错误啊,运行时java能运行js写的函数,奇怪的是js却没有成功执行java写的函数,上网一查不少人也碰到了这个情况,后两篇博客就是解决这个问题的。详细如下,
以下引用了上面第一个博文,是js中调用的java对象定义,并且js调用了fun1FromAndroid方法:
public class JavaScriptObject {
Context mContxt;
@JavascriptInterface //sdk17及以上版本加上注解
public JavaScriptObject(Context mContxt) {
this.mContxt = mContxt;
}
public void fun1FromAndroid(String name) {
Toast.makeText(mContxt, name, Toast.LENGTH_LONG).show();
}
public void fun2(String name) {
Toast.makeText(mContxt, "调用fun2:" + name, Toast.LENGTH_SHORT).show();
}
}
假设你的apk中的AndroidManifest.xml中的
android:targetSdkVersion小于17,那还是按照老方法直接调用,上面的“@JavaScriptInterface”就不需要了,现在的版本大多都是Android4.4(API-19, API-17为Android4.2),所以现在开发的都要加上啦。老方法js都能调用java对象的public方法,这样原本只提供让js调用fun1FromAndroid这一个方法的,结果都能调用了,这样安全性不够,自从API17之后,需要让js调用的方法必须用@JavaScriptInterface注释,否则调用失效。
解决失效具体3步:
1、使用较高的版本编译(选中工程名,键盘ALT+Enter,再选择)
2、在需要被js调用的java方法上增加@JavaScriptInterface注释
3、增加 import android.webkit.JavascriptInterface;