8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

いつの間にかメーラーを起動するIntentの推奨形式が変わっていて件名や本文が入力されなくなっていたので対応した

Posted at

発覚の経緯

普段作っている個人アプリでは、ユーザーからのお問い合わせを送ってもらうためにメールを使っています。

機能としてはただメーラーを開くだけでなく、件名や本文に任意の内容を自動で入力するようにすることで基本的な情報の問診の手間を省いていました。

3年位は問題なくお問い合わせメールが届いていたのですが、ある時から急に件名と本文の入力がないメールが来るようになりました。

最初のうちはユーザーが消してから送ってきたのかなと思っていたのですが、日に日に多くなってくる様子から何か起きていると判断しました。
手元で確認したところ、読みどおりにメールアドレスしか入力されていないメールがGmailで生成されるようになっておりました。

修正方法

before

メールを起動するIntentは随分昔から使っている、インターネットのどこからコピーしてきたかも思い出せないものでした。
このコードでも少なくともいっときまでは問題なく動いていたはずです。

fun createMailIntent(address: String, subject: String, text: String): Intent =
    Intent(Intent.ACTION_SENDTO).apply {
        data = Uri.parse("mailto:$address")
        putExtra(Intent.EXTRA_SUBJECT, subject)
        putExtra(Intent.EXTRA_TEXT, text)
    }

after

何はなくとも困ったときのGoogle公式ドキュメントです。
https://developer.android.com/guide/components/intents-common?hl=ja#Email

いつの間にか Uri#parseに書くべきは"mailto:"までになっており、代わりにアドレスはArray<String>としてIntent#putExtraIntent.EXTRA_EMAILというキーと共に渡すのが推奨形式となっておりました。

というわけで対応するように修正したのが下記のコードになります。

fun createMailIntent(address: String, subject: String, text: String): Intent =
    Intent(Intent.ACTION_SENDTO).apply {
        data = Uri.parse("mailto:")
        putExtra(Intent.EXTRA_EMAIL, arrayOf(address))
        putExtra(Intent.EXTRA_SUBJECT, subject)
        putExtra(Intent.EXTRA_TEXT, text)
    }

おわりに

そもそもお問い合わせの数が多くないことに加え、クラッシュもしていなかったおかげで発見が遅れてしまいました。
また、外部アプリ連携が必須なため、テストの自動化も難しく防ぐ術があったのかは今でも分かりません。
唯一出来たとするならば(当時のGoogleのドキュメントが正しかったかは分かりませんが)どこの馬の骨ともわからないコードを拾ってこずに、まずはGoogleの公式ドキュメントを参考にするくらいかなと思います。

とても地味ではありますが、アプリにメーラーを起動するIntentの処理がある場合一度見直しておくと良いかもしれません。

8
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?