android 与 js 交互

js->java 通过addjavascriptinterface(大家都知道)

java->js 通过loadurl("javascript:alert('test!!!')")(大家也都知道)

教大家一个不知道的方法,java可以调用js里的方法并返回值 或者 获得js里面的变量值。(类似于ios平台里的方式)


类实现

public static class MyWebView extends WebView {

 

        public MyWebView(Context context) {

            super(context);

        }

 

        public String stringByEvaluatingJavaScriptFromString(String script) {

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {

                try {

                    Field mp = WebView.class.getDeclaredField("mProvider");

                    mp.setAccessible(true);

                    Object webViewObject = mp.get(this);

                    Field wc = webViewObject.getClass().getDeclaredField("mWebViewCore");

                    wc.setAccessible(true);

                    Object webViewCore = wc.get(webViewObject);

                    Field bf = webViewCore.getClass().getDeclaredField("mBrowserFrame");

                    bf.setAccessible(true);

                    Object browserFrame = bf.get(webViewCore);

                    Method stringByEvaluatingJavaScriptFromString = browserFrame.getClass()

                            .getDeclaredMethod("stringByEvaluatingJavaScriptFromString",

                                    String.class);

                    stringByEvaluatingJavaScriptFromString.setAccessible(true);

                    Object obj_value = stringByEvaluatingJavaScriptFromString.invoke(

                            browserFrame, script);

                    return String.valueOf(obj_value);

                } catch (Exception e) {

                    Log.e("!!!""stringByEvaluatingJavaScriptFromString", e);

                }

                return null;

            } else {

                try {

                    Field[] fields = WebView.class.getDeclaredFields();

                    // webview取到webviewcore

                    Field field_webviewcore = WebView.class.getDeclaredField("mWebViewCore");

                    field_webviewcore.setAccessible(true);

                    Object obj_webviewcore = field_webviewcore.get(this);

                    // webviewcore取到BrowserFrame

                    Field field_BrowserFrame = obj_webviewcore.getClass().getDeclaredField(

                            "mBrowserFrame");

                    field_BrowserFrame.setAccessible(true);

                    Object obj_frame = field_BrowserFrame.get(obj_webviewcore);

                    // 获取BrowserFrame对象的stringByEvaluatingJavaScriptFromString方法

                    Method method_stringByEvaluatingJavaScriptFromString = obj_frame.getClass()

                            .getMethod("stringByEvaluatingJavaScriptFromString", String.class);

                    // 执行stringByEvaluatingJavaScriptFromString方法

                    Object obj_value = method_stringByEvaluatingJavaScriptFromString.invoke(

                            obj_frame,

                            script);

                    // 返回执行结果

                    return String.valueOf(obj_value);

                } catch (Exception e) {

                    Log.e("!!!""stringByEvaluatingJavaScriptFromString", e);

                }

                return null;

            }

        }

}

 

调用方式

MyWebView webView = new MyWebView(this);

        webView.getSettings().setJavaScriptEnabled(true);

        webView.loadData(

                "<html><body><script type=\"text/javascript\">var myvalue = 'jjjjj';function fun1(){return 'function return test';} document.write('123');</script></body></html>",

                "text/html""UTF-8");

        webView.setWebViewClient(new WebViewClient() {

            @Override

            public void onPageFinished(WebView view, String url) {

                Toast.makeText(

                        MainAct.this,

                        ((MyWebView) view)

                                .stringByEvaluatingJavaScriptFromString("myvalue"),

                        Toast.LENGTH_LONG)

                        .show();

                super.onPageFinished(view, url);

            }

        });

 

参考链接:http://stackoverflow.com/questions/6456994/exist-stringbyevaluatingjavascriptfromstring-for-android

                           http://blog.sina.com.cn/s/blog_67ac56e70101ajlp.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值