しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

intent-filterについて調べてみる

Androidアプリ開発でAndroidManifest.xmlに出てくるintent-filterがよく分かってないので調べてみました。
今回は下の公式ドキュメント参考に調査しました。

developer.android.com

intent-filterとはActivityの振る舞いを決めるものです。
intent-filterにテキスト受け取りができる事を書けば他アプリからテキストを受け取る事ができたりします。

試しに他アプリからテキストを受け取れるActivityを作ってみます。
名前はMainActivity2としました。

Activityの宣言は下の通りです。
intent-filterのnameで送信(android.intent.action.SEND)、mimeTypeでデータの種類を宣言することで他アプリからデータを受け取る事が可能です。
categoryはandroid.intent.category.DEFAULTを指定しています。
これは暗黙的Intentがデフォルトでセットするカテゴリーなので、ない場合はActivityを見つけられなくなります。

<activity
    android:name=".MainActivity2"
    android:exported="true"
    android:label="@string/title_activity_main2"
    android:theme="@style/Theme.MyApp.NoActionBar">

    <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="text/*"/>
    </intent-filter>
</activity>

試しにテキストを共有したら下のように表示されました。

送られたテキストはActivity側で下のように記述する事で受け取れます。

val text = intent.extras?.get(Intent.EXTRA_TEXT)

extrasのキー一覧は下の形で取得できます。

intent.extras?.keySet()

それと外部からのデータを受け取る時はandroid:exportedをtrueにしておく必要があります。
これがないと下のようなアクセスが許可されていないというエラーが出ます。

java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.SEND typ=text/plain flg=0x13080001 cmp=com.example.myapp/.MainActivity2 clip={text/plain {...}} (has extras) } from ProcessRecord{36f0825 9536:com.android.chrome/u0a143} (pid=9536, uid=10143) not exported from uid 10183

逆にデータを送りたい場合は下のように記述します。

val sendIntent = Intent().apply {
    action = Intent.ACTION_SEND
    putExtra(Intent.EXTRA_TEXT, "テストテキスト")
    type = "text/plain"
}
startActivity(Intent.createChooser(sendIntent, null))

intent-filterではschemeの指定も可能です。
これを使えばWEBサイトからActivityへ飛ぶこともできます。

<intent-filter>
    <action android:name="android.intent.action.VIEW"/>
    <data android:scheme="example" android:host="example_host" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>