咱们先看下报错结果图:

我这边是华为荣耀7i手机才出现这个情况,总结得出结论android6.0以上加载自定义scheme会报错如下,6.0以下貌似不会

三星和模拟器没有可以直接加载这个url

,网页出来后才出现这个错误页面,原因是加载的这个url内部有JavaScript代码里面包含自定义scheme代码导致加载这个JavaScript代码里面的自定义scheme的时候就报错无法加载。

下面的加载的url地址:

https://www.yunzhijia.com/pubacc/public/data/19/06/26/ewsqZbAD.html?p=XT-1088eb69-d338-4779-9298-77d89b8be806&f=ewsqZbAD&success=false&errorMsg=

看下报错日志:

[INFO:CONSOLE(62)] "Mixed Content:
The page at 'https://www.yunzhijia.com/pubacc/public/data/19/06/26/ewsqZbAD.html?p=XT-1088eb69-d338-4779-9298-77d89b8be806&f=ewsqZbAD&success=false&errorMsg='
was loaded over HTTPS, but requested an insecure resource 'xuntong:getPersonInfo:1:%7B%7D'.
This content should also be served over HTTPS.", source: https://do.yunzhijia.com/pub/js/qingjs.js (62)

看最后一句https://do.yunzhijia.com/pub/js/qingjs.js这是无法加载的JavaScript源码:

我先说下我这边情况,我这边加载的https网址,但是https网址里面携带有自定义的scheme属性JavaScript文件,android中默认加载http和https协议,其他自定义协议规定为不安全默认不让加载。咱们可以看下webview的报错提示:

chromium: [INFO:CONSOLE(1)] "Mixed Content: The page at 'https://www.yunzhijia.com/pubacc/public/data/19/06/26/ewsqZbAD.html?p=XT-1088eb69-d338-4779-9298-77d89b8be806&f=ewsqZbAD&success=false&errorMsg=' was loaded over HTTPS, but requested an insecure image 'http://do.yunzhijia.com/microblog/filesvr/5d13288c90144e08bfcd6496'. This content should also be served over HTTPS.", source: https://www.yunzhijia.com/pubacc/public/data/19/06/26/ewsqZbAD.html?p=XT-1088eb69-d338-4779-9298-77d89b8be806&f=ewsqZbAD&success=false&errorMsg= (1)

划重点了:计解决办法如下

遇到这种情况我们有两种解决办法

第一种:就是在shouldOverrideUrlLoading方法中设置为外部浏览器打开(体验差不推荐)

第二种:就是在shouldOverrideUrlLoading方法中拦截自定义scheme

如下代码我才用的第二种方案:

webview.setWebViewClient(new WebViewClient() {@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {Uri uri = Uri.parse(url);LogUtils.e("打印Scheme", uri.getScheme() + "==" + url);if (!"http".equals(uri.getScheme()) || !"https".equals(uri.getScheme())) {return false;} else {view.loadUrl(url);return false;}}@Overridepublic void onPageFinished(WebView view, String url) {super.onPageFinished(view, url);}});webview.loadUrl(url);

咱们再来看下效果:

但是当我们点击进去JavaScript里面带有自定义scheme的js页面发现点击是不了,报了个错:

I/chromium: [INFO:CONSOLE(2)] "tap事件:ours.getNS().saveForm(ours.getNS().afterSaveForm)不能被执行,", source: https://www.formtalk.net/res_common/ours_phone_form.min.js?V=1.1.2.6 (2)
I/chromium: [INFO:CONSOLE(2)] "TypeError: Cannot read property 'getItem' of null", source: https://www.formtalk.net/res_common/ours_phone_form.min.js?V=1.1.2.6 (2)

说的是JavaScript里面的js方法不能被执行,什么原因呢?

搜了下找到了个可行的方法

//允许android调用javascript
webSettings.setDomStorageEnabled(true);

再此感谢原博主博主链接

然后点击JavaScript页面生效了。

最后贴出完整代码:

package com.yhsh.wallet.ui;import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.TextView;import com.yhsh.mobile.basic.util.LogUtils;
import com.yhsh.mobile.common.base.BaseActivity;
import com.yhsh.mobile.uiwidget.widget.CustomWebview;/*** 暂定为集团理财** @author DELL*/
public class H5Activity extends BaseActivity {@Overridepublic int getLayoutResId() {return com.yhsh.mobile.login.R.layout.agreement_dialog;}@Overridepublic void initView(Bundle savedInstanceState) {String title = getIntent().getStringExtra("title");String url = getIntent().getStringExtra("url");String welcome = getIntent().getStringExtra("welcome");Toolbar toolbar = findViewById(com.yhsh.mobile.login.R.id.toolbar);TextView tvTitle = findViewById(com.yhsh.mobile.login.R.id.toolbar_title);tvTitle.setText(title);CustomWebview wvAgreement = findViewById(com.yhsh.mobile.login.R.id.wv_agreement);setSupportToolbar(toolbar, v -> {if (wvAgreement.canGoBack()) {wvAgreement.goBack();} else {if (!TextUtils.isEmpty(welcome)) {//当是欢迎页面进来的时候,点击返回直接进入首页startActivity(new Intent(this, SplashActivity.class));}finish();}});WebSettings webSettings = wvAgreement.getSettings();webSettings.setSupportZoom(true);webSettings.setJavaScriptEnabled(true);//允许android调用javascriptwebSettings.setDomStorageEnabled(true);webSettings.setJavaScriptCanOpenWindowsAutomatically(true);webSettings.setBuiltInZoomControls(true);webSettings.setAllowFileAccess(true);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {webSettings.setAllowFileAccessFromFileURLs(true);webSettings.setAllowUniversalAccessFromFileURLs(true);}webSettings.setUseWideViewPort(true);webSettings.setLoadWithOverviewMode(true);webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);}DisplayMetrics metrics = new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(metrics);int mDensity = metrics.densityDpi;if (mDensity == 240) {webSettings.setDefaultZoom(WebSettings.ZoomDensity.FAR);} else if (mDensity == 160) {webSettings.setDefaultZoom(WebSettings.ZoomDensity.MEDIUM);} else if (mDensity == 120) {webSettings.setDefaultZoom(WebSettings.ZoomDensity.CLOSE);} else if (mDensity == DisplayMetrics.DENSITY_XHIGH) {webSettings.setDefaultZoom(WebSettings.ZoomDensity.FAR);} else if (mDensity == DisplayMetrics.DENSITY_TV) {webSettings.setDefaultZoom(WebSettings.ZoomDensity.FAR);}wvAgreement.setWebViewClient(new WebViewClient() {@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {Uri uri = Uri.parse(url);LogUtils.e("打印Scheme", uri.getScheme() + "==" + url);if (!"http".equals(uri.getScheme()) || !"https".equals(uri.getScheme())) {return false;} else {view.loadUrl(url);return false;}}@Overridepublic void onPageFinished(WebView view, String url) {super.onPageFinished(view, url);}});wvAgreement.loadUrl(url);}
}

最终结论经过我后期代码测试发现最终上面问题解决办法:

说简单点直接设置setWebViewClient重写shouldOverrideUrlLoading方法即可

 @Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {return super.shouldOverrideUrlLoading(view, url);}

请看最终代码如下:直接用下面这个原生简单的webview就可以正常加载自定义scheme和JS事件点击了

package com.xiayiye.mytestapp;import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.TextView;public class MainActivity extends Activity {private WebView wvInternetPage;private TextView tvTittle;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);wvInternetPage = findViewById(R.id.wv_internet_page);tvTittle = findViewById(R.id.tv_tittle);WebViewOption();}private void WebViewOption() {WebSettings settings = wvInternetPage.getSettings();settings.setJavaScriptEnabled(true);//允许打开js新窗口settings.setJavaScriptCanOpenWindowsAutomatically(true);settings.setDomStorageEnabled(true);wvInternetPage.setWebViewClient(new MyWebViewClient());wvInternetPage.loadUrl("https://www.yunzhijia.com/pubacc/public/data/19/06/26/ewsqZbAD.html");
//        wvInternetPage.loadUrl("https://www.baidu.com");}private class MyWebViewClient extends WebViewClient {@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {return super.shouldOverrideUrlLoading(view, url);}@Overridepublic void onPageFinished(WebView view, String url) {tvTittle.setText(view.getTitle());super.onPageFinished(view, url);}}@Overridepublic void onBackPressed() {if (wvInternetPage.canGoBack()) {wvInternetPage.goBack();return;}super.onBackPressed();}
}

Android开发之WebView加载自定义scheme报错net::ERR_UNKNOWN_URL_SCHEME(附带源码标题下面可点击下载)相关推荐

  1. Android开发之WebView加载HTML源码包含转义字符实现富文本显示的方法

    老套路先看效果图: WebView加载带有转移字符的HTML源码 再看转义后的字符的效果图: 先看WebView加载HTML源码的方法如下: webview.loadDataWithBaseURL(n ...

  2. Android开发之WebView加载html数据去除Webview滚动条的方法

    老套路看图: 这是通过webview加载HTML源码显示的网页:加载方法如下: webview.loadDataWithBaseURL(null, htmlData, "text/html& ...

  3. Flutter开发之WebView加载网页(24)

    WebView 是一个重要的控件,它用来加载网页.HTML.文件等.它的使用也很简单.今天就学习下Flutter下的WebView如何加载网页. 使用教程地址:https://pub.flutter- ...

  4. Android开发之Glide加载U盘音乐的专辑图片的方法 | Glide加载content:图片 | Glide加载内容提供者 | Glide加载MP3专辑图片 | Glide加载音乐专辑图片

    老套路先(献)上图 1.说下核心,Glide提供了直接加载内容提供者的方法用于显示图片 2.Glide加载的图片的格式如下 content://com.yhsh.app.media.server.us ...

  5. android开发之Glide加载图片之url转bitmap的方法

    直接看代码: /*** 自己写的加载网络图片的方法* img_url 图片的网址*/public void initNetWorkImage(final String imgUrl, final Ac ...

  6. Android开发之SDK开发获取资源id报错的问题

    我们在开发SDK的时候有时候需要兼容Eclipse版本和AS版本,AS版本就不说了没多大问题,主要是Eclipse版本会有问题.当开发之使用Eclipse开发的时候接入jar包(AS打包成aar,解压 ...

  7. 【janino】janino 加载自定义函数报错 CompileException xxx cannot be invoked in static context

    1.背景 代码如下 @Testpublic void janinoPerformanceTest4() throws Exception {String rule = "(inValues( ...

  8. 【janino】janino 加载自定义函数报错CompileException Expression bytesIn is not an rvalue

    1.背景 代码如下 @Testpublic void janinoPerformanceTest4() throws Exception {String rule = "(inValues( ...

  9. android动态设置错误页面,Android中替换WebView加载网页失败时的页面

    我们用webView去请求一个网页链接的时候,如果请求网页失败或无网络的情况下,它会返回给我们这样一个页面,如下图所示: 上面这个页面就是系统自带的页面,你觉得是不是很丑?反正小编本人觉得非常丑,很难 ...

最新文章

  1. 白话 Python 的函数式编程
  2. 【译】Typeof null 的历史
  3. java高分面试指南:java定时删除文件
  4. MachineLearning(12)- RNN-LSTM-tf.nn.rnn_cell
  5. 接口不能被实例化的吗?接口引用是什么?
  6. iOS:using Segue in Popover
  7. 2018上半年掘金微信群日报优质文章合集:前端篇
  8. java jdom dom4j_实例分析jdom和dom4j的使用和区别
  9. C/C++整数除法以及保留小数位的问题
  10. new ext.toolbar控制按钮间距_消防控制室现场验收存在问题图解
  11. 关于阿里云主机数据丢失问题,是常态还是个例?如何保障数据安全?...
  12. 不间断:即使被刺破,新的软电子设备也不会损坏
  13. 关于C语言函数的简单理解
  14. 强化学习:不用给AI一个支点,他也能想办法撬起地球
  15. uni-app开发经验分享十九: uni-app对接微信小程序直播
  16. 比 996 更可怕的是职场 PUA
  17. ARMv7 Processor modes
  18. 采编系统服务器架构,遂宁日报新闻采编系统的设计与实现
  19. python爬虫-----学习bs,爬取丁香园特定帖子的所有回复内容
  20. 输出1900年到2050年之间是闰年的年份。判断闰年的条件是能被4整除但不能同时被100整除,或者能被400整除,则这一年是闰年。

热门文章

  1. 计算机学习的基本形式,电脑基础知识学习方法
  2. python 修改json文件的value值,利用python修改json文件的val
  3. python切换ip群发邮件_通过 python 把家里路由的 IP 发邮件给自己
  4. qt 关闭窗口的槽函数_勇哥的VC++应用框架学习之QT(1) 信号槽、按钮控件、opencv读取显示图片...
  5. mysql noinstall_免安装版MySql安装与配置
  6. anki模板_梁宝川:如何导入,导出anki笔记?
  7. 20000赫兹的声音试听下载_好听又不贵,DLC球顶双面镀铍动圈:七赫兹i99
  8. 控制台下载vue_DubboAdmin管理控制台
  9. python的0基础入门语法_学习小结(1)
  10. 2018年11月12日