13

アプリ内の Web ビューに外部 URL を読み込むアクティビティがあります。Chrome のカスタム タブが利用可能になったら使用したいのですが、それらをサポートする Chrome のバージョンがない可能性があるデバイスをサポートしています。

CustomTabs がサポートされていない場合は、古いコードを使用したいのですが、サポートされている場合は CustomTabsIntent.Builder() を使用します。古いコードは、ActionBar を引き続き管理できる Activity に含まれる WebView にコンテンツをロードします。

サポートされているかどうかを教えてくれるヘルパー メソッドを書きたいのですが、方法がわかりません。開発者ページの情報はかなりスリムです: https://developer.chrome.com/multidevice/android/customtabs

バインドに成功すると、カスタム タブを安全に使用できると表示されます。これをテストするためにバインドする簡単な方法はありますか?

このように私は仮定します:

Intent serviceIntent = new Intent("android.support.customtabs.action.CustomTabsService");
serviceIntent.setPackage("com.android.chrome");
boolean customTabsSupported = bindService(serviceIntent, new CustomTabsServiceConnection() {
            @Override
            public void onCustomTabsServiceConnected(final ComponentName componentName, final CustomTabsClient customTabsClient) {}

            @Override
            public void onServiceDisconnected(final ComponentName name) {}
        },
        Context.BIND_AUTO_CREATE | Context.BIND_WAIVE_PRIORITY);

if (customTabsSupported) {
    // is supported
}
4

6 に答える 6

14

サービスをバインドおよびバインド解除する代わりに、PackageManager を使用して、カスタム タブがサポートされているかどうかを確認できます。

  private static final String SERVICE_ACTION = "android.support.customtabs.action.CustomTabsService";
    private static final String CHROME_PACKAGE = "com.android.chrome";

    private static boolean isChromeCustomTabsSupported(@NonNull final Context context) {
        Intent serviceIntent = new Intent(SERVICE_ACTION);
        serviceIntent.setPackage(CHROME_PACKAGE);
        List<ResolveInfo> resolveInfos = context.getPackageManager().queryIntentServices(serviceIntent, 0);
        return !(resolveInfos == null || resolveInfos.isEmpty());
    }

将来、他のブラウザーがカスタム タブをサポートする可能性があることに注意してください。

于 2015-10-09T15:17:37.957 に答える
6

サポートされていないケースを確認して処理できるように、Utils クラスに静的メソッドを作成することになりました。

/**
     * Check if Chrome CustomTabs are supported. 
     * Some devices don't have Chrome or it may not be
     * updated to a version where custom tabs is supported.
     *
     * @param context the context
     * @return whether custom tabs are supported
     */
    public static boolean isChromeCustomTabsSupported(@NonNull final Context context) {
        Intent serviceIntent = new Intent("android.support.customtabs.action.CustomTabsService");
        serviceIntent.setPackage("com.android.chrome");

        CustomTabsServiceConnection serviceConnection = new CustomTabsServiceConnection() {
            @Override
            public void onCustomTabsServiceConnected(final ComponentName componentName, final CustomTabsClient customTabsClient) { }

            @Override
            public void onServiceDisconnected(final ComponentName name) { }
        };

        boolean customTabsSupported =
                context.bindService(serviceIntent, serviceConnection, Context.BIND_AUTO_CREATE | Context.BIND_WAIVE_PRIORITY);
        context.unbindService(serviceConnection);

        return customTabsSupported;
    }
于 2015-10-06T20:29:31.677 に答える
1

Chromeの開発者サイトから、以下を見つけました -

Chrome 45 の時点で、Chrome のサポートされているすべての Android バージョン (Jellybean 以降) で、Chrome のすべてのユーザーが Chrome カスタム タブを一般に利用できるようになりました。

リンク: https://developer.chrome.com/multidevice/android/customtabs#whencaniuseit

ということで、 ChromeがChromeカスタムタブに対応しているかどうかをバージョン別に調べてみました。

私のコードをチェックしてください:

String chromePackageName = "com.android.chrome";
int chromeTargetVersion  = 45;

boolean isSupportCustomTab = false;
try {
    String chromeVersion = getApplicationContext().getPackageManager().getPackageInfo(chromePackageName, 0).versionName;
    if(chromeVersion.contains(".")) {
        chromeVersion = chromeVersion.substring(0, chromeVersion.indexOf('.'));
    }
    isSupportCustomTab = (Integer.valueOf(chromeVersion) >= chromeTargetVersion);
} catch (PackageManager.NameNotFoundException ex) {
} catch (Exception ex) { }

if (isSupportCustomTab) {
    //Use Chrome Custom Tab
} else {
    //Use WebView or other Browser
}

それがどれほど効率的かはわかりませんが、共有したいだけです。

于 2017-01-09T19:37:00.943 に答える