未调用WebView的JavascriptInterface方法

时间:2015-04-16 09:08:51

标签: javascript android webview

Hy我有一个非常奇怪的问题,我的应用程序是一个电子阅读器。调用Web视图的函数我使用javascript类:

    public class MyJavaScriptInterface {
        Context mContext;

        /* Instantiate the interface and set the context */
        MyJavaScriptInterface(Context c) {
             mContext = c;
        }

        @JavascriptInterface
        public void functionToCall(String input) {
             System.out.println("this function was called: "+ input);
        }
  }

我有一个自定义的网页视图,我在其中添加了myJavascript类。

  public class newBTWebView extends WebView implements {
       public newBTWebView(Context context) {
         super(context);
         init(context);

       }
       public void init(Context context) {
         System.out.println("newBTWebview init");
         this.context = context;
         this.getSettings().setJavaScriptEnabled(true);
         setInitialScale(100);
         addJavascriptInterface(new MyJavaScriptInterface(this.context), "HTMLOUT");
     }
 }

在我的主要活动中,我启动了Web视图并使用javascript调用该函数:

   public class BookReader extends Activity implements WebViewDelegate{
        private static Context mContext;
        private static newBTWebView testWV;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        System.out.println("onCreate");
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        super.onCreate(savedInstanceState);
        testWV = (newBTWebView) findViewById(R.id.mywebview1);
        testWV.setDelegate(this);
        testWV.setWebChromeClient(new WebChromeClient());
        testWV.getSettings().setJavaScriptEnabled(true);
        testWV.getSettings().setPluginState(PluginState.ON);


        testWV.setWebViewClient(new WebViewClient() {

             @Override 
             public boolean shouldOverrideUrlLoading(WebView view, String url)
             {
                 System.out.println("shouldOverrideUrlLoading: " + url);
             }
             @Override
             public void onPageFinished(WebView view, String url) {
                 System.out.println("onPageFinished");
             }
         }
    }
    public void callMyFunction
    {
         System.out.println("callMyFunction");
        testWV.loadUrl("javascript:window.HTMLOUT.functionToCall('myinput');”);
    }
 }

functionToCall最近在我的最新更新中工作得很好,因为我在设备上测试它仍在工作的应用程序,但是当我在商店提交它时,functionToCall不再被调用了。我在设备上测试了apk文件,而没有调用functionToCall。它只适用于我直接从电脑上运行应用程序到设备,但在函数调用之前使用的同一设备上使用apk文件不会被调用。 我已经在三星S4,三星Note 10.1和nexus note上进行了测试。与android 4.4.2,4.0.4和5.0.1

任何建议表示赞赏, 谢谢。

1 个答案:

答案 0 :(得分:3)

您是否已启用proguard或某些代码混淆?如果是,则应添加keep属性

-keep public class com.MyJavaScriptInterface 
-keep public class * implements  com.MyJavaScriptInterface 
-keepclassmembers class * implements com.MyJavaScriptInterface {
<fields>;
<methods>;
}

我不知道你的班级是否是完全合格的名字。所以请把你的完全合格的名字。