〈kotlin〉Android studio使い方メモ6:intent

金宏和實さんの「作ればわかる!Androidプログラミング kotlin対応」を参考に
Android studioでkotlinを使ってAndroidアプリ作成。

作成したアプリからメールアプリを起動する設定で、
仕様が変更になり動作しなかった部分があった。

明示的インテントと暗黙的インテント

明示的インテント
開きたいアクティビティを自分で指定する。
大抵は自分のアプリ内で新しいアクティビティを実行する時に使う。

暗黙的インテント
開くアクティビティを指定せず、どのアクティビティを開くかはAndroidにお任せする。
intentオブジェクトでactionを指定しると、それが実行できるアプリが立ち上がる。

動作しなかったコード
val subject = "title"
val text = "text"
val uri = Uri.fromParts("mailto",  "address@gmail.com",  null)
val intent = Intent(Intent.ACTION_SENDTO, uri)
intent.putExtra(Intent.EXTRA_SUBJECT, subject)
intent.putExtra(Intent.EXTRA_TEXT, text)

if(intent.resolveActivity(packageManager) != null) {
    startActivity(intent)
}
  • intent.resolveActivity(packageManager)がnullを返し、gmailが起動できない。
  • startActivity(intent)を実行してもタイトルと本文にテキストが表示されない。
intent.resolveActivity()メソッドの変更

Android11より、アプリが別のアプリに対してクエリまたは操作を行う方法が変更されていた。
そのままでは他のアプリにアクセスできずnullを返してしまうため、
AndroidManifestに要素を定義する必要がある。
queriesタグ内では、packageタグ、intentタグ、providerタグによって
他のアプリを指定できる。

<manifest>
    <queries>
        <intent>
            <action android:name="android.intent.action.SENDTO" />
            <data android:scheme="mailto" />
        </intent>
    </queries>
</manifest>

intentタグの制限

  • action タグが1つだけ必須
  • data タグはmimeType、scheme、hostの各属性を 1 回だけ使用できる

これでメールアプリを起動できるようになった。

参考https://developer.android.com/training/package-visibility/declaring?hl=ja


インテントの書き方の変更
val intent = Intent(Intent.ACTION_SENDTO).apply {
    data = Uri.parse("mailto:")
    val subject = "title"
    val text = "text"
    putExtra(Intent.EXTRA_EMAIL, arrayOf( "address@gmail.com" ))
    putExtra(Intent.EXTRA_SUBJECT, subject)
    putExtra(Intent.EXTRA_TEXT, text)
} 

if(intent.resolveActivity(packageManager) != null) {
    startActivity(intent)
}

変更したこと

  • Uri.parseには"mailto:"のみを書く
  • アドレスはEXTRA_EMAILで格納する
  • スコープ関数applyを使った書き方にした

これでタイトルと本文にテキストが入力された状態でメールアプリが起動するようになった。

参考https://developer.android.com/guide/components/intents-common?hl=ja
  https://developer.android.com/guide/components/intents-common?hl=ja#Email