Android WebView中超链接点击报错ERR_FILE_NOT_FOUND的解决方法
修复WebView点击外部链接出现ERR_FILE_NOT_FOUND的问题
这个问题我之前也踩过坑!本质是WebView加载本地HTML文件时,默认会把所有链接都当成本地相对路径处理——哪怕你写了完整的HTTPS地址,它也会傻乎乎地去本地文件系统里找对应文件,自然就报ERR_FILE_NOT_FOUND了。下面给你分步解决:
1. 先补全基础权限
首先确保你的AndroidManifest.xml里加了网络权限,毕竟要访问外部链接:
<uses-permission android:name="android.permission.INTERNET" />
2. 配置WebView核心设置
你需要给WebView开启必要的权限,并设置自定义的链接处理器,让它能区分本地和远程链接:
WebView webView = findViewById(R.id.your_webview_id); WebSettings webSettings = webView.getSettings(); // 启用JavaScript(不是必须,但多数Web场景需要,建议开启) webSettings.setJavaScriptEnabled(true); // 允许混合内容加载(本地file://和远程https://属于混合内容,默认会被拦截) webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); // 关键:设置自定义WebViewClient拦截链接跳转 webView.setWebViewClient(new WebViewClient() { // 处理API 24+的链接跳转 @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { String targetUrl = request.getUrl().toString(); // 判断是否是外部HTTP/HTTPS链接 if (targetUrl.startsWith("http://") || targetUrl.startsWith("https://")) { // 方案一:用系统浏览器打开外部链接(推荐,避免WebView的兼容性问题) Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(targetUrl)); startActivity(browserIntent); return true; // 告诉WebView:这个链接我已经处理了,不用你管 } else { // 本地链接,交给WebView正常加载 return super.shouldOverrideUrlLoading(view, request); } } // 兼容API 24以下的旧版本(可选,但建议加上覆盖全版本) @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url.startsWith("http://") || url.startsWith("https://")) { Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); startActivity(browserIntent); return true; } else { return super.shouldOverrideUrlLoading(view, url); } } }); // 加载你的本地HTML文件 webView.loadUrl("file:///android_res/drawable/terms.html");
3. 额外检查:HTML链接格式
确认你的terms.html里的链接是标准写法,没有语法错误:
<a href="https://secfirst.org/terms">here.</a>
如果是在Java代码里拼接HTML字符串,记得转义引号(比如用\"),不过你是加载本地文件,只要文件内的链接正确就好。
这样处理后,点击"here."时,WebView会识别出这是外部HTTPS链接,要么调用系统浏览器打开,你也可以修改代码让WebView内部加载(把Intent那段换成view.loadUrl(targetUrl)再return true),就不会再出现本地文件找不到的错误了。
内容的提问来源于stack exchange,提问作者Douglas Mesquita
相关产品推荐
相关产品推荐

