WebView に代わる Chrome Custom Tabs

URL リンクを踏んで Web サイトを表示する手法として 「外部ブラウザを起動する」もしくは「WebView…

URL リンクを踏んで Web サイトを表示する手法として
「外部ブラウザを起動する」もしくは「WebView を使用する」が主流でした。
ところが、2015/09/02 に Google が Chrome 45 以上で Custom Tabs の利用可能になると発表してから
Web サイトの表示に Custom Tabs を利用するアプリ増えてきているように思います。
情報も出回っているので n 番煎じとはなりますが、改めて確認していきましょう。
 

Chrome Custom Tabs とは


アプリ内で利用できる WebView ではなく Chrome が利用できるようになります。
WebView では機能に制限があったり基本的なブラウザの機能を持たせるのに実装が必要だったりしますし
外部ブラウザに任せるとユーザーにタスクメニューでアプリとブラウザの切り替えを強いることになります。
この2つの良いとこ取りしたのが Chrome Custom Tabs といったところでしょうか。
 

利用方法


使うだけなら数行記述するだけなので非常に簡単にできます。
 
build.gradle

dependencies {
    ...
    compile 'com.android.support:customtabs:23.3.0'
}

 
MainActivity.java

String url = "https://www.google.co.jp/";
CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
CustomTabsIntent customTabsIntent = builder.build();
customTabsIntent.launchUrl(this, Uri.parse(url));

 

実行結果

chrome_custom_tabs_sample
 
ぱっと見たところ、普通に Chrome アプリを開いているのと大差ない感じです。
ただ、これだけだと端末によっては Chrome Custom Tabs ではなく外部ブラウザを起動してしまう場合もあるので
実装ガイドとして Google が公開している shared というライブラリを利用することをオススメします。
shared には Chrome のパッケージ名を取得するメソッドが用意されていますので
直接 Chrome を指定してあげることで外部ブラウザを起動しないようにできます。
そちらのやり方も確認してみましょう。
 

Chrome Custom Tabs を確実に起動させる


まずはこちらから Chrome Custom Tabs のデモコードをクローンします。
今回は shared ライブラリとバージョンを合わせるために Chrome Custom Tabs の本体もここからインポートします。
なので、先程追加した以下の1行を build.gradle から外します。
 

dependencies {
    ...
    compile 'com.android.support:customtabs:23.3.0'
}

 
その後、クローンした custom-tabs-client から customtabs と shared をインポートします。
 
import_module
 
import_custom_tabs import_shared
 
インポートしたら、 ライブラリを依存関係に含めます。
 
build.gradle

dependencies {
    ...
    compile project(':customtabs')
    compile project(':shared')
}

 
準備はこれで完了です。
あとはコードを書いていきます。
 
MainActivity

String url = "https://www.google.co.jp";
String packageName = CustomTabsHelper.getPackageNameToUse(this); // ※1
CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
CustomTabsIntent customTabsIntent = builder.build();
customTabsIntent.intent.setPackage(packageName); // ※2
customTabsIntent.launchUrl(this, Uri.parse(url));

 
Chrome のパッケージ名を取得する行(※1)と設定する行(※2)が追加されています。
これで問題なく Chrome Custom Tabs が動作するようになります。
 

パフォーマンスについて


こちらにもありますが
外部ブラウザ、Custom Tabs、WebView を使った場合で、実行速度に差があるようです。
 
performance
 
これだけ見ても十分利用するには価値のあるものなのではないでしょうか。
他にもボタンや機能を追加できたりするので、Web を利用するときには試してみても良いでしょう。