android WebView 注入js 几种方式

2020-08-16 16:09:30

参考地址 android WebView 注入js 几种方式

有时我们开发中需要将js 注入到我们本地,有可能你会说,放在Web不就可以了吗,的确,但是需求就是这样的

通过流的形式注入

 @SuppressLint("ObsoleteSdkInt")
    public void onJsLocal() {
        StringBuilder builder = new StringBuilder(getJS(this, "qqq.js"));
        if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) {
            agentWeb.getWebCreator().getWebView() .loadUrl("javascript:" + builder.toString());
        } else {
            agentWeb.getWebCreator().getWebView().evaluateJavascript(builder.toString(), new ValueCallback<String>() {
                @Override
                public void onReceiveValue(String value) {
                    Log.i("onReceiveValue", value);
                }
            });
        } 
    }

第二种 通过文件加载

view.loadUrl("javascript:(function() { "
                                + " " //turns to red the background color
                                + " var script=document.createElement('script'); "
                                + " script.setAttribute('type','text/javascript'); "
                                + " script.setAttribute('src', 'http://192.168.12.2/assets/mathjax/jsBridge.js'); "
                                + " script.onload = function(){ "
                                + "  console.log('aaaaaaaa' ) ; "
                                + " }; "
                                + " document.getElementsByTagName('head')[0].appendChild(script); "
                                + "})()");

第三种,第二种有可能存在加载不成功的情况,我们可以拦截

 Map<String, String> map = new HashMap<>();
                                map.put("Access-Control-Allow-Origin", "*");
                                map.put("Access-Control-Allow-Headers", "Content-Type");
                                WebResourceResponse resourceResponse = new WebResourceResponse("application/javascript",
                                        "UTF-8", 200, "OK", map,
                                        getApplication().getAssets().open(JS_FILENAME));

注意由于注入是一个异步的操作,所以和js交互的过程有可能存在不顺畅的问题

可以采用

view.postDelay ...


  • 2019-03-06 11:24:19

    MySQL查看数据库表容量大小

    本文介绍MySQL查看数据库表容量大小的命令语句,提供完整查询语句及实例,方便大家学习使用。

  • 2019-03-13 09:38:11

    写入MySQL报错超出 max_allowed_packet 的问题

    MySQL会根据配置文件会限制server接受的数据包的大小。如果写入大数据时,因为默认的配置太小,插入和更新操作会因为 max_allowed_packet 参数限制,而导致失败。

  • 2019-03-15 15:28:33

    10分钟教你搭建自己的ngrok服务器

    内网穿透想必开发过微信的同志都很了解,大部分人选择网上寻找各种现成的,比如ngrok官网、ittun-ngrok、sunny-ngrok或者花生壳之类的。但是世界上没有免费的午餐,要不就是收费,要不就是免费但是偶尔会出现连接失败的问题(当然大多数时间是没有问题的)。

  • 2019-03-15 15:29:53

    丢弃花生壳,搭建自己的ngrok作为内网穿透服务器

    公司没有公网,公司在二级路由下面(就是服务商没有给独立IP,也无法动态获取公网IP),然而公司在开发程序的时候,如对接微信等需要返回数据,或者需要别人能访问我们网址,一般我们就只能购买花生壳内网穿透,但是在使用中发现速度慢,经常掉。所以搭建自己的ngrok服务器来保证内网穿透。

  • 2019-03-15 15:31:21

    内网穿透 ngrok 服务器和客户端配置

    ngrok 简介及作用 ngrok 是一款用 go 语言开发的开源软件,它是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。下图简述了 ngrok 的原理。

  • 2019-03-15 15:32:09

    内网打洞以及代码实现

    假设内网的多个ip或者同一ip的不同port,都要访问同一个(外网ip:port)。对NAT来说,从外网接收的包它的(srcIp:srcPort)==(serverIp,serverPort),它的dstIp==natIp,所以NAT只能用dstPort来决定把这个包转发给哪一个(内网Ip:port)