Пользовательские вкладки Chrome и фильтр намерений

Приложение имеет Activity для отображения содержимого конкретного веб-сайта, например, example.com. Таким образом, чтобы показать содержимое «example.com/product/123» внутри приложения, у меня есть фильтр намерений:

<activity android:name=".LinkInterceptorActivity"> <intent-filter android:priority="999"> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:host="www.example.com" android:scheme="http" /> </intent-filter> </activity> 

Но в некоторых случаях я должен показывать это содержимое в браузере, поэтому я решил использовать пользовательские вкладки chrome, чтобы ускорить его работу и сохранить пользователя внутри приложения. Я попытался использовать конструктор намерений, чтобы показать URL-адрес в пользовательских вкладках:

new CustomTabsIntent.Builder().build().launchUrl(activity, url);

Но он показывает мне диалоговое окно «Полное действие с использованием …», где я вижу свое приложение и все браузеры на устройстве. Если я выберу свое приложение, он перейдет в цикл и снова отобразит диалоговое окно, но если я выберу хром, он будет работать так, как ожидалось.

Итак, возникает вопрос, как создать явное намерение для пользовательских вкладок Chrome?

Solutions Collecting From Web of "Пользовательские вкладки Chrome и фильтр намерений"

Вы можете использовать setPackage :

 String PACKAGE_NAME = "com.android.chrome"; CustomTabsIntent customTabsIntent = new CustomTabsIntent.Builder().build(); customTabsIntent.intent.setData(uri); PackageManager packageManager = getPackageManager(); List<ResolveInfo> resolveInfoList = packageManager.queryIntentActivities(customTabsIntent.intent, PackageManager.MATCH_DEFAULT_ONLY); for (ResolveInfo resolveInfo : resolveInfoList) { String packageName = resolveInfo.activityInfo.packageName; if (TextUtils.equals(packageName, PACKAGE_NAME)) customTabsIntent.intent.setPackage(PACKAGE_NAME); } customTabsIntent.launchUrl(this, uri); 

Я использовал ответ @Mattia Maestrini, но я думаю, что некоторые из нас могут быть изменены

Я уже установил последний Chrome (обновлен 8 августа 2016 года) в своем Nexus 5 (6.0.1)

Но я не получаю пакет Chrome «com.android.chrome» в resolInfoList, мне нужно делать изменения, тогда он отлично работает на моем телефоне

 packageManager.queryIntentActivities(customTabsIntent.intent, PackageManager.MATCH_DEFAULT_ONLY); 

Выше запроса не дает мне имя пакета Chrome

  String PACKAGE_NAME = "com.android.chrome"; CustomTabsIntent customTabsIntent = new CustomTabsIntent.Builder().build(); customTabsIntent.intent.setData(Uri.parse(url)); PackageManager packageManager = getPackageManager(); List<ApplicationInfo> resolveInfoList = packageManager.getInstalledApplications(PackageManager.GET_META_DATA); for (ApplicationInfo applicationInfo : resolveInfoList) { String packageName = applicationInfo.packageName; if (TextUtils.equals(packageName, PACKAGE_NAME)) { customTabsIntent.intent.setPackage(PACKAGE_NAME); break; } } customTabsIntent.launchUrl(this, Uri.parse(url)); 

Я тестировал выше код, и он отлично работает на моем телефоне