自定义Chrome Tab中获取URL的onPageFinished替代方案及返回Intent为空问题
解决Custom Chrome Tab返回时获取当前URL的问题
嘿,我明白你的困扰了——Custom Chrome Tabs(简称CTT)和WebView不一样,它本身并没有直接在返回时把当前URL回传给你的机制,这就是为什么你在onActivityResult里拿到空Intent的原因。别担心,咱们有两种靠谱的方式解决这个问题:
方案一:用CustomTabsCallback实时跟踪URL(推荐)
CTT提供了CustomTabsCallback接口,可以监听用户的导航行为,其中onNavigationEvent方法能在页面加载完成时捕获到当前URL。我们可以用这个回调来记录用户最后访问的地址,等用户返回时直接用这个记录的值就行。
具体步骤:
- 创建自定义的
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); } } } };
- 连接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) { // 服务断开时的处理 } });
- 在
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
相关产品推荐
相关产品推荐

