2013-05-05 21 views
2

official docs中清楚指出的,API級別JELLY_BEAN_MR1及以上需要使用@JavascriptInterface,以便從webview側訪問java函數。JELLY_BEAN及以下的JavascriptInterface註釋

這意味着,項目建設目標必須指向API 17或高於它解決了以下導入:

import android.webkit.JavascriptInterface; 

如何處理Android的API爲16和下面這段代碼?我會得到一個運行時異常還是忽略運行時導入?

回答

4

我很驚訝這些答案......他們不準確。 如果添加JavascriptInterface並且另一個註釋讓MyAnnotation以同樣的方法(如我所做的),然後嘗試訪問實例註釋,那麼您將遇到ClassDefNotFoundException驚喜!

我的解決方案,這似乎對現在的工作(它已經一年多了),是註釋聲明添加到應用程序項目:

package android.webkit; 


import java.lang.annotation.ElementType; 
import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy; 
import java.lang.annotation.Target; 


@Retention(RetentionPolicy.RUNTIME) 
@Target({ElementType.METHOD}) 
public @interface JavascriptInterface {} 

這解決了在2.3.5的問題,仍然在4.3和4.4和4.2上工作。

希望這可以幫助別人!

+0

你如何應用你的答案?創建{{project}}/JavascriptInterface.java並將上面的代碼放入並導入{{which_file}}? – eugene 2014-12-09 08:48:39

+1

你添加一個{Project} /src/android/webkit/JavascriptInterface.java並導入android.webkit.JavascriptInterface; – TacB0sS 2014-12-09 08:58:53

+0

謝謝! TacB0sS – eugene 2014-12-09 14:39:42

0

像你建議的import android.webkit.JavascriptInterface;這樣的導入只是編譯器的提示,所以它可以解析你在源代碼中進一步提到的全部類路徑。當你嘗試和使用這個類時,虛擬機只會拋出一個ClassNotFoundException。所以簡單的答案是否定的,只要你保護你的JavascriptInterface使用類似下面的東西,一切都會好起來的。

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1){ 
     JavascriptInterface js = new JavascriptInterface(){ ... }; 
    } 
+0

這不能用註釋完成! – TacB0sS 2014-12-09 14:44:06

4

註解類JavascriptInterface不是由較舊的Android版本加載,所以您的代碼將不會對老版本的任何問題上運行。

+0

那麼,如果此註釋由較舊的Android版本加載,那麼此註釋如何防範CVE-2012-6636? – peacepassion 2014-10-27 03:30:51

+0

@peacepassion Android版本16或更低版本易受攻擊。見http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2012-6636。我之前說過的是,如果開發人員使用註釋JavascriptInterface,那麼在運行在較舊的Android版本上時,它將在運行時崩潰。 – yoah 2014-10-27 11:16:23

相關問題