Android Chrome自定义选项卡和意图过滤器

Android Chrome自定义选项卡和意图过滤器,android,android-intent,intentfilter,chrome-custom-tabs,Android,Android Intent,Intentfilter,Chrome Custom Tabs,应用程序具有显示特定网站内容的活动,例如“example.com”。因此,要在应用程序I have intent filter中显示“example.com/product/123”的内容: <activity android:name=".LinkInterceptorActivity"> <intent-filter android:priority="999"> <action android:name="android.in

应用程序具有显示特定网站内容的活动,例如“example.com”。因此,要在应用程序I have intent filter中显示“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,包括:

newcustomtabsinent.Builder().build().launchUrl(活动,url)

但它向我显示了“使用…完成操作”对话框,在这里我可以看到我的应用程序和设备上的所有浏览器。如果我选择我的应用程序,它会跳入循环并再次显示对话框,但如果我选择chrome,它会按预期工作


所以问题是如何为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);
String-PACKAGE_-NAME=“com.android.chrome”;
CustomTabsInt CustomTabsInt=新建CustomTabsInt.Builder().build();
customtabsinent.intent.setData(uri);
PackageManager PackageManager=getPackageManager();
List resolveInfoList=packageManager.QueryInputActivities(CustomTabsInt.intent,packageManager.MATCH_DEFAULT_仅限);
for(ResolveInfo ResolveInfo:resolveInfoList){
字符串packageName=resolveInfo.activityInfo.packageName;
if(TextUtils.equals(packageName,PACKAGE_NAME))
customtabsinent.intent.setPackage(包名称);
}
customtabsinent.launchUrl(这个,uri);

我使用了@Mattia Maestrini的答案,但我认为有些可能是我们必须改变的

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

但是我没有把Chrome软件包“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));
String-PACKAGE_-NAME=“com.android.chrome”;
CustomTabsInt CustomTabsInt=新建CustomTabsInt.Builder().build();
customtabsinent.intent.setData(Uri.parse(url));
PackageManager PackageManager=getPackageManager();
List resolveInfoList=packageManager.GetInstalledApplication(packageManager.GET_元数据);
for(ApplicationInfo ApplicationInfo:resolveInfoList){
字符串packageName=applicationInfo.packageName;
if(TextUtils.equals(packageName,PACKAGE_NAME)){
customtabsinent.intent.setPackage(包名称);
打破
}
}
customtabsinent.launchUrl(这个,Uri.parse(url));

我已经测试了上述代码,它在我的手机上运行良好。

在接受的回答中,您还可以检查chrome是否启用

packageManager.queryIntentActivities(customTabsIntent.intent, PackageManager.MATCH_DEFAULT_ONLY);
if (TextUtils.equals(packageName, PACKAGE_NAME) && applicationInfo.enabled)

那么chrome 45之前的版本呢?使用45之前的版本,它可以在独立的chrome浏览器中直接打开。很好,我会在打开之前添加一些额外的代码来检查软件包,但是这种方法很好,谢谢!你是对的,我刚刚改进了答案,添加了对包名的检查。谢谢你指出这一点!如果设备上没有安装chrome怎么办?