Android Chrome CustomTabs如何实时获取当前URL并触发回调?
如何在Android的Chrome CustomTabs中实时获取当前URL
我之前做项目时刚好碰到过这个需求,研究了这两种可行的方案,给你一步步拆解:
方案一:通过CustomTabsCallback监听导航事件
这个方法能让你感知到URL发生变化的时机,但无法直接获取到具体的URL值,只能知道导航行为发生了。具体实现步骤如下:
- 创建自定义的
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; } } };
- 绑定
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工具栏上的按钮)。具体实现如下:
- 定义一个
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逻辑 } } } }
- 在AndroidManifest中注册这个Receiver(或者用动态注册):
<receiver android:name=".CustomTabsUrlReceiver"> <intent-filter> <action android:name="com.your.package.ACTION_GET_URL" /> </intent-filter> </receiver>
- 创建
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
相关产品推荐
相关产品推荐

