2017-01-24 84 views
1

我有我的MainActivity:JavaScriptInterface方法無法識別(的Android的WebView)

webView.addJavascriptInterface(new JavaScriptInterface(this), "ajaxHandler"); 
.... 
public class JavaScriptInterface 
    { 
     Context mContext; 

     JavaScriptInterface(Context c) { 
      mContext = c; 
     } 

     public void DoSomething(String dataToPrint) 
     { 
      ..... 
     } 
} 

我讀的問題可能是proguard的。 所以我更新了proguard的規則文件:

-keepclassmembers class fqcn.of.javascript.interface.for.webview { 
    public *; 
} 

-keep public class com.example.testapp.JavaScriptInterface 
-keep public class * implements com.example.testapp.JavaScriptInterface 
-keepclassmembers class * implements com.example.testapp.MainActivity.JavaScriptInterface{ 
    public *; 
} 

它並沒有什麼幫助......在chrome調試器,因爲我把控制檯的ajaxHandler對象和DoSomething的方法,我可以看到ajaxHandler對象Object {} 但它是空的,且該方法DoSomething的是undefined

回答

1

接口類

public class JavaScriptInterface 
    { 
     Context mContext; 

     JavaScriptInterface(Context c) { 
      mContext = c; 
     } 
     @JavascriptInterface //add this 
     public void DoSomething(String dataToPrint) 
     { 
      ..... 
     } 
} 

在proGuard.pro文件

-keep public class com.example.testapp.MainActivity$JavaScriptInterface 
-keep public class * implements com.example.testapp.MainActivity$JavaScriptInterface 
-keepclassmembers class * implements com.example.testapp.MainActivity$JavaScriptInterface{ 
    <methods>; 
} 
-keepattributes *Annotation* 

使用$符號不是.來獲取內部接口類的名稱。

+0

謝謝你,'@ JavascriptInterface'註解部分幫助 - 我現在可以在chrome調試器中看到該方法,但由於某種原因它沒有在我的應用程序代碼中調用(javascript代碼很好, m在應用程序的iOS版本上使用相同的JavaScript代碼,它在那裏工作完美..) – BVtp

+0

已經改變了你的proGuard.pro文件 – Pavya

+0

我可以用'public *;'替換';''吧?它仍然無法正常工作,但我可以在Chrome調試器中看到該方法,但它不會在我的應用程序中調用。 – BVtp