인 텐트를 사용하는 Android 다중 이메일 첨부 파일


98

나는 인 텐트를 사용하여 첨부 파일 (이미지 파일, 오디오 파일 등)이있는 이메일을 보내는 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를 보내는 동안 동일한 문제가 존재하며 하나의 파일 만 추가 할 수 있습니다. 다른 방법으로 그것에 대한 몇 가지 아이디어가 있습니까?

답변:


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 Yağan 2011

5
올바른 MIME 데이터 유형은 "plain / text"가 아니라 "text / plain"이어야합니다 : emailIntent.setType("text/plain");. "일반 / 텍스트"를 사용하는 경우 Android는 강제로 GMail을 보낸 사람으로 사용하지만 "텍스트 / 일반"을 사용하면 Gmail, Facebook, Bluetooth 등의 응용 프로그램 선택 대화 상자를 제공합니다. 메일 프로그램 만 제안하려는 경우 대신 "text / xml"을 사용하십시오.
Idolon

4
마지막 줄을 context.startActivity(emailIntent);"이 작업에 기본적으로 사용"확인란으로 변경 하면 응용 프로그램 선택기 대화 상자에 표시되므로 사용자는 여러 첨부 파일이있는 이메일을 보내기위한 기본 응용 프로그램을 선택할 수 있습니다.
Idolon

2
이 예제는 "AndroidRuntimeException : Activity 컨텍스트 외부에서 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

이것은 오래된 스레드이지만 Google 검색에서 맨 위에 표시되므로 완료하기 위해 작은 힌트를 추가하고 싶기 때문에 난처했습니다.

메일 활동을 위해 첨부 파일을 읽을 수 있도록해야합니다. 그렇지 않으면 첨부되지 않습니다. 그래서 당신은 어딘가에 전화해야

fileIn.setReadable(true, false)

감사합니다. 메일은 첨부 파일 만 보낼 수 없었습니다.
Josejulio

고마워요! 나는이 선없이 전송되는 사진을 만들 수 없습니다
konunger

와! 이 대답은 내 하루를 완전히 구했습니다. 누군가 Gmail 앱에서 "하나 이상의 파일이 첨부되지 않았습니다. 제한 20MB"오류가 발생하면이 수정으로 모든 문제가 해결됩니다. 최고의 팁!
belphegor


2

여러 첨부 파일의 경우 PutParcelableArrayListExtra(Intent.ExtraStream, uris)uris 변수가있는 List<IParcelable>(). 경우 사용 예 는 다음과 같습니다.

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.