我有一个活动,可以将外部网址加载到我的应用内的网页视图中.我想在可用时使用Chrome自定义标签,但我支持的设备可能没有支持它们的Chrome版本.
在不支持CustomTabs的情况下,我想使用我的旧代码,但是当它们使用CustomTabsIntent.Builder()时.旧代码将内容加载到Activity中包含的WebView中,我仍然可以在其中管理ActionBar.
我想写一个帮助方法,告诉我它是否支持,但我不知道如何.开发者页面上的信息非常简洁:
https://developer.chrome.com/multidevice/android/customtabs
它表示如果绑定成功,可以安全地使用自定义选项卡.有没有一种简单的绑定方法来测试它?
像这样我假设:
Intent serviceIntent = new Intent("android.support.customtabs.action.CustomTabsService"); serviceIntent.setPackage("com.android.chrome"); boolean customTabsSupported = bindService(serviceIntent,new CustomTabsServiceConnection() { @Override public void onCustomTabsServiceConnected(final ComponentName componentName,final CustomTabsClient customTabsClient) {} @Override public void onServiceDisconnected(final ComponentName name) {} },Context.BIND_AUTO_CREATE | Context.BIND_WAIVE_PRIORITY); if (customTabsSupported) { // is supported }
解决方法
您可以使用PackageManager检查是否支持自定义选项卡,而不是绑定和解除绑定服务.
private static final String SERVICE_ACTION = "android.support.customtabs.action.CustomTabsService"; private static final String CHROME_PACKAGE = "com.android.chrome"; private static boolean isChromeCustomTabsSupported(@NonNull final Context context) { Intent serviceIntent = new Intent(SERVICE_ACTION); serviceIntent.setPackage(CHROME_PACKAGE); List<ResolveInfo> resolveInfos = context.getPackageManager().queryIntentServices(serviceIntent,0); return !(resolveInfos == null || resolveInfos.isEmpty()); }