android WebView问题及解决方案合集

一、net::ERR_UNKNOWN_URL_SCHEME

见:https://blog.csdn.net/qugengting/article/details/85129831

二、设置跨域:

try {
            if (Build.VERSION.SDK_INT >= 16) {
                Class<?> clazz = webSetting.getClass();
                Method method = clazz.getMethod(
                        "setAllowUniversalAccessFromFileURLs", boolean.class);//利用反射机制去修改设置对象
                if (method != null) {
                    method.invoke(webSetting, true);//修改设置
                }
            }
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }

三、https访问http图片失败或是反过来:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            webSetting.setMixedContentMode(android.webkit.WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
        }

四、这个其实是整个android9.0以上的网络访问问题:不允许直接访问Http:

新增xml文件夹,新增network_security_config.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>

然后AndroidManifest.xml当中,application设置:android:networkSecurityConfig="@xml/network_security_config"

五、A WebView method was called on thread 'JavaBridge'. All WebView methods must be called...

这个问题发现Android 9以上会出现,解决方法是"@JavascriptInterface"注解的方法必须指定在UI线程执行,将原来方法里的代码放入run里面执行:

MainActivity.this.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    //TODO
                }
            });

 

基本设置:

    protected void initWebView() {
        webView.getSettings().setJavaScriptEnabled(true);
//        webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
        //优先使用网络
        webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
        //将图片调整到适合webview的大小
        webView.getSettings().setUseWideViewPort(true);
        //支持内容重新布局
        webView.getSettings().setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
        //支持自动加载图片
        webView.getSettings().setLoadsImagesAutomatically(true);
        //当webview调用requestFocus时为webview设置节点
        webView.getSettings().setNeedInitialFocus(true);
        //自适应屏幕
        webView.getSettings().setUseWideViewPort(true);
        webView.getSettings().setLoadWithOverviewMode(true);
        //开启DOM storage API功能(HTML5 提供的一种标准的接口,主要将键值对存储在本地,在页面加载完毕后可以通过 javascript 来操作这些数据。)
        webView.getSettings().setDomStorageEnabled(true);
        //支持缩放
        webView.getSettings().setBuiltInZoomControls(true);
        webView.getSettings().setSupportZoom(true);

        //允许webview对文件的操作
        webView.getSettings().setAllowFileAccess(true);
        webView.getSettings().setAllowFileAccessFromFileURLs(true);
        webView.getSettings().setAllowUniversalAccessFromFileURLs(true);

        webView.requestFocusFromTouch();
    }

设置返回键效果:

        webView.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                if (event.getAction() == KeyEvent.ACTION_DOWN) {
                    if (keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack()) { // 表示按返回键时的操作
                        webView.goBack(); // 后退
                        // webview.goForward();//前进
                        return true; // 已处理
                    }
                }
                return false;
            }
        });

跳转会弹出浏览器APP选择框:

解决方法:添加setWebViewClient监听事件:

        webView.setWebViewClient(new WebViewClient() {

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                //webView.loadUrl(url);
                //return true;
                return false;
            }

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
                return true;
            }

        });

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值