2015-10-06 16 views
6

मेरे पास एक ऐसी गतिविधि है जो मेरे ऐप के भीतर एक वेबव्यू में बाहरी यूआरएल लोड करती है। जब मैं उपलब्ध हो तो मैं क्रोम कस्टम टैब का उपयोग करना चाहता हूं लेकिन मैं ऐसे उपकरणों का समर्थन करता हूं जिनके पास क्रोम का संस्करण नहीं है जो उनका समर्थन करता है।मैं कैसे जांच सकता हूं कि क्रोम क्रोम कस्टम टैब का समर्थन करता है या नहीं?

कस्टमटैब्स समर्थित नहीं होने के मामले में मैं अपने पुराने कोड का उपयोग करना चाहता हूं लेकिन कस्टमटैब्सइन्टेंट.बिल्डर() का उपयोग कर सकता हूं। पुराना कोड उस गतिविधि में निहित वेबव्यू में सामग्री लोड करता है जहां मैं अभी भी एक्शनबार प्रबंधित कर सकता हूं।

मैं एक सहायक विधि लिखना चाहता हूं जो मुझे बताएगा कि यह समर्थित है, लेकिन मुझे यकीन नहीं है कि कैसे। डेवलपर पेज पर जानकारी बहुत पतली है: https://developer.chrome.com/multidevice/android/customtabs

यह कहता है कि यदि आप सफल होते हैं तो कस्टम टैब सुरक्षित रूप से उपयोग किए जा सकते हैं। क्या इसका परीक्षण करने के लिए बाध्य करने का कोई आसान तरीका है?

इस तरह

मुझे लगता है:

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

उत्तर

5

मैं अपने Utils कक्षा में एक स्थिर विधि लिख तो मैं जाँच करें और इस मामले में जहां यह समर्थित नहीं है संभाल कर सकते हैं समाप्त हो गया सेवा को बाध्यकारी और अनबाइंड करने के लिए, आप कस्टम टैब समर्थित होने पर यह जांचने के लिए पैकेज प्रबंधक का उपयोग कर सकते हैं।

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()); 
    } 

ध्यान रखें कि अन्य ब्राउज़र भविष्य में कस्टम टैब का समर्थन कर सकते हैं, ताकि आप इस मामले का समर्थन करने के लिए इसे संशोधित करना चाहें।

+2

यह जांच करेगा कि क्या क्रोम कस्टम टैब अन्य ब्राउज़रों में समर्थित है? – X09

11

बजाय:

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 
} 
+0

आप क्रोम कस्टम टैब विशेषज्ञ हैं .. –

6

यदि आप एक ब्राउज़र कस्टम टैब का समर्थन करता है यह पता लगाने की कोड निम्नलिखित कोशिश कर सकते हैं: मैं इस समस्या का समाधान

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

शानदार उत्तर, एक क्रोम टैब संगत ब्राउज़र के अस्तित्व को इंगित करने वाला एक साधारण बुलियन लौटने के लिए संशोधित किया जा सकता है। https://gist.github.com/aashreys/fd8a14e652b7c80b784dc90be235d208 – aashrey99

0

:

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; 
} 

जब बुला, आप कुछ इस तरह कर सकते हैं पकड़ ब्लॉक में ActivityNotFound अपवाद को संभालने के द्वारा।

चाल यह जांचना है कि क्रोम की ब्राउज़र गतिविधि शुरू की जा सकती है या नहीं, अगर इसे शुरू नहीं किया जा सकता है या अपवाद फेंकता है तो बस Intent.ACTION_VIEW के माध्यम से लिंक खोलें।

यहाँ सभी प्रासंगिक कोड है ....

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); 
} 

क्या है openCustomTab(url) आप कहते हैं: यहाँ यह करने के लिए प्रासंगिक कोड है।

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()); 
} 

जवाब का मेरा शैली अहंकारी लग रहे लेकिन मुझे पता है अगर आप किसी भी अप्रत्याशित बग या किसी अन्य समस्या इस दृष्टिकोण कारण हो सकता है कि में चलाने की है जाने downvote क्लिक करने से पहले हो सकता है। अपनी प्रतिक्रिया दें, हम बाद में एक समुदाय हैं।

1

क्रोम की डेवलपर साइट से, मैं निम्नलिखित पाया -

क्रोम 45 के रूप में, Chrome कस्टम टैब अब आम तौर पर सभी Chrome उपयोगकर्ताओं के लिए उपलब्ध है, Chrome द्वारा समर्थित Android संस्करण के सभी पर (जेलीबीन के बाद)।

लिंक: https://developer.chrome.com/multidevice/android/customtabs#whencaniuseit

तो, मैं जाँच की है कि क्या क्रोम संस्करण द्वारा क्रोम कस्टम टैब का समर्थन करता है।

मेरी कोड की जाँच करें:

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 
} 

मैं नहीं जानता कि यह कैसे कुशल है, बस साझा करना चाहते हैं।

संबंधित मुद्दे