You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义Chrome Tab中获取URL的onPageFinished替代方案及返回Intent为空问题

解决Custom Chrome Tab返回时获取当前URL的问题

嘿,我明白你的困扰了——Custom Chrome Tabs(简称CTT)和WebView不一样,它本身并没有直接在返回时把当前URL回传给你的机制,这就是为什么你在onActivityResult里拿到空Intent的原因。别担心,咱们有两种靠谱的方式解决这个问题:

方案一:用CustomTabsCallback实时跟踪URL(推荐)

CTT提供了CustomTabsCallback接口,可以监听用户的导航行为,其中onNavigationEvent方法能在页面加载完成时捕获到当前URL。我们可以用这个回调来记录用户最后访问的地址,等用户返回时直接用这个记录的值就行。

具体步骤:

  1. 创建自定义的CustomTabsCallback子类,重写onNavigationEvent方法,记录每次加载完成的URL:
private String lastVisitedUrl;

private CustomTabsCallback customTabsCallback = new CustomTabsCallback() {
    @Override
    public void onNavigationEvent(int navigationEvent, Bundle extras) {
        super.onNavigationEvent(navigationEvent, extras);
        // 当页面加载完成时,记录当前URL
        if (navigationEvent == CustomTabsCallback.NAVIGATION_FINISHED) {
            if (extras != null) {
                lastVisitedUrl = extras.getString(CustomTabsCallback.EXTRA_URL);
            }
        }
    }
};
  1. 连接Custom Tabs服务,获取CustomTabsSession并设置回调:
CustomTabsClient.bindCustomTabsService(this, "com.android.chrome", new CustomTabsServiceConnection() {
    @Override
    public void onCustomTabsServiceConnected(ComponentName name, CustomTabsClient client) {
        client.warmup(0L); // 预热服务,提升加载速度
        CustomTabsSession session = client.newSession(customTabsCallback);
        // 用session创建CTT意图
        CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder(session);
        // 配置你的CTT(比如设置返回按钮、标题栏颜色等)
        builder.setToolbarColor(ContextCompat.getColor(MainActivity.this, R.color.toolbar_color));
        CustomTabsIntent customTabsIntent = builder.build();
        
        // 启动CTT,用startActivityForResult
        customTabsIntent.launchUrl(MainActivity.this, Uri.parse("https://example.com"));
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        // 服务断开时的处理
    }
});
  1. 在onActivityResult里直接使用之前记录的lastVisitedUrl:
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == YOUR_REQUEST_CODE) {
        // 这里lastVisitedUrl就是用户最后访问的页面地址
        if (lastVisitedUrl != null) {
            // 处理你的逻辑,比如更新UI、保存URL等
            Log.d("CTT_URL", "最后访问的URL:" + lastVisitedUrl);
        }
    }
}

方案二:结合返回按钮点击事件(适用于只关心用户主动返回时的URL)

如果你只需要在用户点击CTT内的返回按钮时获取URL,可以在创建CTT意图时设置自定义返回按钮,同时结合CustomTabsSession的回调记录URL。当用户点击返回按钮时,onNavigationEvent会触发NAVIGATION_BACK事件,此时你已经有了最后记录的URL,直接在onActivityResult中使用即可。

补充说明:

  • 注意:如果用户使用系统的返回键(不是CTT内部的返回按钮),NAVIGATION_BACK事件不会触发,但NAVIGATION_FINISHED已经记录了最后加载的URL,所以lastVisitedUrl依然有效。
  • 确保你已经添加了Custom Tabs的依赖:implementation 'androidx.browser:browser:1.5.0'(版本号可以根据你的需求调整)

内容的提问来源于stack exchange,提问作者SimpleCoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:43:13