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;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章