アプリからメールを起動して、ユーザーが問い合わせメールを送れるようにする方法

 どうも、ケーサンヨーシです。

今回はアプリ開発の話。

私が開発しているゲームアプリで、ユーザーからの問い合わせをメールで受けることにしました。

アプリ内の問い合わせボタンを押すと、インストールされているメールアプリが起動して、送信手前まで来ている状態にしたいです。

ネット上にAPI29までの方法は沢山載っているんですが、それ移行書き方が変わったらしく、新しい方法で記載しないと上手く動きません。

というわけで、私のスマホAndroid11でこれらをできるようにします。開発環境はAndroid Studio、言語はKotlin、所謂ネイティブ開発環境になります。

□■□■□

Androidから別のアプリを起動する場合、Intentというのを使います。アクティビティを変更する時に使用するあれです。

ボタン部分のコードは以下です。

        A.findViewById<View>(R.id.historyDetailInquiry).setOnClickListener{
val intent = Intent(Intent.ACTION_SENDTO).apply {
data = Uri.parse("mailto:")
putExtra(Intent.EXTRA_EMAIL, arrayOf( "ssk.left@gmail.com" ))
putExtra(Intent.EXTRA_SUBJECT, "お問い合わせ")
putExtra(Intent.EXTRA_TEXT,"作者に問い合わせを行います。以下に内容をお書き下さい。\n")
}
if(intent.resolveActivity(A.packageManager)!=null) {
A.startActivity(intent)
}
}

これを丸パクリすると、最初の画像のようにメールアプリが起動する、、、わけじゃないです。

これだけだと、最後のif文のresolveActivityの部分がnullになってしまい、ifの中身が呼ばれません。

これを解決するために、AndroidManifestに以下を追加します。

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

queriesタグは、manifestタグの中、applicationタグと同階層に書いて下さい。

ちなみにSENDTOの部分は、添付ファイルがいくつあるかで変更が必要みたいです。SENDTOは添付ファイルがない場合になります。

詳しくは以下の公式ページを見て下さい。
https://developer.android.com/guide/components/intents-common

なお、公式ページではAndroidManifestをintent-filterでやれって書いてあるんですが、これでやるとなぜか私の環境では、候補のアプリの中に呼び出し元のアプリまで表示されてしまったので、queriesを使う方法でやっています。

おそらく何か根本的かつ初歩的なミスをしていると思われますが、今の所原因が分からないので、queriesを使う方法で対処してます。

□■□■□

というわけで、Androidでメールアプリを呼び出す方法を紹介しました。

どうも、intentっていうやつの仕様がAPI30から変わったのが理由らしいですが、Android11ではそれ以外でも変更が色々あるっぽいので、困った→解決までできたら記事にします。

以上、また会いましょう!

このブログの人気の投稿

動画編集ソフト「Shotcut」で縦向きの動画を横向きにする方法。

Audacityで音声部分のみを自動カットする方法

Android Studioでの動的なLayoutの幅と高さの変更方法