Chrome自定义标签和意图过滤器

时间:2015-09-18 15:02:00

标签: android android-intent intentfilter chrome-custom-tabs

该应用程序具有活动以显示特定网站的内容,例如“example.com”。因此,为了在app中显示“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自定义标签,以使其更快并使用户保持在应用内。 我尝试使用intent builder在自定义标签中显示url:

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

但是它显示了“使用...完成操作”对话框,其中我看到了我的应用和设备上的所有浏览器。如果我选择我的应用程序,它会跳转到循环并再次显示对话框,但是如果我选择chrome它会按预期工作。

所以问题是如何为Chrome自定义标签创建显式Intent?

3 个答案:

答案 0 :(得分:10)

您可以使用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);

答案 1 :(得分:6)

我使用了@Mattia Maestrini的答案,但我认为有些人可能需要改变

我已经在我的Nexus 5(6.0.1)中安装了最新的Chrome(2016年8月8日更新)

但我没有将Chrome Package“com.android.chrome”收到resolveInfoList,我必须做更改,然后它在我的手机上正常工作

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));

我已经测试了上面的代码,它在我的手机上工作正常

答案 2 :(得分:-1)

在接受的答案中,您还可以检查Chrome是否启用。

if (TextUtils.equals(packageName, PACKAGE_NAME) && applicationInfo.enabled)