2017-01-24 6 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 *; 
} 

Это не помогло, хотя ... в хромированной отладчик, так как я положил в консоли объект 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' частично помогли - я вижу теперь метод в хром-отладчике, но по какой-то причине он не вызывается в коде приложения (код javascript хорош, m, используя тот же код javascript на iOS-версии приложения, и он отлично работает там.) – BVtp

+0

изменили ваш файл proGuard.pro – Pavya

+0

Я могу заменить ';' на 'public *;' правильно? Он все еще не работает, но я вижу метод в хром-отладчике, но он не вызывается внутри моего приложения. – BVtp

 Смежные вопросы

  • Нет связанных вопросов^_^