Android异常之"找不到网页, net::ERR_UNKOWN_URL_SCHEME"

通过网页跳转至App页面时,报错 “找不到网页, net::ERR_UNKOWN_URL_SCHEME”

解决方案:

webview.setWebViewClient(new WebViewClient(){

    // 如果应用程序想要离开当前WebView并处理url本身,则返回true,否则返回false。
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        // 以"http","https"开头的url在本页用webview进行加载,其他链接进行跳转
        if( url.startsWith("http:") || url.startsWith("https:") ) {
            return false;
        }
        Intent intent = new Intent();
        intent.setData(Uri.parse(url));
        startActivity(intent);
        //如果不需要其他对点击链接事件的处理返回true,否则返回false
        return true;
    }
})
<think>嗯,用户遇到了在Android 13的WebView中加载非HTTP/HTTPS链接时出现net::ERR_UNKNOWN_URL_SCHEME错误的问题。我需要先理解这个错误的原因。根据引用内容,这个错误通常是因为WebView无法识别非标准协议的URL,比如baiduyun://或者其他应用的自定义协议。这时候WebView不知道如何处理这些链接,就会报错。 首先,用户的问题是如何修复这个错误。根据引用中的信息,解决方案可能包括几个步骤。比如,检查URL协议是否是http或https,如果不是,可能需要启动对应的应用来处理。另外,可能需要设置WebViewWebViewClient,并重写shouldOverrideUrlLoading方法,在这里处理自定义协议。 接下来,我需要确认Android 13是否有特别的变化。虽然用户提到Android 13,但可能解决方案与之前的版本类似,但需要注意权限或API的变化。例如,从Android 12开始,可能需要更严格的包可见性限制,所以在启动其他应用时,可能需要声明<intent-filter>或者使用PackageManager来检查是否有应用可以处理该Intent。 然后,用户的代码示例中,引用2提到了设置UserAgent,这可能不是直接解决ERR_UNKNOWN_URL_SCHEME的方法,但可能在某些情况下有帮助。但根据引用3,正确的做法是处理shouldOverrideUrlLoading,拦截非http/https的请求,并启动相应的Activity。 因此,步骤可能包括: 1. 检查WebView的设置,确保正确处理自定义协议。 2. 实现WebViewClient并重写shouldOverrideUrlLoading方法,拦截非标准协议的URL。 3. 在拦截到自定义协议时,使用Intent启动对应的应用。 4. 处理没有对应应用的情况,避免崩溃。 还需要考虑用户是否正确处理了Intent,比如是否捕获了ActivityNotFoundException,并给出提示。另外,可能需要更新WebView的配置,比如启用JavaScript或其他设置,但主要问题应该是在处理URL重定向上。 总结来说,解决方案的核心是拦截非标准协议的URL,并通过Intent启动其他应用来处理,同时处理可能出现的异常情况。</think>### 分步解决方案 #### 问题分析 `net::ERR_UNKNOWN_URL_SCHEME` 错误通常出现在 WebView 尝试加载非标准协议(如 `baiduyun://`、`tel://` 或自定义协议)时。AndroidWebView 默认仅支持 `http://` 和 `https://` 协议,其他协议需要开发者手动处理[^3][^1]。 --- #### 修复步骤 1. **添加 WebViewClient 拦截请求** 重写 `shouldOverrideUrlLoading` 方法,拦截非 HTTP/HTTPS 协议的请求,并尝试通过 Intent 启动对应应用: ```java webView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { Uri uri = request.getUrl(); String scheme = uri.getScheme(); // 检查协议是否为 HTTP/HTTPS if ("http".equalsIgnoreCase(scheme) || "https".equalsIgnoreCase(scheme)) { return false; // 由 WebView 处理 } else { try { // 尝试通过 Intent 启动外部应用 Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent); return true; // 拦截请求 } catch (ActivityNotFoundException e) { // 无应用可处理此协议时,提示用户 Toast.makeText(context, "未到支持此链接的应用", Toast.LENGTH_SHORT).show(); return true; } } } }); ``` 2. **设置 WebView 基础配置** 确保 WebView 启用必要功能,避免因配置问题导致加载失败: ```java WebSettings settings = webView.getSettings(); settings.setJavaScriptEnabled(true); // 启用 JavaScript settings.setDomStorageEnabled(true); // 启用 DOM 存储 ``` 3. **适配 Android 13 的包可见性限制** 在 `AndroidManifest.xml` 中声明需要处理的协议,避免因权限问题导致 Intent 失效: ```xml <queries> <!-- 声明需要处理的协议,例如 baiduyun --> <intent> <action android:name="android.intent.action.VIEW" /> <data android:scheme="baiduyun" /> </intent> </queries> ``` --- #### 关键代码说明 - **`shouldOverrideUrlLoading`**:拦截非标准协议请求,通过 Intent 跳转至第三方应用。 - **Intent 处理**:通过 `Intent.ACTION_VIEW` 匹配可处理该协议的应用,若未到则提示用户[^2]。 - **包可见性声明**:Android 13 要求显式声明应用需访问的协议,否则 Intent 可能无法生效。 --- ### 相关问题 1. **如何测试 WebView 的自定义协议处理逻辑?** 可通过模拟不同协议的 URL 加载,并检查 Intent 是否成功触发。 2. **WebView 加载第三方页面时如何避免安全风险?** 建议限制域名白名单或启用 Safe Browsing API。 3. **Android 13 对 WebView 还有哪些兼容性调整?** 需注意权限管理(如地理位置、摄像头权限)的变更,需动态请求敏感权限。 : Android中的WebView中加载非Http(s)的URL导致net::ERR_UNKNOWN_URL_SCHEME [^2]: webview加载网页出现("不到网页net:err_unknown_url_scheme") : WebView添加判断
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值