Chrome 自定义选项卡和 intent-filter
Chrome custom tabs and intent-filter
该应用程序有 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 自定义选项卡,只是为了加快速度并让用户留在应用程序中。
我尝试使用 Intent Builder 在自定义选项卡中显示 url:
new CustomTabsIntent.Builder().build().launchUrl(activity, url);
但它显示 'Complete action using...' 对话框,我可以在其中看到我的应用程序和设备上的所有浏览器。如果我 select 我的应用程序会跳入循环并再次显示对话框,但如果我 select chrome 它会按预期工作。
所以问题是如何为 Chrome 自定义选项卡创建明确的 Intent?
您可以使用 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 的答案,但我认为有些可能我们必须更改
我已经在我的 Nexus 5 (6.0.1)
中安装了最新的 Chrome(2016 年 8 月 8 日更新)
但我没有将 Chrome 打包 "com.android.chrome" 到 resolveInfoList 中,我必须进行更改,然后它在我的 phone
上工作正常
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));
我已经测试了上面的代码,它在我的 phone
上运行良好
在已接受的答案中,您还可以检查 chrome 是否启用。
if (TextUtils.equals(packageName, PACKAGE_NAME) && applicationInfo.enabled)
该应用程序有 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 自定义选项卡,只是为了加快速度并让用户留在应用程序中。 我尝试使用 Intent Builder 在自定义选项卡中显示 url:
new CustomTabsIntent.Builder().build().launchUrl(activity, url);
但它显示 'Complete action using...' 对话框,我可以在其中看到我的应用程序和设备上的所有浏览器。如果我 select 我的应用程序会跳入循环并再次显示对话框,但如果我 select chrome 它会按预期工作。
所以问题是如何为 Chrome 自定义选项卡创建明确的 Intent?
您可以使用 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 的答案,但我认为有些可能我们必须更改
我已经在我的 Nexus 5 (6.0.1)
中安装了最新的 Chrome(2016 年 8 月 8 日更新)但我没有将 Chrome 打包 "com.android.chrome" 到 resolveInfoList 中,我必须进行更改,然后它在我的 phone
上工作正常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));
我已经测试了上面的代码,它在我的 phone
上运行良好在已接受的答案中,您还可以检查 chrome 是否启用。
if (TextUtils.equals(packageName, PACKAGE_NAME) && applicationInfo.enabled)