2012-05-01 24 views
2

添付ファイル付きのメールを送信する際に問題があります。私はJavamailライブラリ(mail.jar、activitation.jar、およびadditional.jar)を使用しています。私は正確にメールを送ることができます。しかし、添付ファイル付きのメールを送ることはできません。私は、データソースが私のファイルのパスを取ったとき、私は問題があると思うのギャラリーから画像を選択し、それが私のファイル名としては、Androidに添付ファイル付きのメールを送信できません

File f = new File("file://" + uri.getPath()); 

をadddedています。あなたは私のコードに多くのより多くの事を見ることができるものは何でも。(私はこの問題を解決してきたし、それは私のコードの最後の状況である)私は私の添付ファイルの閲覧に追加すべての

最初:

Button Add = (Button) findViewById(R.id.btnAdd); 

    Add.setOnClickListener(new Button.OnClickListener() { 
     public void onClick(View view) { 
      onAddAttachment2("image/*"); 

     } 
    }); 

ここに私のonAddAttachment2とonActivityResultコード

private void onAddAttachment2(final String mime_type) { 



      Intent i = new Intent(Intent.ACTION_GET_CONTENT); 
      i.addCategory(Intent.CATEGORY_OPENABLE); 
      i.setType(mime_type); 
      startActivityForResult(Intent.createChooser(i, null), 
        ACTIVITY_REQUEST_PICK_ATTACHMENT); 
     } 

    protected void onActivityResult(int requestCode, int resultCode, 
     Intent imageReturnedIntent) { 

    super.onActivityResult(requestCode, resultCode, imageReturnedIntent); 

    mAttachments = (LinearLayout) findViewById(R.id.attachments); 

    switch (requestCode) { 
    case ACTIVITY_REQUEST_PICK_ATTACHMENT: 

     Uri _uri = imageReturnedIntent.getData(); 

     addAttachment(_uri); 

     Cursor cursor = getContentResolver() 
       .query(_uri, 
         new String[] { android.provider.MediaStore.Images.ImageColumns.DATA }, 
         null, null, null); 
     cursor.moveToFirst(); 
     String imageFilePath = cursor.getString(0); 

      uris.add(imageFilePath); 



     Log.v("imageFilePath", imageFilePath); 
     break; 
    } 
} 

uは私がAddAttachment方法を持っているがあり見ての通りです。ここでは、コードは次のようになります。

private void addAttachment(Uri uri) { 
     addAttachment(uri, null); 
    } 

    private void addAttachment(Uri uri, String contentType) { 
     long size = -1; 
     String name = null; 

     ContentResolver contentResolver = getContentResolver(); 

     Cursor metadataCursor = contentResolver.query(uri, new String[] { 
       OpenableColumns.DISPLAY_NAME, OpenableColumns.SIZE }, null, 
       null, null); 

     if (metadataCursor != null) { 
      try { 
       if (metadataCursor.moveToFirst()) { 
        name = metadataCursor.getString(0); 
        size = metadataCursor.getInt(1); 
       } 
      } finally { 
       metadataCursor.close(); 
      } 
     } 

     if (name == null) { 
      name = uri.getLastPathSegment(); 
     } 

     String usableContentType = contentType; 
     if ((usableContentType == null) 
       || (usableContentType.indexOf('*') != -1)) { 
      usableContentType = contentResolver.getType(uri); 
     } 
     if (usableContentType == null) { 
      usableContentType = getMimeTypeByExtension(name); 
     } 

     if (size <= 0) { 
      String uriString = uri.toString(); 
      if (uriString.startsWith("file://")) { 
       Log.v(LOG_TAG, uriString.substring("file://".length())); 
       File f = new File(uriString.substring("file://".length())); 
       size = f.length(); 
      } else { 
       Log.v(LOG_TAG, "Not a file: " + uriString); 
      } 
     } else { 
      Log.v(LOG_TAG, "old attachment.size: " + size); 
     } 
     Log.v(LOG_TAG, "new attachment.size: " + size); 

     Attachment attachment = new Attachment(); 
     attachment.uri = uri; 
     attachment.contentType = usableContentType; 
     attachment.name = name; 
     attachment.size = size; 

     View view = getLayoutInflater().inflate(
       R.layout.message_compose_attachment, mAttachments, false); 
     TextView nameView = (TextView) view.findViewById(R.id.attachment_name); 
     ImageButton delete = (ImageButton) view 
       .findViewById(R.id.attachment_delete); 
     nameView.setText(attachment.name); 
     delete.setTag(view); 
     view.setTag(attachment); 
     mAttachments.addView(view); 


     delete.setOnClickListener(new Button.OnClickListener() { 
      public void onClick(View view) { 

       uris.remove(view.getTag()); 
       mAttachments.removeView((View) view.getTag()); 


      } 
     }); 
    } 

、最終的に私のMail.javaクラスで私は方法AddAttachmentたプロパティ

static class Attachment implements Serializable { 
     private static final long serialVersionUID = 3642382876618963734L; 
     public String name; 
     public String contentType; 
     public long size; 
     public Uri uri; 
    } 

持つ添付ファイルクラス:私は送信するためにクリックすると

public void addAttachment(String file) throws Exception { 
    BodyPart messageBodyPart = new MimeBodyPart(); 

     FileDataSource source = new FileDataSource(file); 
     messageBodyPart.setDataHandler(new DataHandler(source)); 
     messageBodyPart.setFileName(file); 

    _multipart.addBodyPart(messageBodyPart); 
} 

をボタン、それはアドレスに送信されて書かれています。 私の添付ファイルは表示されません。私はメールを送ったときに何のエラーもありません。 OK最終的に私は解決してきた問題... は最初私は、

ArrayList<String> uris = new ArrayList<String>();を定義した私はそれを使用しました:私は

編集...あなたはこれらの問題の解決策を持っていた願っています!

for (int i = 0; i<uris.size(); i++) 
        { 
        m.addAttachment(uris.get(i).toString()); 
        } 
m.sendコードブロックの前に、最後にそのuris.add(imageFilePath);

のように私のonActivityResult方法、で私は画像を追加しました私Mail.javaクラスで

、そのように示す変更:

public void addAttachment(String file) throws Exception { 
     BodyPart messageBodyPart = new MimeBodyPart(); 

      FileDataSource source = new FileDataSource(file); 
      messageBodyPart.setDataHandler(new DataHandler(source)); 
      messageBodyPart.setFileName(file); 

     _multipart.addBodyPart(messageBodyPart); 
    } 

答えて

1

あり、間違いなくMIMEタイプの問題。あなたは電子メールで添付された画像にしたい場合は、単に

私はあなたがaddAttachmentメソッドに渡している文字列を期待し
private void sendEmail(String[] to,String[] cc,String subject, String message) 
    { 

     ArrayList<Uri> uris = new ArrayList<Uri>(); 


     Uri u = Uri.fromFile(new File(front_image)); 
     Uri u1 = Uri.fromFile(new File(side_image)); 
     uris.add(u); 
     uris.add(u1); 



     Intent emailIntent = new Intent(Intent.ACTION_SEND_MULTIPLE); 
     emailIntent.setData(Uri.parse("mailto:")); 
     emailIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     emailIntent.setType("image/jpg"); 
     emailIntent.putExtra(Intent.EXTRA_EMAIL, to); 
     emailIntent.putExtra(Intent.EXTRA_CC, cc); 
     emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject); 
     emailIntent.putExtra(Intent.EXTRA_TEXT, message); 
     emailIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris); 
     /*emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + show_right_latest_path)); 
     emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + show_right_prev_path)); 
     emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + show_front_latest_path)); 
     emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + show_front_prev_path));*/ 
     startActivity(Intent.createChooser(emailIntent, "Email")); 


    } 
+0

返信ありがとうございます。インテントの使い方では、添付ファイルを追加するときにアプリケーションを選択するように頼まれます。私は添付ファイル付きのメールを送信するための新しいアプリケーションを開発しようとしています。だから私は私のアプリケーションのUIも開発しています。私は意図のない添付ファイルでメールを送信しようとします。 – yiddow

0

は、ファイル名ではなく、URLで使用してこれを送信することができます(つまり、始まりません"ファイル:")。

問題をデバッグするには、FileInputStreamを使用するコードをaddAttachmentメソッドに追加し、ファイル内のデータを読み取ることができるかどうかを確認します。あなたができない場合、JavaMailはどちらにもできません。

また、セッションデバッグをオンにして、プロトコルトレースを調べて、実際に送信されているJavaMailを確認します。それはより多くの手がかりを提供するかもしれない。または、実際にメッセージを送信するコードでは、msg.writeTo(new FileOutputStream( "msg.txt"))を追加し、ファイルに書き込まれた内容を確認します。

+0

返信ありがとうBill Shannon。私は昨日記事を編集して問題を解決しました。しかし、ソリューションの後で私のコードを編集した、Mail.javaのaddAttachmentメソッド、私は 'ファイル'にファイルの変数 '文字列'を変更しました。その結果、添付ファイル付きのメールが「宛先」アドレスに到達したとき、その名前はファイル名と明確に同じ名前になります。 – yiddow

関連する問題