2011-07-11 15 views
4

複数のファイルをアンドロイドで電子メールに添付するにはどうすればいいですか? 複数のファイルをインテントに添付するためのアクセス許可は必要ですか? 私はputParcelableArrayListExtra(Intent.EXTRA_STREAM、ArrayList uriList)メソッドを試していますが、Uriクラスが<かどうかはまだ疑いがありますか? Parcelable >を拡張します。 メールにファイルを添付できません。複数のファイルをsdcardからメールに添付するAndroid

このは私のコード::

Intent sendIntent = new Intent(Intent.ACTION_SEND_MULTIPLE); 
sendIntent.setType("plain/text"); 
sendIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"[email protected]"}); 
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; 
} 

に、件名とメールの本文は来ています私はsdcardの事故フォルダに画像を持っています(私は2.1のAPIレベル7を使用しています)が、logcat.Arraylistにも例外はありませんが、何も付いていませんもOKです(長さOKとファイル名もOKです)。誰も私がこの問題を解決するのを助けることができますか?

答えて

6

1日の仕事の後、最後に私は、クライアントを電子メールで送信するには、\ \のSDカードの\事故からフォルダを複数の画像ファイルを添付することができています。複数のファイルを添付するために、私はGalleryResolverを担当するContentResolverにイメージを追加しなければなりませんでした。 ここでは完全なコードがある---

Intent sendIntent = new Intent(Intent.ACTION_SEND_MULTIPLE); 
sendIntent.setType("plain/text"); 
sendIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"[email protected]"}); 
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() 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

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のセットを渡すことはできません。(あなたが観察しているように)それは単に結果を無視します。

EDIT:傷があります。私は間違っていた。これは、複数のファイルを処理する標準の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; 
} 
+0

次に、複数のファイルを添付するにはどうすればいいですか?それは何ですか?それ以外の方法はありますか? –

関連する問題