Пользовательские вкладки Chrome запрашивает выбор нескольких браузеров.

android chrome-custom-tabs

7258 просмотра

4 ответа

4451 Репутация автора

Я пытаюсь реализовать пользовательские вкладки Chrome. Я использую библиотечные настройки Google по умолчанию .

Я сослался на это руководство для реализации пользовательских вкладок 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 Browser . и очевидно, что браузер UC не поддерживает пользовательские вкладки.

Поэтому мой вопрос заключается в том, как ограничить привязку пользовательских вкладок только браузером Chrome?

любая помощь будет оценена.

Спасибо.

Автор: V-rund Puro-hit Источник Размещён: 18.07.2016 06:10

Ответы (4)


17 плюса

1837 Репутация автора

Решение

Проверьте ответ на этот стек : если вы установили пакет CustomTabIntent с пакетом нужного браузера перед запуском URL, вы можете пропустить выбор браузера 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);
}
Автор: Valentino S. Размещён: 19.07.2016 10:39

9 плюса

2488 Репутация автора

Поддержка нескольких браузеров

Протокол пользовательских вкладок открыт, это означает, что другие браузеры могут его поддерживать. Фактически, Интернет-браузер Samsung уже поддерживает его (хотя и с неработающей реализацией), и Firefox добавил первоначальную, очень экспериментальную поддержку для ночных сборок.

Таким образом, передовой практикой будет опрос системы Android, в которой из установленных браузеров поддерживают протокол Custom Tabs:

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проверить, имеет ли пользователь предпочтение в одном из приложений над другими. Кроме того, если предпочтительного приложения нет (или два приложения имеют один и тот же основной уровень предпочтения), вы можете попросить пользователя выбрать одно или использовать разумные значения по умолчанию.

Думая о родных приложениях

Также важно проверить, есть ли у данного URL-адреса собственное приложение, которое его обрабатывает. Если это так, может иметь смысл запустить собственное приложение вместо того, чтобы открывать его на пользовательской вкладке:

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);чтобы сообщить настраиваемой вкладке, какое приложение открыть.

Автор: andreban Размещён: 01.08.2016 01:27

2 плюса

2436 Репутация автора

Может быть полезно.

    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));
Автор: Prabs Размещён: 07.10.2016 01:13

0 плюса

1 Репутация автора

Вы можете избежать этой проблемы, указав имя пакета, например, 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));
Автор: Anandu Размещён: 28.12.2017 08:54
Вопросы из категории :
32x32