Intent連携でのメール送信とFLAG_ACTIVITY_NEW_TASK

androidからIntentを使って外部Activityを起動するときに、contextがActivity contextじゃないと、AndroidRuntimeExceptionが発生します。

サービスや、独自のアプリケーションクラスからapplication contextを使って、メールクライアントを選択させてメール送信するためにstartActivityを実行したいという用事です。

E/AndroidRuntime(7525): android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?

FLAG_ACTIVITY_NEW_TASKをsetFlagsしてやればいいだけなのですが、その辺から適当にコードをコピーしてくるとハマる場合があります。

問題のコードはこれ。

        Intent intent = new Intent(Intent.ACTION_SEND);
        String[] to = { "hoge@sample.com" };
        intent.putExtra(Intent.EXTRA_EMAIL, to);
        intent.putExtra(Intent.EXTRA_TEXT, "test");
        intent.putExtra(Intent.EXTRA_SUBJECT, "send mail test");
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.setType("message/rfc822");

        context.startActivity(Intent.createChooser(intent, "Choose Email Client"));

一見問題なさそうなのですが、これは結局Intent.createChooserがIntentを返すので、そのIntentに対してフラグを指定しなければいけないということでした。

なので、以下のようにする必要があります。

        Intent intent1 = new Intent(Intent.ACTION_SEND);
        String[] to = { "hoge@sample.com" };
        intent1.putExtra(Intent.EXTRA_EMAIL, to);
        intent1.putExtra(Intent.EXTRA_TEXT, "test");
        intent1.putExtra(Intent.EXTRA_SUBJECT, "send mail test");
        intent1.setType("message/rfc822");

        Intent intent2 = Intent.createChooser(intent1, "Choose Email Client");
        intent2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent2);

android – How can i call startActivity() to use ACTION_SEND from a different class – Stack Overflow


新しく会社作りました!

コメントをどうぞ