如何在Chrome CustomTabs中捕获并处理404错误?
处理Chrome CustomTabs的404错误问题
Chrome CustomTabs本身没办法直接捕获网页的HTTP状态码——因为它是启动独立的Chrome进程加载页面,和你的App进程完全分离。所以得换个思路:在打开CustomTabs之前,先自己发起一个轻量的网络请求检查目标URL的状态,再决定后续操作。
下面给你具体的实现步骤和代码示例:
核心思路:先检查再打开
- 用
HEAD请求(只获取响应头,不下载整个PDF,省流量又高效)预检查目标URL的HTTP状态码 - 根据状态码分支处理:
- 状态码为
200 OK:正常打开CustomTabs加载PDF - 状态码为
404 Not Found:在App内给用户显示对应错误提示(比如“当前时段无法访问该文件”) - 其他错误状态(如500、超时):统一提示网络异常
- 状态码为
代码示例(用OkHttp实现,也可替换为原生HttpURLConnection)
先确保你已添加OkHttp依赖(用原生实现可跳过),然后在后台线程执行网络检查:
// 用Coroutines在后台线程执行检查(Java项目可替换为AsyncTask) CoroutineScope(Dispatchers.IO).launch { val client = OkHttpClient() val request = Request.Builder() .url(completeUrl) .head() // 仅获取响应头,不下载文件内容 .build() try { val response = client.newCall(request).execute() val statusCode = response.code response.close() // 切回主线程更新UI withContext(Dispatchers.Main) { if (statusCode == 200) { // 状态正常,打开CustomTabs CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder(); builder.setToolbarColor(getResources().getColor(R.color.md_red_700)); builder.setStartAnimations(WelcomeActivity.this, R.anim.slide_in_right, R.anim.slide_out_left); builder.setExitAnimations(WelcomeActivity.this, R.anim.slide_in_left, R.anim.slide_out_right); CustomTabsIntent intent = builder.build(); intent.launchUrl(WelcomeActivity.this, Uri.parse(completeUrl)); } else if (statusCode == 404) { Toast.makeText(WelcomeActivity.this, "当前时段无法访问该文件,请稍后再试", Toast.LENGTH_LONG).show(); } else { Toast.makeText(WelcomeActivity.this, "网络请求异常,请稍后重试", Toast.LENGTH_LONG).show(); } } } catch (IOException e) { e.printStackTrace(); withContext(Dispatchers.Main) { Toast.makeText(WelcomeActivity.this, "网络连接失败,请检查网络状态", Toast.LENGTH_LONG).show(); } } }
关键注意事项
- 绝对不能在主线程执行网络请求,必须放在后台线程(Coroutines、AsyncTask、Thread都可以),否则会触发
NetworkOnMainThreadException - 记得在
AndroidManifest.xml中申请INTERNET权限:<uses-permission android:name="android.permission.INTERNET" /> - 如果目标URL需要携带Cookie/会话信息才能返回正确状态,要在预请求中带上对应Cookie(可从App的
CookieManager中获取)
补充说明:CustomTabs提供的CustomTabsCallback回调里没有HTTP状态码相关的方法,所以没法直接通过CustomTabs本身捕获404错误,预检查是最靠谱的解决方案。
内容的提问来源于stack exchange,提问作者Prejith P




