Chromeでテキスト選択から自作アプリを起動したい
android 8.0より、スマートテキスト選択という機能が利用できます。
この機能により、テキストを選択した際フローティングツールバーにテキストの書式に応じたメニューが表示できるようになりました(下図2番目参照)。
Chromeはスマートテキスト選択を利用しているようで、例えば住所を示すテキストを選択するとフローティングツールバーのメニューに地図が表示されます。そして、地図をクリックするとGoogle Mapが起動し、その住所が検索されて表示されます。

このように、スマートテキスト選択は、選択したテキストに応じたアプリの起動を促すことができたり、入力の手間が省けたりとユーザの使い勝手を良くすることができます。
ここからが本題なのですが、今回はChromeでテキスト選択した時に自作のアプリを起動する方法について紹介します。
Chromeで色々と試したところ、選択したテキストが次の書式の場合にアプリを起動するメニューが表示されました。(他にもあるかもしれません。)
- 電話番号
- 住所
- メールアドレス
- その他
フローティングツールバーからのアプリ起動は、暗黙的インテントが利用されています。従って、任意のアプリを起動させようとするとマニフェストファイルのintent-filterタグの設定が肝となります。
intent-filterについてですが、例えばChromeではフローティングツールバーの地図をクリックした場合、地図アプリが起動するように動作しています。さて、スマホ内に存在するアプリから地図アプリをどのように探しているのでしょうか。この辺はandroidが適当に処理してくれるのですが、仕組みとしてはintent-filterタグの設定をみて、地図アプリか判断していることになります。
intent-filter の設定ですが、下記の設定を組み込むと選択したテキストが電話番号/ 住所/メールアドレス/その他で、それぞれのActivityでアプリを起動することができます。肝はintent-filterの設定ですので、他の設定は適宜変更する必要があります。
参考までに、動作確認で使用したソースコード一式をGitHubにあげています。マニフェストは上記のものを組み込んでいます。アプリがどのActivityで起動したか判断できるようにするため、それぞれのActivityでTextVeiwに電話番号/住所/メールアドレス/その他のいずれかと、選択されたテキストをセットする処理を入れています。
こんな感じに動作します。


かなり前からある機能ですが、共有から別のアプリを起動することも可能です。しかし、選択したテキストが自分のアプリでは扱わない書式だった場合には起動候補のアプリから外したい、共有のカテゴリとは別に表示したいこともあると思い色々と調べてみました。
ちなみに、共有については次の記事で紹介していますので、ご興味あれば参照してみてください。
実はその他の(テキストの書式を問わない)intent-filterの設定を探すのに苦労しました。デバッグ時エミュレータに「API DEOMS」と表示されることから気づきを得て、ソースコードを探り設定を見つけたのですが、後から下記の記事に設定の説明があることがわかりました。。。android 6.0から利用可能なようです。スマートテキスト選択とは関係がなかったです。
