2015-10-06 3 views
6

Ich habe eine Aktivität, die eine externe URL in eine Webansicht innerhalb meiner App lädt. Ich möchte Chrome-Tabs verwenden, wenn diese verfügbar sind, aber ich unterstütze Geräte, die möglicherweise keine Chrome-Version haben, die sie unterstützt.Wie kann ich prüfen, ob Chrome benutzerdefinierte Tabs von Chrome unterstützt?

Wenn CustomTabs nicht unterstützt werden, möchte ich meinen alten Code verwenden, aber benutze die CustomTabsIntent.Builder(), wenn sie es sind. Der alte Code lädt den Inhalt in einer WebView, die in einer Aktivität enthalten ist, wo ich die ActionBar noch verwalten kann.

Ich möchte eine Hilfsmethode schreiben, die mir sagen wird, ob sie unterstützt wird, aber ich bin mir nicht sicher, wie. Die Info auf der Entwicklerseite ist ziemlich schlank:

Es sagt, wenn Sie Bindung erfolgreich ist, können die benutzerdefinierten Registerkarten sicher verwendet werden. Gibt es eine einfache Möglichkeit zu binden, um dies zu testen?

Like this Ich gehe davon aus:

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 
} 

Antwort

5

landete ich eine statische Methode in meiner Utils-Klasse zu schreiben, so kann ich prüfen und den Fall behandeln, wo es nicht unterstützt wird:

/** 
    * 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; 
    } 
+2

Wird überprüft, ob benutzerdefinierte Chrome-Tabs in anderen Browsern unterstützt werden? – X09

11

Statt Wenn Sie den Dienst binden und lösen möchten, können Sie mit dem PackageManager überprüfen, ob benutzerdefinierte Registerkarten unterstützt werden.

Beachten Sie, dass andere Browser in Zukunft benutzerdefinierte Registerkarten unterstützen können. Daher sollten Sie dies möglicherweise ändern, um diesen Fall zu unterstützen.

+0

Sie sind eine der Chrome benutzerdefinierte Registerkarte Experte .. –

6

Sie versuchen, Code können sich, wenn Sie einen Browser haben, um herauszufinden, die benutzerdefinierte Registerkarte unterstützt:

private static final String TAG = "CustomTabLauncher"; 
static final String STABLE_PACKAGE = "com.android.chrome"; 
static final String BETA_PACKAGE = "com.chrome.beta"; 
static final String DEV_PACKAGE = "com.chrome.dev"; 
static final String LOCAL_PACKAGE = "com.google.android.apps.chrome"; 
String mPackageNameToUse; 

private String getPackageName(Context context) { 
    if (mPackageNameToUse != null) { 
     return mPackageNameToUse; 
    } 

    // Get default VIEW intent handler that can view a web url. 
    Intent activityIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.test-url.com")); 

    // Get all apps that can handle VIEW intents. 
    PackageManager pm = context.getPackageManager(); 
    List<ResolveInfo> resolvedActivityList = pm.queryIntentActivities(activityIntent, 0); 
    List<String> packagesSupportingCustomTabs = new ArrayList<>(); 
    for (ResolveInfo info : resolvedActivityList) { 
     Intent serviceIntent = new Intent(); 
     serviceIntent.setAction(CustomTabsService.ACTION_CUSTOM_TABS_CONNECTION); 
     serviceIntent.setPackage(info.activityInfo.packageName); 
     if (pm.resolveService(serviceIntent, 0) != null) { 
      packagesSupportingCustomTabs.add(info.activityInfo.packageName); 
     } 
    } 

    // Now packagesSupportingCustomTabs contains all apps that can handle both VIEW intents 
    // and service calls. 
    if (packagesSupportingCustomTabs.isEmpty()) { 
     mPackageNameToUse = null; 
    } else if (packagesSupportingCustomTabs.size() == 1) { 
     mPackageNameToUse = packagesSupportingCustomTabs.get(0); 
    } else if (packagesSupportingCustomTabs.contains(STABLE_PACKAGE)) { 
     mPackageNameToUse = STABLE_PACKAGE; 
    } else if (packagesSupportingCustomTabs.contains(BETA_PACKAGE)) { 
     mPackageNameToUse = BETA_PACKAGE; 
    } else if (packagesSupportingCustomTabs.contains(DEV_PACKAGE)) { 
     mPackageNameToUse = DEV_PACKAGE; 
    } else if (packagesSupportingCustomTabs.contains(LOCAL_PACKAGE)) { 
     mPackageNameToUse = LOCAL_PACKAGE; 
    } 
    return mPackageNameToUse; 
} 

Beim Aufruf, Sie so etwas wie dies tun können:

public void openCustomTab(Uri uri, Activity activity) { 
    //If we cant find a package name, it means there's no browser that supports 
    //Chrome Custom Tabs installed. So, we fallback to the default browser 
    if (getPackageName(activity) == null) { 
     activity.startActivity(new Intent(Intent.ACTION_VIEW, uri)); 
    } else { 
     CustomTabsIntent.Builder intentBuilder = new CustomTabsIntent.Builder(); 
     intentBuilder.enableUrlBarHiding(); 
     intentBuilder.setToolbarColor(activity.getResources().getColor(R.color.purple_a_01)); 

     CustomTabsIntent customTabsIntent = intentBuilder.build(); 
     customTabsIntent.intent.setPackage(mPackageNameToUse); 

     customTabsIntent.launchUrl(activity, uri); 
    } 
} 
+0

Fantastische Antwort, kann geändert werden, um eine einfache Boolean gibt die Existenz eines Chrome Tab kompatiblen Browser zurück. https://gist.github.com/aashreys/fd8a14e652b7c80b784dc90be235d208 – aashrey99

0

ich dieses Problem gelöst durch Behandlung von ActivityNotFound Ausnahme im Catch-Block.

Der Trick ist zu überprüfen, ob die Browser-Aktivität von Chrome gestartet werden kann oder nicht, wenn es nicht gestartet werden kann oder eine Ausnahme auslöst, dann einfach den Link über Intent.ACTION_VIEW öffnen.

Hier alle relevanten Code ....

private void onBtnLinkClicked(View v, int pos) { 
    try { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { 
      openCustomTab(url); 
     } else { 
      openBrowserActivity(url); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
     openBrowserActivity(url); 
    } 
} 

private void openBrowserActivity(String url) { 
    Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); 
    context.startActivity(browserIntent); 
} 

Was ist openCustomTab(url) Sie sagen: Hier der entsprechende Code für sie ist.

private void openCustomTab(String url) { 
    CustomTabsIntent.Builder intentBuilder = new CustomTabsIntent.Builder(); 

    int color = context.getResources().getColor(R.color.colorPrimary); 
    intentBuilder.setToolbarColor(color); 
    intentBuilder.setShowTitle(true); 

    String menuItemTitle = context.getString(R.string.menu_title_share); 
    PendingIntent menuItemPendingIntent = createPendingShareIntent(); 
    intentBuilder.addMenuItem(menuItemTitle, menuItemPendingIntent);  

    intentBuilder.setStartAnimations(context, 
      R.anim.slide_in_right, R.anim.slide_out_left); 
    intentBuilder.setExitAnimations(context, 
      android.R.anim.slide_in_left, android.R.anim.slide_out_right); 

    CustomTabActivityHelper.openCustomTab(
      activity, intentBuilder.build(), Uri.parse(url), new WebviewFallback()); 
} 

Mein Stil der Antwort kann großspurig scheint aber vor dem Klicken auf mich downvote zu informieren, wenn Sie in jeden unerwarteten Fehler oder ein anderes Problem ausgeführt haben, dass dieser Ansatz Ursache haben kann. Geben Sie uns Ihr Feedback, wir sind eine Gemeinschaft.

1

Von Entwicklerseite von Chrome, fand ich das Folgende -

Ab Chrome 45 ist Chrome Individuelle Tabs nun für alle Nutzer von Chrome allgemein verfügbar sind, auf allen Chrome unterstützten Android-Versionen (Ab Jellybean)

-Link: https://developer.chrome.com/multidevice/android/customtabs#whencaniuseit

Also, ich geprüft, ob ChromeChrome Individuelle Tab von Version unterstützt.

meinen Code überprüfen:

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 
} 

Ich weiß nicht, wie effizient es ist, wollen einfach nur teilen.

Verwandte Themen