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

Android Chrome CustomTabs如何实时获取当前URL并触发回调?

如何在Android的Chrome CustomTabs中实时获取当前URL

我之前做项目时刚好碰到过这个需求,研究了这两种可行的方案,给你一步步拆解:

方案一:通过CustomTabsCallback监听导航事件

这个方法能让你感知到URL发生变化的时机,但无法直接获取到具体的URL值,只能知道导航行为发生了。具体实现步骤如下:

  1. 创建自定义的CustomTabsCallback,重写onNavigationEvent方法,根据导航事件类型判断URL是否变化:
CustomTabsCallback callback = new CustomTabsCallback() {
    @Override
    public void onNavigationEvent(int navigationEvent, Bundle extras) {
        super.onNavigationEvent(navigationEvent, extras);
        // 根据导航事件类型判断URL变化
        switch (navigationEvent) {
            case CustomTabsCallback.NAVIGATION_STARTED:
                // 页面开始加载新URL
                Log.d("CustomTabs", "开始导航到新URL");
                break;
            case CustomTabsCallback.NAVIGATION_FINISHED:
                // 页面加载完成,URL已更新
                Log.d("CustomTabs", "导航完成,URL已变更");
                break;
            case CustomTabsCallback.NAVIGATION_REDIRECT:
                // 发生重定向,URL变化
                Log.d("CustomTabs", "发生重定向,URL变更");
                break;
        }
    }
};
  1. 绑定CustomTabsClient并创建CustomTabsSession时,传入这个回调:
CustomTabsClient.bindCustomTabsService(context, "com.android.chrome", new CustomTabsServiceConnection() {
    @Override
    public void onCustomTabsServiceConnected(ComponentName name, CustomTabsClient client) {
        client.warmup(0L);
        CustomTabsSession session = client.newSession(callback);
        // 用这个session打开CustomTabs
        CustomTabsIntent intent = new CustomTabsIntent.Builder(session).build();
        intent.launchUrl(context, Uri.parse("https://example.com"));
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {}
});

注意:这个方案只能告诉你URL发生了变化,但无法获取到具体的URL内容,因为Chrome出于隐私保护,没有在回调中暴露URL参数。

方案二:通过BroadcastReceiver + PendingIntent获取当前URL

这个方案可以让你主动获取到当前的URL,但需要用户触发一个自定义的操作(比如点击CustomTabs工具栏上的按钮)。具体实现如下:

  1. 定义一个BroadcastReceiver来接收URL信息:
public class CustomTabsUrlReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent != null && "com.your.package.ACTION_GET_URL".equals(intent.getAction())) {
            Uri url = intent.getData();
            if (url != null) {
                // 这里拿到了当前CustomTabs的URL
                Log.d("CustomTabs", "当前URL:" + url.toString());
                // 处理URL逻辑
            }
        }
    }
}
  1. 在AndroidManifest中注册这个Receiver(或者用动态注册):
<receiver android:name=".CustomTabsUrlReceiver">
    <intent-filter>
        <action android:name="com.your.package.ACTION_GET_URL" />
    </intent-filter>
</receiver>
  1. 创建PendingIntent并添加到CustomTabs的工具栏按钮中:
// 创建触发广播的PendingIntent
Intent intent = new Intent("com.your.package.ACTION_GET_URL");
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);

// 构建CustomTabsIntent并添加自定义按钮
CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
builder.addToolbarItem(1, R.drawable.ic_get_url, "获取当前URL", pendingIntent);

CustomTabsIntent customTabsIntent = builder.build();
customTabsIntent.launchUrl(context, Uri.parse("https://example.com"));

这样,当用户点击CustomTabs工具栏上的"获取当前URL"按钮时,你的Receiver就能收到当前页面的URL了。

两种方案的总结

  • 方案一:无需用户操作,能实时感知URL变化,但拿不到具体URL值,适合只需要知道导航状态的场景。
  • 方案二:能拿到具体URL,但需要用户主动触发,适合需要获取URL内容的场景。

遗憾的是,Chrome CustomTabs目前没有提供无需用户交互就能直接实时获取URL的API,这是出于隐私安全的考虑,所以这两种方案是目前最可行的实现方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:24:51