从java - Android收听javascript函数调用

时间:2012-02-16 06:51:53

标签: android webview

我在服务器上托管了一些HTML5 / javascript文件。当在HTML5页面上单击按钮时,将调用javascript函数。我想在调用函数时监听并获取函数返回的json。以前我在设备上打开一个端口,但这似乎不适用于Android 3.0。我听说您可以使用外部接口来收听javascript调用,但我不知道如何实现它。

2 个答案:

答案 0 :(得分:3)

要使用外部接口,您需要在WebView中运行您的站点。以下解决方案暗示了什么

  1. 您知道要拦截的所有函数名称,以及......
  2. 这些函数属于JS代码的公共范围。
  3. 要注册您的界面,您需要在WebView实例上调用addJavascriptInterface方法。您需要为其选择一个名称并创建一个实现。你的界面应该拦截函数调用并报告它们的结果,所以,让我们来描述它......

    class FunctionCallInterceptor {
        public void reportCall(String functionName, String result) {
          // some code, handling interception
        }
    }
    

    并注册...

    mWebView.addJavascriptInterface(new FunctionCallInterceptor(), 'Interceptor');
    

    有关JavaScript界面​​的更多信息,请参阅Binding JavaScript

    然后你需要将功能结果“传输”到你的界面......这里你需要一些JavaScript代码。

    function wrapFunc(name) {
      if(typeof window[name] == 'function') {  // If target is accessible
        var original = window['__' + name] = window[name];  // remember original one
        window[name] = function() {  // and replace with wrapper
            var result = original.apply(this, arguments); // call original                
            Interceptor.reportCall(name, result.toString()); // report to interceptor
            return result;  // return result as usual
        }
      }
    }
    

    要包装您的函数,请使用此代码

    wrapFunc('myFunction'); // wraps myFunction in the source
    

    此外,不要忘记在所有

    启用JavaScript
    mWebView.getSettings().setJavaScriptEnabled(true);
    

    何时,如何将此代码嵌入外部页面(我暗示您无法访问外部JS代码)...要在页面上下文中执行任意代码,您可以使用loadUrl方法{ {1}}

    WebView

    这不会触发页面重新加载,只会执行JavaScript。请注意页面完全加载后需要执行的操作。您可以通过以下代码获取此信息:

    mWebView.loadUrl('javascript:some... js... code...');
    

    有关详细信息,请参阅setWebViewClientonPageFinished

    另请注意,通过mWebView.setWebViewClient(new WebViewClient { @Override public void onPageFinished (WebView view, String url) { // here page is loaded } }); 调用转移到页面的代码不得包含换行符。所以你需要摆脱它们(通过String.replace左右)。

    添加 所以,最终的解决方案是:

    loadUrl

答案 1 :(得分:2)

我做了一个不同的方式,它很容易工作。我使用了window.external.notify(String message)。     在我的java中,我使用了webview.addJavascriptInterface(new JSInterface(),“external”);在我的JSInterface类中,我创建了一个函数public void notify(String messg).messg包含了我对javascript的响应。