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