2015-09-18 2 views
9

このアプリケーションには、特定のウェブサイトのコンテンツを表示するアクティビティがあります。 "example.com"だから私はインテントフィルタを持っているアプリ内の「example.com/product/123」の内容表示する:Chromeのカスタムタブとインテントフィルタ

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

をしかし、いくつかのケースでは、私は、ブラウザにこのコンテンツを表示する必要があるので、私はクロームカスタムを使用することにしましたタブを使用すると、アプリをより速くしてユーザーをアプリ内に置くことができます。 は、私はカスタムタブのURLを表示するように意図ビルダーを使用しようとしました:

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

しかし、それは私が私のアプリとデバイス上のすべてのブラウザを参照ダイアログ「を...使用して完全なアクション」私を示しています。私のアプリを選択すると、ループにジャンプして再びダイアログが表示されますが、クロムを選択すると期待通りに機能します。

Chromeのカスタムタブで明示的なインテントを作成するにはどうすればいいですか?

答えて

10

あなたは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

自分の携帯電話上で正常に動作している?私はクローム

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

の名前をパッケージ与えていませんか –

+0

バージョン45より前のバージョンでは、スタンドアロンのChromeブラウザで直接開くことができます。 –

+0

すばらしいですが、これを開く前にパッケージをチェックするための追加コードを追加します。 –

6

私は@Mattia Maestriniの回答を使用している、しかし、私はいくつかは、私たちは、私がすでにインストールされている

を変更する必要があるかもしれないと思う最新のクロム(2016年8月8日、更新しました)私のネクサス5(6.0.1)

私はresolveInfoListにクロームパッケージ「com.android.chrome」を取得していないです、私は変更を行う必要があり、それが

自分の携帯電話上で正常に動作していますクエリ上記
packageManager.queryIntentActivities(customTabsIntent.intent, PackageManager.MATCH_DEFAULT_ONLY); 

は、私は、コードの上にテストしていると、それはクロームバージョンについてそれでは、前45

関連する問題