Intentを使用したAndroidの複数のメール添付ファイル


98

私は、Intentを使用して添付ファイル(画像ファイル、音声ファイルなど)を添付してメールを送信するAndroidプログラムに取り組んでいますACTION_SEND。電子メールに単一の添付ファイルがある場合、プログラムは機能しています。Intent.putExtra(android.content.Intent.EXTRA_STREAM, uri)指定した画像ファイルをメールに添付して使用してみましたが、Gmailでメールを配信できます。しかし、同じメールにIntent.putExtra(android.content.Intent.EXTRA_STREAM, uri)複数回画像を添付して複数回呼び出してみたところ、うまくいきませんでした。添付ファイルはメールに表示されません。

メールの添付ファイルについてSDKドキュメントとAndroidプログラミングユーザーグループを検索しましたが、関連情報が見つかりません。ただし、ACTION_SEND_MULTIPLE私の要件を満たす可能性のある別のインテント定数(APIレベル4以降で使用可能)があることがわかりました。SDKドキュメントに基づいて、それは単に複数のデータを他の誰かに配信することACTION_SENDを示しており、データが複数であることを除いて、のように機能します。しかし、私はまだこのコマンドの正しい使い方を理解できませんでした。でインテントを宣言してACTION_SEND_MULTIPLEから、putExtra(EXTRA_STREAM, uri)複数回呼び出して複数の画像を添付しようとしましたが、以前と同じように同じエラーが発生し、添付ファイルはメールに表示されません。

誰かが試してみてACTION_SEND_MULTIPLE、複数の電子メール添付ファイルでそれを動作させましたか?


私は同じ問題を抱えています。機能しないコードです。MMSの送信中に同じ問題が発生し、ファイルを1つだけ追加する可能性があります。別の方法でいくつかのアイデアがありますか?

回答:


187

複数の添付ファイルを含むemailIntentを作成するために必要なコードは次のとおりです。

public static void email(Context context, String emailTo, String emailCC,
    String subject, String emailText, List<String> filePaths)
{
    //need to "send multiple" to get more than one attachment
    final Intent emailIntent = new Intent(Intent.ACTION_SEND_MULTIPLE);
    emailIntent.setType("text/plain");
    emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, 
        new String[]{emailTo});
    emailIntent.putExtra(android.content.Intent.EXTRA_CC, 
        new String[]{emailCC});
    emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject); 
    emailIntent.putExtra(Intent.EXTRA_TEXT, emailText);
    //has to be an ArrayList
    ArrayList<Uri> uris = new ArrayList<Uri>();
    //convert from paths to Android friendly Parcelable Uri's
    for (String file : filePaths)
    {
        File fileIn = new File(file);
        Uri u = Uri.fromFile(fileIn);
        uris.add(u);
    }
    emailIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);
    context.startActivity(Intent.createChooser(emailIntent, "Send mail..."));
}

2
件名とemailTextを意図に含めるのを忘れました。それ以外の場合はコードをありがとう。
Bahadırイェーガン

5
正しいMIMEデータタイプは、「プレーン/テキスト」ではなく「テキスト/プレーン」である必要がありますemailIntent.setType("text/plain");。「プレーン/テキスト」を使用する場合、AndroidはGMailを送信者として強制的に使用しますが、「テキスト/プレーン」を使用する場合、Gmail、Facebook、Bluetoothなどのアプリケーション選択ダイアログを提供します。メールプログラムのみを提案する場合代わりに「text / xml」を使用してください。
Idolon、

4
そして、最後の行をcontext.startActivity(emailIntent);チェックボックスに変更すると、「このアクションではデフォルトで使用」がアプリケーション選択ダイアログに表示されるため、ユーザーは複数の添付ファイルを含むメールを送信するためのデフォルトのアプリケーションを選択できるようになります。
Idolon

2
この例では、「AndroidRuntimeException:アクティビティコンテキストの外からstartActivity()を呼び出すにはFLAG_ACTIVITY_NEW_TASKフラグが必要です。これが本当に必要なのですか?」アプリケーションと基本コンテキストの両方をこの電子メールメソッドに渡そうとしましたが、どちらも同じエラーが発生しました。
ravemir

これで解決しましたが、奇妙な方法でエラーをエスケープするかどうかはわかりません。そのため、これについて何か考えがある人のために、ここに前のコメントを残しておきます。
ravemir

29

ACTION_SEND_MULTIPLE アクションでなければなりません

その後 emailIntent.setType("text/plain");

に続く:

ArrayList<Uri> uris = new ArrayList<Uri>();
String[] filePaths = new String[] {"sdcard/sample.png", "sdcard/sample.png"};
for (String file : filePaths)
{
    File fileIn = new File(file);
    Uri u = Uri.fromFile(fileIn);
    uris.add(u);
}
emailIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);
startActivity(emailIntent);

これでうまくいきます。


19

これは古いスレッドですが、グーグル検索の上部に示されているように、それを完全にするために小さなヒントを追加したいので、私はそれに踏み込みました。

添付ファイルをメールアクティビティで読み取り可能にする必要があります。そうしないと、添付されません。だからあなたはどこかに電話する必要があります

fileIn.setReadable(true, false)

ありがとうございます。メールでは添付ファイルを送信できませんでした。
Josejulio 2014年

ありがとう、男!このラインなしでは写真を送信できませんでした
konunger

うわー!この答えは私の一日を完全に救いました。誰かがGmailアプリから「1つ以上のファイルが添付されていません。制限20mb」というエラーを受け取った場合、この修正はすべてを解決します。史上最高のヒント!
ベルフェゴール2016


2

複数の添付ファイルの場合はPutParcelableArrayListExtra(Intent.ExtraStream, uris)、uris変数がList<IParcelable>(). Here である場所を使用します。例は次のとおりです。

var email = new Intent(Intent.ActionSendMultiple);
    email.SetType("text/plain");
    email.PutExtra(Intent.ExtraEmail, new string[]{emailTo});
    email.PutExtra(Intent.ExtraCc, new string[]{emailCC});

    var uris = new List<IParcelable>();
    filePaths.ForEach(file=> {
        var fileIn = new File(file);
        var uri = Android.Net.Uri.FromFile(fileIn);
        uris.Add(uri);
    });

    email.PutParcelableArrayListExtra(Intent.ExtraStream, uris);

    context.StartActivity(Intent.CreateChooser(email, "Send mail..."));

お役に立てれば ;)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.