Android将多个文件从SD卡附加到电子邮件

时间:2011-07-11 17:13:50

标签: android email attachment multiple-files

如何在android中的电子邮件中附加多个文件? 多个文件附加到意图是否需要任何权限? 我正在尝试使用putParcelableArrayListExtra(Intent.EXTRA_STREAM,ArrayList uriList)方法,但仍然怀疑Uri类是否是<?扩展Parcelable>或不。 我无法将任何文件附加到电子邮件中。

这是我的代码::

Intent sendIntent = new Intent(Intent.ACTION_SEND_MULTIPLE);
sendIntent.setType("plain/text");
sendIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"soubhabpathak2010@gmail.com"});
sendIntent.putExtra(Intent.EXTRA_SUBJECT, "Accident Capture");
sendIntent.putExtra(Intent.EXTRA_TEXT, emailBody);

ArrayList<Uri> uriList = getUriListForImages();
sendIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uriList);
Log.d(TAG, "Size of the ArrayList :: " +uriList.size());
FormHolderActivity.this.startActivity(Intent.createChooser(sendIntent, "Email:"));

和getUriListForImages()此方法定义为下面的-----


private ArrayList<Uri> getUriListForImages()  {

    ArrayList<Uri> uriList = new ArrayList<Uri>();
    String imageDirectoryPath =  Environment.getExternalStorageDirectory().getAbsolutePath()+ "/accident/";
    File imageDirectory = new File(imageDirectoryPath);
    String[] fileList = imageDirectory.list();

    if(fileList.length != 0) {
        for(int i=0; i<fileList.length; i++)
        {
            String file = "file://" + imageDirectoryPath + fileList[i];
            Log.d(TAG, "File name for Uri :: " + file);
            Uri uriFile = Uri.parse(file);
            uriList.add(uriFile);
            Log.d(TAG, "Image File for Uri :: " +(file));

        }
    }
    return uriList;
}

电子邮件的主题和正文即将到来,我在SD卡的事故文件夹中有图像(我正在使用2.1 API级别7)但是没有任何附加,即使在logcat中也没有异常.Arraylist也可以(表示长度OK,文件名也可以)。任何人都可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:6)

经过1天的工作,我终于可以将多个图像文件从\ sdcard \ accident \ folder附加到电子邮件客户端。为了附加多个文件,我必须将图像添加到ContentResolver,后者负责图库图像提供程序。 这是完整的代码---

Intent sendIntent = new Intent(Intent.ACTION_SEND_MULTIPLE);
sendIntent.setType("plain/text");
sendIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"soubhabpathak2010@gmail.com"});
sendIntent.putExtra(Intent.EXTRA_SUBJECT, "Accident Capture");
sendIntent.putExtra(Intent.EXTRA_TEXT, emailBody);

ArrayList<Uri> uriList = getUriListForImages();
sendIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uriList);
Log.d(TAG, "Size of the ArrayList :: " +uriList.size());
FormHolderActivity.this.startActivity(Intent.createChooser(sendIntent, "Email:"));

所以Code的第一部分没有变化 - 但是更改是在getUriListForImages()方法中,如下所示---



    private ArrayList<Uri> getUriListForImages() throws Exception {
                ArrayList<Uri> myList = new ArrayList<Uri>();
                String imageDirectoryPath = Environment.getExternalStorageDirectory().getAbsolutePath()+ "/accident/";
                File imageDirectory = new File(imageDirectoryPath);
                String[] fileList = imageDirectory.list();
                if(fileList.length != 0) {
                    for(int i=0; i<fileList.length; i++)
                    {   
                        try 
                        {   
                            ContentValues values = new ContentValues(7);
                            values.put(Images.Media.TITLE, fileList[i]);
                            values.put(Images.Media.DISPLAY_NAME, fileList[i]);
                            values.put(Images.Media.DATE_TAKEN, new Date().getTime());
                            values.put(Images.Media.MIME_TYPE, "image/jpeg");
                            values.put(Images.ImageColumns.BUCKET_ID, imageDirectoryPath.hashCode());
                            values.put(Images.ImageColumns.BUCKET_DISPLAY_NAME, fileList[i]);
                            values.put("_data", imageDirectoryPath + fileList[i]);
                            ContentResolver contentResolver = getApplicationContext().getContentResolver();
                            Uri uri = contentResolver.insert(Images.Media.EXTERNAL_CONTENT_URI, values);
                            myList.add(uri);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
                return myList;
            } 

这很好用,我可以将多个图像文件附加到模拟器默认电子邮件客户端并成功发送。

答案 1 :(得分:1)

EXTRA_STREAM说:

A content: URI holding a stream of data associated with the Intent, used with 
ACTION_SEND to supply the data being sent.
Constant Value: "android.intent.extra.STREAM"

您无法传递一组file URI:它会忽略结果(正如您所观察到的那样)。

编辑:划伤。我错了。这是处理多个文件的标准Android电子邮件客户端中的一大块代码。

if (Intent.ACTION_SEND_MULTIPLE.equals(mAction)
                 && intent.hasExtra(Intent.EXTRA_STREAM)) {
             ArrayList<Parcelable> list = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
             if (list != null) {
                 for (Parcelable parcelable : list) {
                     Uri uri = (Uri) parcelable;
                     if (uri != null) {
                         Attachment attachment = loadAttachmentInfo(uri);
                         if (MimeUtility.mimeTypeMatches(attachment.mMimeType,
                                 Email.ACCEPTABLE_ATTACHMENT_SEND_INTENT_TYPES)) {
                             addAttachment(attachment);
                         }
                     }
                 }
             }
         }

尝试这样做:

private ArrayList<Parcelable> getUriListForImages()  {
    ArrayList<Parcelable> uriList = new ArrayList<Parcelable>();

    String imageDirectoryPath =  Environment.getExternalStorageDirectory().getAbsolutePath()+ "/accident/";
    File imageDirectory = new File(imageDirectoryPath);
    String[] fileList = imageDirectory.list();

    if(fileList.length != 0) {
        for(int i=0; i<fileList.length; i++)
        {
            String file = "file://" + imageDirectoryPath + fileList[i];
            Log.d(TAG, "File name for Uri :: " + file);
            Uri uriFile = Uri.parse(file);
            uriList.add(uriFile);
            Log.d(TAG, "Image File for Uri :: " +(file));

        }
    }
    return uriList;
}