You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Chrome CustomTabs中捕获并处理404错误?

处理Chrome CustomTabs的404错误问题

Chrome CustomTabs本身没办法直接捕获网页的HTTP状态码——因为它是启动独立的Chrome进程加载页面,和你的App进程完全分离。所以得换个思路:在打开CustomTabs之前,先自己发起一个轻量的网络请求检查目标URL的状态,再决定后续操作。

下面给你具体的实现步骤和代码示例:

核心思路:先检查再打开

  1. HEAD请求(只获取响应头,不下载整个PDF,省流量又高效)预检查目标URL的HTTP状态码
  2. 根据状态码分支处理:
    • 状态码为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

火山引擎 最新活动