カスタムchromeタブを実装しようとしています。Googleのデフォルトライブラリcustomtabsを使用しています。
私は this カスタムchromeタブを実装するためのチュートリアルを参照しました。チュートリアルで提案されているように、私はこのようなコーディングを行いました。
mCustomTabsServiceConnection = new CustomTabsServiceConnection() {
@Override
public void onCustomTabsServiceConnected(
ComponentName componentName,
CustomTabsClient customTabsClient) {
mCustomTabsClient = customTabsClient;
mCustomTabsClient.warmup(0L);
mCustomTabsSession = mCustomTabsClient.newSession(null);
}
@Override
public void onServiceDisconnected(ComponentName name) {
mCustomTabsClient = null;
}
};
CustomTabsClient.bindCustomTabsService(this, "com.Android.chrome",
mCustomTabsServiceConnection);
CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder(
mCustomTabsSession).setShowTitle(true);
builder.setToolbarColor(getResources().getColor(R.color.purple_main));
builder.setStartAnimations(getApplicationContext(), R.anim.fadein,
R.anim.fadeout);
builder.setExitAnimations(getApplicationContext(), R.anim.fadein,
R.anim.fadeout);
mCustomTabsIntent = builder.build();
カスタムタブを起動します。
mCustomTabsIntent.launchUrl(TampleDetails.this,
Uri.parse(temple_website));
ご覧のとおり、Chromeのパッケージ名でカスタムタブをバインドしていますが、それでもChromeとUCのどちらかを選択するように求められますブラウザ。 UCブラウザがカスタムタブをサポートしていないことは明らかです。
だから私の質問は、カスタムタブをChromeブラウザでのみバインドするように制限する方法ですか?
どんな助けでもありがたいです。
ありがとうございました。
チェック このstackoverflowの回答 :URLを起動する前に目的のブラウザのパッケージでCustomTabIntentパッケージを設定した場合、Androidダイアログブラウザの選択;私にとってはスキップできます機能した:
/**
* Opens the URL on a Custom Tab
*
* @param activity The Host activity.
* @param uri the Uri to be opened.
*/
public static void openCustomTab(Activity activity,
Uri uri) {
// Here is a method that returns the chrome package name
String packageName = CustomTabsHelper.getPackageNameToUse(activity, mUrl);
CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
mCustomTabsIntent = builder
.setShowTitle(true)
.build();
builder.setToolbarColor(ContextCompat.getColor(activity, R.color.colorPrimary));
if ( packageName != null ) {
mCustomTabsIntent.intent.setPackage(packageName);
}
mCustomTabsIntent.launchUrl(activity, uri);
}
カスタムタブプロトコルは開いています。つまり、他のブラウザでサポートできます。実際、Samsung Internet Browserはすでにそれをサポートしており(実装は壊れていますが)、Firefoxは初期の非常に実験的なサポートを毎晩のビルドに追加しています。
したがって、ベストプラクティスは、インストールされているブラウザのどれがカスタムタブプロトコルをサポートしているかをAndroidシステムにクエリすることです。
_private static final String ACTION_CUSTOM_TABS_CONNECTION =
"Android.support.customtabs.action.CustomTabsService";
public static ArrayList<ResolveInfo> getCustomTabsPackages(Context context) {
PackageManager pm = context.getPackageManager();
// Get default VIEW intent handler.
Intent activityIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.example.com"));
// Get all apps that can handle VIEW intents.
List<ResolveInfo> resolvedActivityList = pm.queryIntentActivities(activityIntent, 0);
ArrayList<ResolveInfo> packagesSupportingCustomTabs = new ArrayList<>();
for (ResolveInfo info : resolvedActivityList) {
Intent serviceIntent = new Intent();
serviceIntent.setAction(ACTION_CUSTOM_TABS_CONNECTION);
serviceIntent.setPackage(info.activityInfo.packageName);
if (pm.resolveService(serviceIntent, 0) != null) {
packagesSupportingCustomTabs.add(info);
}
}
return packagesSupportingCustomTabs;
}
_
_ResolveInfo#preferredOrder
_ をチェックして、ユーザーが他のアプリよりも1つのアプリを優先しているかどうかを確認することをお勧めします。また、優先アプリがない場合(または、2つのアプリの主要な優先レベルが同じである場合)、ユーザーに1つを選択するように依頼するか、適切なデフォルトを使用することをお勧めします。
また、giveUrlにそれを処理するネイティブアプリケーションがインストールされているかどうかを確認することも重要です。その場合、アプリがカスタムタブで開くのではなく、ネイティブアプリを起動する方が理にかなっている場合があります。
_public static List<ResolveInfo> getNativeApp(Context context, Uri uri) {
PackageManager pm = context.getPackageManager();
//Get all Apps that resolve a random url
Intent browserActivityIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.example.com"));
List<ResolveInfo> resolvedBrowserList = pm.queryIntentActivities(browserActivityIntent, 0);
Intent specializedActivityIntent = new Intent(Intent.ACTION_VIEW, uri);
List<ResolveInfo> resolvedSpecializedList = pm.queryIntentActivities(specializedActivityIntent, 0);
resolvedSpecializedList.removeAll(resolvedBrowserList);
return resolvedBrowserList;
}
_
カスタムタブを開くために使用するハンドラーを決定したら、mCustomTabsIntent.intent.setPackage(packageName);
を使用して、どのアプリケーションを開くかをカスタムタブに指示します。
役に立つかもしれません。
CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
CustomTabsIntent customTabsIntent = builder.build();
customTabsIntent.intent.setPackage("com.Android.chrome");
builder.setToolbarColor(ContextCompat.getColor(context,R.color.colorPrimary));
builder.setShowTitle(true);
builder.addDefaultShareMenuItem();
builder.build().launchUrl((Activity) context, Uri.parse(http_link));
このintentCustomTabs.intent.setPackage( "com.Android.chrome");のようにパッケージ名を指定することで、この問題を回避できます。
完全なコード:
String url = link;
CustomTabsIntent.Builder builderCustomTabs = new CustomTabsIntent.Builder();
CustomTabsIntent intentCustomTabs = builderCustomTabs.build();
intentCustomTabs.intent.setPackage("com.Android.chrome");
intentCustomTabs.intent.addFlags(67108864);
builderCustomTabs.setShowTitle(true);
builderCustomTabs.setToolbarColor(ContextCompat.getColor(this, R.color.colorPrimary));
builderCustomTabs.enableUrlBarHiding();
intentCustomTabs.launchUrl(this, Uri.parse(url));