2015-09-18 15 views
9

Aplikacja ma aktywność, aby wyświetlić zawartość konkretnej witryny, np. "example.com". Tak, aby pokazać zawartość „example.com/product/123” wewnątrz aplikacji mam filtr zamiar:Niestandardowe zakładki przeglądarki Chrome i filtr intencji

<activity 
    android:name=".LinkInterceptorActivity"> 
    <intent-filter android:priority="999"> 
     <action android:name="android.intent.action.VIEW" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
     <category android:name="android.intent.category.BROWSABLE" /> 
     <data 
       android:host="www.example.com" 
       android:scheme="http" /> 
    </intent-filter>  
</activity> 

Jednak w niektórych przypadkach muszę pokazać tę zawartość w przeglądarce, więc postanowiłem wykorzystać chrom zwyczaj karty, aby przyspieszyć i utrzymać użytkownika w aplikacji. Próbowałem użyć konstruktora zamiaru pokazać URL w zakładkach z niestandardowych:

new CustomTabsIntent.Builder().build().launchUrl(activity, url);

Ale to pokazuje mi „Complete działanie za pomocą ...” okno, w którym widzę moją aplikację i wszystkich przeglądarek na urządzeniu. Jeśli wybiorę moją aplikację, przeskoczy ona do pętli i ponownie wyświetli okno dialogowe, ale jeśli wybiorę chrome, działa zgodnie z oczekiwaniami.

Pytanie brzmi, jak utworzyć wyraźne zamierzenie dla niestandardowych zakładek Chrome?

Odpowiedz

10

Można użyć setPackage:

String PACKAGE_NAME = "com.android.chrome"; 

CustomTabsIntent customTabsIntent = new CustomTabsIntent.Builder().build(); 
customTabsIntent.intent.setData(uri); 

PackageManager packageManager = getPackageManager(); 
List<ResolveInfo> resolveInfoList = packageManager.queryIntentActivities(customTabsIntent.intent, PackageManager.MATCH_DEFAULT_ONLY); 

for (ResolveInfo resolveInfo : resolveInfoList) { 
    String packageName = resolveInfo.activityInfo.packageName; 
    if (TextUtils.equals(packageName, PACKAGE_NAME)) 
     customTabsIntent.intent.setPackage(PACKAGE_NAME); 
} 

customTabsIntent.launchUrl(this, uri); 
+0

Więc co z chromowanymi wersjach wcześniejszych 45? –

+0

Z wersją wcześniejszą niż 45 jest otwarta bezpośrednio w samodzielnej przeglądarce Chrome. –

+0

Świetnie, dodałbym dodatkowy kod do sprawdzenia pakietu przed otwarciem, ale to podejście jest wspaniałe, dziękuję! –

6

Użyłem @Mattia MAESTRINI za odpowiedź, ale myślę, że niektórzy mogą być musimy zmienić

już zainstalowany najnowszy Chrome (Aktualizacja 08 sierpnia 2016) w moim Nexusie 5 (6.0.1)

ale ja nie otrzymuję pakietu Chrome „com.android.chrome” w resolveInfoList mam robić zmiany, to działa dobrze na moim telefonie

packageManager.queryIntentActivities(customTabsIntent.intent, PackageManager.MATCH_DEFAULT_ONLY); 

powyżej zapytania nie dając mi zapakować nazwę Chrome

 String PACKAGE_NAME = "com.android.chrome"; 

     CustomTabsIntent customTabsIntent = new CustomTabsIntent.Builder().build(); 
     customTabsIntent.intent.setData(Uri.parse(url)); 

     PackageManager packageManager = getPackageManager(); 
     List<ApplicationInfo> resolveInfoList = packageManager.getInstalledApplications(PackageManager.GET_META_DATA); 

     for (ApplicationInfo applicationInfo : resolveInfoList) { 
      String packageName = applicationInfo.packageName; 
      if (TextUtils.equals(packageName, PACKAGE_NAME)) { 
       customTabsIntent.intent.setPackage(PACKAGE_NAME); 
       break; 
      } 
     } 

     customTabsIntent.launchUrl(this, Uri.parse(url)); 

Ja testowałem powyższy kod i to działa dobrze na moim telefonie

Powiązane problemy