Android WebView判定网页加载的错误

点击链接自动跳出微信在手机自带的浏览器中下载APK文件 需求分析 目前的APP基本都支持二维码扫描下载。由于微信现在是主流的聊天软件,90%的用户都是通过微信分享APP的,再从分享的链接下载apk/ios包。 但是微信会自动屏蔽含安装包文件下载的链接,导致用户在微信内打开下载链接或扫码识别皆无法打开下载页,无法在微信内下载app。提示“已停止访问网页”,故用户并不知道是被拦截了,都以为是链接有问题,就不知不觉地流失了。我相信这不是大家希望见到的... 阅读详情

一 前言

在WebView加载网页的过程中,有时会页面加载不出来的情况,如下:

错误

那么如何知道网页加载错误了呢?

二 解决方法

webview.webViewClient = object : WebViewClient() {
    override fun onPageFinished(view: WebView?, url: String?) {
        super.onPageFinished(view, url)
        Log.d(TAG, "onPageFinished: ")
    }

    override fun onReceivedError(
        view: WebView?,
        request: WebResourceRequest?,
        error: WebResourceError?
    ) {
        super.onReceivedError(view, request, error)
        Log.d(TAG, "onReceivedError: request= " + request.json())
        Log.d(TAG, "onReceivedError: error= " + error.json())
    }
}
webview.loadUrl("https://www.baidu.com/")

request输出:

{“a”:{“a”:“https://www.baidu.com/”,“b”:true,“c”:false,“d”:false,“e”:“GET”,“f”:{“User-Agent”:“Mozilla/5.0 (Linux; Android 11; sdk_gphone_x86_arm Build/RSR1.200819.001.A1; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/83.0.4103.106 Mobile Safari/537.36”,“Accept”:“text/html,application/xhtml+xml,application/xml;q\u003d0.9,image/webp,image/apng,/;q\u003d0.8,application/signed-exchange;v\u003db3;q\u003d0.9”,“Upgrade-Insecure-Requests”:“1”}}}

error输出:

{“a”:{“a”:-1,“b”:“net::ERR_CACHE_MISS”}}

/**
* 需要注意的是:与老版本不同,新版本已经针对所有的资源加载错误都会回调*(iframe, image, etc.), 不仅仅是加载的主页面
 */
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
    if (request.isForMainFrame()) {
        onReceivedError(view,
                error.getErrorCode(), error.getDescription().toString(),
                request.getUrl().toString());
    }
}

所以,通过以上监听,即可知道对应的错误内容,进而做相应的业务处理。

三 常见的错误案例分析

1.错误:ERR_UNKNOWN_URL_SCHEME

复现条件:打开百度新闻资讯网页,并点击评论

在这里插入图片描述

载体现象
App内置WebView报错:ERR_UNKNOWN_URL_SCHEME
UC、华为浏览器停留在当前页面状态
Chrome浏览器跳转到百度APP内部打开

来看一下页面加载shouldOverrideUrlLoading 中回调request输出:

{“a”:{“a”:“baiduboxapp://v1/easybrowse/hybrid?upgrade\u003d1\u0026type\u003dhybrid\u0026tpl_id\u003dlanding_app.html\u0026newbrowser\u003d1\u0026style\u003d%7B%22toolbaricons%22%3A%7B%22tids%22%3A%5B%224%22%2C%221%22%2C%222%22%2C%223%22%5D%2C%22menumode%22%3A%222%22%2C%22actionBarConfig%22%3A%7B%22extCase%22%3A%220%22%7D%7D%7D\u0026slog\u003d%7B%22from%22%3A%22feed%22%7D\u0026context\u003d%7B%22nid%22%3A%22news_9777178803801641010%22%7D\u0026ch_url\u003dhttps%3A%2F%2Fmbd.baidu.com%2Fnewspage%2Fdata%2Flandingreact%3FpageType%3D2%26nid%3Dnews_9777178803801641010%26uk%3D%26sourceFrom%3DlandingShare\u0026commentInfo\u003d%7B%22topic_id%22%3A1066000039731532%2C%22opentype%22%3A2%7D\u0026logargs\u003d%7B%22source%22%3A%221020283l%22%2C%22channel%22%3A%221020283m%22%7D\u0026needlog\u003d1”,“b”:false,“c”:true,“d”:false,“e”:“GET”,“f”:{“Accept”:“text/html,application/xhtml+xml,application/xml;q\u003d0.9,image/avif,image/webp,image/apng,/;q\u003d0.8,application/signed-exchange;v\u003db3;q\u003d0.9”,“Referer”:“https://mbd.baidu.com/newspage/data/landingpage?s_type\u003dnews\u0026dsp\u003dwise\u0026context\u003d%7B%22nid%22%3A%22news_9777178803801641010%22%7D\u0026pageType\u003d1\u0026n_type\u003d1\u0026p_from\u003d-1\u0026innerIframe\u003d1”,“Upgrade-Insecure-Requests”:“1”}}}

可以发现协议不是http类开头,而是百度自己定义的"baiduboxapp"。因此,不做处理,当然是识别不了的。

2.实现UC、华为浏览器处理的效果——>无视

webview.webViewClient = object : WebViewClient() {
            override fun shouldOverrideUrlLoading(
                view: WebView?,
                request: WebResourceRequest?
            ): Boolean {
                Log.d(TAG, "shouldOverrideUrlLoading: ${request.json()}")
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                    Log.d(TAG, "shouldOverrideUrlLoading: url->${request?.url}")
                    if (view != null && request?.url?.toString() != null) {
                        if (request.url.toString().startsWith("http")) {
                            view.loadUrl(request.url.toString())
                        }
                return true
            }

3.如何实现Chrome浏览器处理的效果——>能跳转

假定这是百度适配Chrome的效果,而不是Chrome主动去适配百度的代码页面,那么说明客户端的WebView也是能做到这样效果的。

基于此,我们来urldecode一下协议内容来看看request有什么特殊:

baiduboxapp://v1/easybrowse/hybrid?upgrade=1&type=hybrid&tpl_id=landing_app.html&newbrowser=1&style={“toolbaricons”:{“tids”:[“4”,“1”,“2”,“3”],“menumode”:“2”,“actionBarConfig”:{“extCase”:“0”}}}&slog={“from”:“feed”}&context={“nid”:“news_9777178803801641010”}&ch_url=https://mbd.baidu.com/newspage/data/landingreact?pageType=2&nid=news_9777178803801641010&uk=&sourceFrom=landingShare&commentInfo={“topic_id”:1066000039731532,“opentype”:2}&logargs={“source”:“1020283l”,“channel”:“1020283m”}&needlog=1

整体来看,仍旧是符合URI规则的。这样的话就可以考虑使用Intent处理的方式了。

webview.webViewClient = object : WebViewClient() {
    override fun shouldOverrideUrlLoading(
        view: WebView?,
        request: WebResourceRequest?
    ): Boolean {
        Log.d(TAG, "shouldOverrideUrlLoading: ${request.json()}")
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            Log.d(TAG, "shouldOverrideUrlLoading: url->${request?.url}")
            if (view != null && request?.url?.toString() != null) {
                if (request.url.toString().startsWith("http")) {
                    view.loadUrl(request.url.toString())
                } else {
                    try {
                        Log.d(TAG, "shouldOverrideUrlLoading: 开始跳转")
                        startActivity(Intent(Intent.ACTION_VIEW, request.url))
                    } catch (e: Exception) {
                        Log.d(TAG, "shouldOverrideUrlLoading: ${e.json()}")
                    }
                }
            }
        }

        return true
    }

运行查看效果如下:
在这里插入图片描述

从结果来看,能跳转至百度的App,假定成立。
也就是针对非http协议地址的情况,可使用 startActivity(Intent(Intent.ACTION_VIEW, request.url)) 之类来进行协议内容处理。

四 总结

最后,根据自家业务来定协议并处理,毕竟不是谁都愿意自家用户跳出自家App的。

共同学习、探讨

Android的WebView加载网页的几种方式及网络异常处理 Android的webview加载本地html、assert内html和收集URL 2013年4月16日联系商易上海电子商务网站建设,了解更多   1 //打开本包内asset目次下的test.html文件 2 wView.loadUrl(" file:///android_asset/test.html "); 3 //打开本地s 阅读详情

相关推荐

(3万字深度解析)Kaggle《房价预测:高级回归技巧》详解复现攻略

在这篇教程式文章中,我们从零开始完成了 Kaggle《房价预测:高级回归技巧》比赛的复现工作,涵盖了数据预处理、特征工程、模型训练、调优、解释和融合的完整流程。深入理解数据:阅读数据描述,结合常识对每个特征作出合理处理(如缺失值填充’None’表示无此设施 、异常值剔除 等)。对目标和偏态特征进行对数变换,使分布更平滑,从而更好满足模型假设并提升准确度。特征工程:我们创造了总面积、总浴室等新特征,整合信息提高模型可学习性。

qq_38334677的博客 1774

百度定位V3.3的定位简单实现

今天,将百度定位的V3.3的版本的功能做了一个简单的实现。顺带就写下来,为以后自己的温故和随时调用做一个准备。也就是个简单的实现,对于在精度上和坐标的切换问题上,暂且不做深入的研究探讨。        首先将结果图上一下:      于是,开始说几个重点的地方,首先需要加载Libs库内的几个文件。有点讲究,这个。 加载对了jar包还不够的,so文件也必须加载到armeable

vaecer 9580

Qwen3-Omni-30B-A3B-Instruct微调指南:如何打造专属智能博物官(附数据集)

本文详细介绍了如何对Qwen3-Omni-30B-A3B-Instruct模型进行微调,以打造专业的智能博物官。指南涵盖了从理解模型架构优势、构建高质量文博数据集,到使用LLaMA-Factory进行实战微调、效果评估与部署优化的完整流程,并提供了关键的环境配置与性能优化建议,帮助开发者在垂直领域高效定制专属AI助手。

weixin_29096377的博客 1144

微信内置浏览器无法下载文件应用的解决方案

在我们使用微信营销的时候,很容易碰到推广连接在微信内无法打开或无法下载app的情况。首先说一下推广域名在微信内无法打开的问题,这是因为微信将您的域名拦截导致,所以在微信内打开提示“已停止访问”。其次再说一下为什么微信内置浏览器不提示前往Safari打开,这是因为缺少了一个微信跳转外部浏览器的接口,如果我们在代码中加入该接口,那么就可以实现ios系统提示前往Safari打开下载页,安卓系统则自动跳出...

crayydog743的博客 1万+

DOA估计算法从原理到仿真——CBF、Capon、MUSIC算法

从原理出发理解并实现经典的DOA估计算法

m0_55845774的博客 1万+

Shell数学计算(算术运算,加减乘除运算)

声明: 本篇博客的学习途径主要为以下网站和课堂讲解,发博客目的仅为学习使用,在该博客的基础上做了一定程序的简略和修改。 参考博客 : 原文链接:http://c.biancheng.net/shell/ Shell数学计算Shell数学计算数学计算命令对整数进行数学运算: (()) / let / $[] /exprShell (())Shell let命令bc命令:一款数学计算器在 Shell 中使用 bc 计算器 Shell数学计算 默认情况下,Shell 不会直接进行算术运算,而是把+两边的数据(数

AKUANer的博客 2万+

dosbox代码框如何变大以及虚拟盘的建立

1.首先是代码框怎么变大,找到dosbox的option文件,在里面添加代码,如下图所示。 2.怎么让代码自动运行到masm那一步以及创建虚拟盘,也是和第一步一样找到option文件,翻到最后,具体步骤如下。 以上内容均是我从王爽老师那里看来然后总结了一下,有不好的地方,请见谅!下面是教程链接:baiduboxapp://swan/y1lpwNoOyVpW33XOPd72rzN4aUS43Y3O/pages/blog/index?blogId=124264604&_b

LinlinBug的博客 5018

手把手教你搭建离线语音助手:FunASR+DeepSeek+TTS保姆级教程

本文详细介绍了如何利用FunASR、DeepSeek和TTS技术搭建离线语音助手系统。从环境配置、模型部署到唤醒词检测优化、语音识别与语义理解联调,再到语音合成与系统集成,提供全链路实战教程。特别适合智能家居控制、企业内部知识问答等需要数据隔离的场景,实现高响应、低延迟的离线语音交互体验。

weixin_30316097的博客 475

发布到百度平台遇到的问题

一、签名文件: 以 .jks 后缀结尾 二、Android7.0中APK Signature Scheme v2,v1 的区别 V1:应该是通过ZIP条目进行验证,这样APK 签署后可进行许多修改 - 可以移动甚至重新压缩文件。 V2:验证压缩文件的所有字节,而不是单个 ZIP 条目,因此,在签名后无法再更改(包括 zipalign)。正因如此,现在在编译过程中,我们将压缩、调整和签署合并成一步完成

戴boy的博客 1313

硬件知识点-----SPI串联电阻、振铃、过冲

电阻取值,没有公式,一被传输线的特征阻抗为50欧姆左右,而TTL电路输出电阻大桃为13欧姆左右,在源端串一个33姆,大致和50相当,这样就可以柳制从终端反射回来的倍号,防止再次反射。传输时间tp=L/V,其中L是导线长度,V是电磁波在电路板中的传输速度V=C/sqrDk,其中Dk是光速衰减因子,对于电路板而言是铜线,Dk=4电磁波在电路板中的速度都是慢于光速的。实际上串联多大的电阻与传输线的阻抗有关,为了保证阻抗的连续性,如果传输线的特性阻抗 Z0与驱动源的输出阻抗 Zd不匹配,会引发信号的反射。

贾saisai的博客 2719

Android WebView判定网页加载的错误,看完这一篇就够了

后记总结一下这三次面试下来我的经验是:一定不要死记硬背,要理解原理,否则面试官一深入就会露馅!代码能力一定要注重,尤其是很多原理性的代码(之前两次让我写过Node中间件,Promise.all,双向绑定原理,被虐的怀疑人生)!尽量从面试官的问题中表现自己知识的深度与广度,让面试官发现你的闪光点!多刷面经!

2401_84091110的博客 1936

化工仿真软件:gPROMS二次开发_(1).gPROMS基础知识

在gPROMS中,模型是通过定义变量、参数和方程来创建的。模型可以是简单的单元操作,如换热器、反应器,也可以是复杂的系统,如整个化工流程。变量是模型中表示状态或输出的量。在gPROMS中,变量需要显式定义其类型和单位。# 定义变量VAR# 温度变量,单位为K# 压力变量,单位为Pa# 组分摩尔分数,数组变量参数是模型中表示常量或初始条件的量。参数同样需要定义其类型和单位。# 定义参数PAR# 理想气体常数,单位为J/(mol·K)# 反应器体积,单位为m^3# 初始摩尔数。

kkchenjj的博客 617

Android WebView判定网页加载的错误,flutter插件

webview.webViewClient = object : WebViewClient() { override fun onPageFinished(view: WebView?, url: String?) { super.onPageFinished(view, url) Log.d(TAG, "onPageFinished: ") } override fun onReceivedError( view: WebView?, request: WebResourceRequest?, err.

m0_64603776的博客 1436

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Android WebView判定网页加载的错误,10天拿到阿里Android岗offer

所以,通过以上监听,即可知道对应的错误内容,进而做相应的业务处理。

2401_83621784的博客 1435

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Android WebView判定网页加载的错误,android5.0系统下载手机版

webview.loadUrl(“https://www.baidu.com/”) request输出: {“a”:{“a”:“www.baidu.com/",“b”:true,… (Linux; Android 11; sdk_gphone_x86_arm Build/RSR1.200819.001.A1; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/83.0.4103.106 Mobile Safari/537.36”,“

m0_64319298的博客 1316

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Android webview加载网页

webview尝试(一)在线加载网页(例百度)webview布局很简单xml如下<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_paren...

haiyinshushe的博客 1万+

Android WebView加载网页失败异常处理

开发过程中会遇到WebView加载失败的时候,会出现404、500、找不到网页等错误,页面显示系统默认的错误界面。系统默认界面难看,而且也会暴露网页地址不安全。所以我们需要对WebView加载失败或错误进行处理,自定义一个统一样式来加载失败的界面。 网页加载失败图 解决方案 我们可以自定义一个View用来展示加载失败的界面,也可以写一个错误展示的 Html让 WebView加载等。这里我...

qijingwang的博客 1万+

Android Webview 详解

Android去调用JS的代码JS去调用Android的代码二者沟通的桥梁是WebView通过WebView的loadUrl()通过WebView的evaluateJavascript()通过WebView的addJavascriptInterface()进行对象映射通过 WebViewClient 的shouldOverrideUrlLoading ()方法回调拦截 url。

weixin_43700867的博客 6484
上一篇: Android NoteX Q2: 如何在通知栏下拉时暂停视频?
下一篇: Android NoteX Q3:如何通过图片获取指定大小的bitmap?
ganshenml
博客等级 码龄16年 445粉丝 108原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ganshenml

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值