有個汽車廠商提出需求,在我們提供的安卓設備上使用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;