ไฟล์แนบอีเมลหลายไฟล์ของ Android โดยใช้ Intent


98

ฉันทำงานกับโปรแกรม Android เพื่อส่งอีเมลพร้อมไฟล์แนบ (ไฟล์รูปภาพไฟล์เสียง ฯลฯ ) โดยใช้ Intent with 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
คุณลืมใส่หัวเรื่องและข้อความอีเมลไปยังจุดประสงค์ มิฉะนั้นขอบคุณสำหรับรหัส
BahadırYağan

5
MIME ที่ถูกต้องชนิดข้อมูลควรจะเป็น "text / plain" และไม่ "ธรรมดา / emailIntent.setType("text/plain");ข้อความ": หากคุณใช้ "ธรรมดา / ข้อความ" Android จะบังคับให้ใช้ GMail เป็นผู้ส่ง แต่ถ้าคุณใช้ "ข้อความ / ธรรมดา" ระบบจะให้กล่องโต้ตอบตัวเลือกแอปพลิเคชันกับ Gmail, Facebook, บลูทู ธ เป็นต้นหากคุณต้องการเสนอเฉพาะโปรแกรมอีเมล ใช้ "text / xml" แทน
Idolon

4
และหากคุณเปลี่ยนบรรทัดสุดท้ายcontext.startActivity(emailIntent);เป็นช่องทำเครื่องหมาย "Use by default for this action" จะปรากฏในกล่องโต้ตอบตัวเลือกแอปพลิเคชันดังนั้นผู้ใช้จะสามารถเลือกแอปพลิเคชันเริ่มต้นสำหรับการส่งอีเมลพร้อมไฟล์แนบหลายไฟล์
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

แม้ว่านี่จะเป็นกระทู้เก่า แต่ตามที่แสดงไว้ด้านบนในการค้นหาของ Google ฉันต้องการเพิ่มคำใบ้เล็ก ๆ เพื่อให้มันเสร็จสมบูรณ์ดังนั้นฉันจึงนิ่งงัน

จำเป็นต้องทำให้ไฟล์ที่แนบสามารถอ่านได้สำหรับกิจกรรมเมลมิฉะนั้นจะไม่ถูกแนบ ดังนั้นคุณต้องโทรไปที่ไหนสักแห่ง

fileIn.setReadable(true, false)

ขอบคุณครับจดหมายไม่สามารถส่งไฟล์แนบได้เฉพาะทางไปรษณีย์
Josejulio

ขอบคุณผู้ชาย! ฉันไม่สามารถส่งรูปภาพโดยไม่มีบรรทัดนี้ได้
konunger

ว้าว! คำตอบนี้ช่วยชีวิตฉันได้ทั้งหมด หากใครได้รับข้อผิดพลาด "ไม่ได้แนบไฟล์หนึ่งไฟล์ขึ้นไป จำกัด 20mb" จากแอป gmail การแก้ไขนี้จะช่วยแก้ปัญหาทุกอย่าง เคล็ดลับที่ดีที่สุด!
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.