android中JavaScript与java接口互相调用产生的失效问题

有个汽车厂商提出需求,在我们提供的安卓设备上使用js来调用java硬件服务接口,一般我们有人写apk demo的。我没用过js,java只是能大概看懂,只是个开发驱动底层的,这可难住我了,我去,度娘你在哪里!?

在网上搜了一会,不少人还真有这样的需求,我估摸着,不少人从js转过来做安卓程序,又对android的apk不是很熟悉吧!

就当是笔记,我受益的博客列出来:

1、android中Webview与javascript的交互(互相调用)       该博客含demo

http://blog.csdn.net/beyond0525/article/details/9374301

2、Android WebView共5篇文章

http://blog.csdn.net/u010358168/article/details/40148213

3、Android targetSdkVersion 17 @JavascriptInterface

http://blog.csdn.net/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;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值