我在服务器上托管了一些HTML5 / javascript文件。当在HTML5页面上单击按钮时,将调用javascript函数。我想在调用函数时监听并获取函数返回的json。以前我在设备上打开一个端口,但这似乎不适用于Android 3.0。我听说您可以使用外部接口来收听javascript调用,但我不知道如何实现它。
答案 0 :(得分:3)
要使用外部接口,您需要在WebView中运行您的站点。以下解决方案暗示了什么
要注册您的界面,您需要在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
此外,不要忘记在所有
启用JavaScriptmWebView.getSettings().setJavaScriptEnabled(true);
何时,如何将此代码嵌入外部页面(我暗示您无法访问外部JS代码)...要在页面上下文中执行任意代码,您可以使用loadUrl方法{ {1}}
WebView
这不会触发页面重新加载,只会执行JavaScript。请注意页面完全加载后需要执行的操作。您可以通过以下代码获取此信息:
mWebView.loadUrl('javascript:some... js... code...');
有关详细信息,请参阅setWebViewClient和onPageFinished
另请注意,通过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的响应。