从java–Android收听javascript函数调用

从java–Android收听javascript函数调用,第1张

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

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

解决方法:

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

>你知道要拦截的所有函数名称,以及……
>这些函数属于Js代码的公共范围.

要注册接口,需要在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代码)…要在页面上下文中执行任意代码,您可以使用WebVIEw的loadUrl方法

mWebVIEw.loadUrl('JavaScript:some... Js... code...');

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

mWebVIEw.setWebVIEwClIEnt(new WebVIEwClIEnt {    @OverrIDe    public voID onPageFinished (WebVIEw vIEw, String url) {        // here page is loaded    }});

有关详细信息,请参见setWebViewClient和onPageFinished

另请注意,通过loadUrl调用传输到页面的代码不得包含换行符.所以你需要摆脱它们(通过String.replace左右).


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

String wrapFuncCode = "function wrapFunc ...... "; // or maybe place it in resources?mWebVIEw.addJavaScriptInterface(new FunctionCallinterceptor(), 'Interceptor');mWebVIEw.getSettings().setJavaScriptEnabled(true);mWebVIEw.setWebVIEwClIEnt(new WebVIEwClIEnt {    @OverrIDe    public voID onPageFinished (WebVIEw vIEw, String url) {       // inject wrapper       // don't forget to remove newline chars       mWebVIEw.loadUrl("JavaScript:" + wrapFuncCode.replace('\n', ''));       // wrap all the functions needed       String[] funcToWrap = new String[] { 'myFunc1', ... };       for(String f : funcToWrap) {           mWebVIEw.loadUrl("JavaScript:wrapFunc('" + f + "myFunction');");         }      }});
总结

以上是内存溢出为你收集整理的从java – Android收听javascript函数调用全部内容,希望文章能够帮你解决从java – Android收听javascript函数调用所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1105700.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存