2017-02-16 88 views
0

雖然附加圖像文件隨着JavaMail的獲取FileNotFoundException異常打開失敗:ENOENT(沒有這樣的文件或目錄)在這裏是有顯示例外,我試過,但未能解決這個問題java.io.FileNotFoundException:/繪製:/ 2130837597:打開失敗:ENOENT(沒有這樣的文件或目錄)在附加文件,電子郵件

LogResult

E/SendMail: IOException while sending message 
javax.mail.MessagingException: IOException while sending message; 
    nested exception is: 
    java.io.FileNotFoundException: /drawable:/2130837597: open failed: ENOENT (No such file or directory) 
    at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:676) 
    at javax.mail.Transport.send0(Transport.java:189) 
    at javax.mail.Transport.send(Transport.java:118) 
    at io.farooq.check.GMailSender.sendMail(GMailSender.java:81) 
    at io.farooq.check.MainActivity$1$1.run(MainActivity.java:74) 
    at java.lang.Thread.run(Thread.java:841) 
Caused by: java.io.FileNotFoundException: /drawable:/2130837597: open failed: ENOENT (No such file or directory) 
    at libcore.io.IoBridge.open(IoBridge.java:409) 
    at java.io.FileInputStream.<init>(FileInputStream.java:78) 
    at javax.activation.FileDataSource.getInputStream(FileDataSource.java:110) 
    at javax.activation.DataHandler.writeTo(DataHandler.java:318) 
    at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1403) 
    at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:874) 
    at javax.mail.internet.MimeMultipart.writeTo(MimeMultipart.java:444) 
    at com.sun.mail.handlers.multipart_mixed.writeTo(multipart_mixed.java:102) 
    at javax.activation.ObjectDataContentHandler.writeTo(DataHandler.java:897) 
    at javax.activation.DataHandler.writeTo(DataHandler.java:330) 
    at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1403) 
    at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1745) 
    at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:636) 
    at javax.mail.Transport.send0(Transport.java:189)  
    at javax.mail.Transport.send(Transport.java:118)  
    at io.farooq.check.GMailSender.sendMail(GMailSender.java:81)  
    at io.farooq.check.MainActivity$1$1.run(MainActivity.java:74)  
    at java.lang.Thread.run(Thread.java:841)  
Caused by: libcore.io.ErrnoException: open failed: ENOENT (No such file or directory) 
    at libcore.io.Posix.open(Native Method) 
    at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110) 
    at libcore.io.IoBridge.open(IoBridge.java:393) 
    at java.io.FileInputStream.<init>(FileInputStream.java:78)  
    at javax.activation.FileDataSource.getInputStream(FileDataSource.java:110)  
    at javax.activation.DataHandler.writeTo(DataHandler.java:318)  
    at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1403)  
    at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:874)  
    at javax.mail.internet.MimeMultipart.writeTo(MimeMultipart.java:444)  
    at com.sun.mail.handlers.multipart_mixed.writeTo(multipart_mixed.java:102)  
    at javax.activation.ObjectDataContentHandler.writeTo(DataHandler.java:897)  
    at javax.activation.DataHandler.writeTo(DataHandler.java:330)  
    at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1403)  
    at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1745)  
    at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:636)  
    at javax.mail.Transport.send0(Transport.java:189)  
    at javax.mail.Transport.send(Transport.java:118)  
    at io.farooq.check.GMailSender.sendMail(GMailSender.java:81)  
    at io.farooq.check.MainActivity$1$1.run(MainActivity.java:74)  
    at java.lang.Thread.run(Thread.java:841)  

Gmailsender.java

public class GMailSender extends javax.mail.Authenticator { 
    private String mailhost = "smtp.gmail.com"; 
    private String user; 
    private String password; 
    private Session session; 
    private Multipart _multipart = new MimeMultipart(); 

    static { 
     Security.addProvider(new JSSEProvider()); 
    } 

    public GMailSender(String user, String password) { 
     this.user = user; 
     this.password = password; 

     Properties props = new Properties(); 
     props.setProperty("mail.transport.protocol", "smtp"); 
     props.setProperty("mail.host", mailhost); 
     props.put("mail.smtp.auth", "true"); 
     props.put("mail.smtp.port", "465"); 
     props.put("mail.smtp.socketFactory.port", "465"); 
     props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
     props.put("mail.smtp.socketFactory.fallback", "false"); 
     props.setProperty("mail.smtp.quitwait", "false"); 

     session = Session.getDefaultInstance(props, this); 
    } 

    protected PasswordAuthentication getPasswordAuthentication() { 
     return new PasswordAuthentication(user, password); 
    } 

    public synchronized void sendMail(String subject, String body, 
             String sender, String recipients) throws Exception { 

     MimeMessage message = new MimeMessage(session); 

     // DataHandler handler = new DataHandler(new ByteArrayDataSource(body.getBytes(), "text/plain")); 

     message.setSender(new InternetAddress(sender)); 
     message.setSubject(subject); 

     // message.setDataHandler(handler); 


     BodyPart messageBodyPart = new MimeBodyPart(); 

     messageBodyPart.setText(body); 

     _multipart.addBodyPart(messageBodyPart); 


     if (recipients.indexOf(',') > 0) 
      message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipients)); 
     else 
      message.setRecipient(Message.RecipientType.TO, new InternetAddress(recipients)); 

     message.setContent(_multipart); 

     Transport.send(message); 
    } 


    public void AddAttachment(String Path) throws MessagingException { 


     BodyPart messageBodyPart = new MimeBodyPart(); 
     DataSource source = new FileDataSource(Path); 
     messageBodyPart.setDataHandler(new DataHandler(source)); 
     messageBodyPart.setFileName(Path); 
     _multipart.addBodyPart(messageBodyPart); 

    } 


} 

MainActivity.java

public class MainActivity extends AppCompatActivity { 

    String FilePath; 
    final int PICK_IMAGE=0; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 


     Intent intent = new Intent(); 
     intent.setType("image/*"); 
     intent.setAction(Intent.ACTION_GET_CONTENT); 
     startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE); 

     work(); 


    } 
    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     Toast.makeText(MainActivity.this,"File Path =" +FilePath,Toast.LENGTH_LONG).show(); 
     if ((requestCode == 0) && (resultCode == -1)) { 
      FilePath=data.getData().getpath(); 

     } 
    } 

    public void work() 
    { 


     click.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 

       new Thread(new Runnable() { 

        @Override 
        public void run() { 
         // final String imageUri = "drawable://" + R.drawable.write; 

         try { 
          GMailSender sender = new GMailSender("[email protected]","Password"); 
          try{ 
          sender.AddAttachment(FilePath); 
          } 
          catch (Exception e){ 
           Log.e(" Attachment !!!", e.getMessage(), e); 
          } 
          sender.sendMail(one.getText().toString(),two.getText().toString(), 
            "[email protected]", "[email protected]"); 

         } catch (Exception e) { 
          Log.e("SendMail", e.getMessage(), e); 
         } 
        } 

       }).start(); 
      } 
     }); 


    } 


} 

我嘗試了許多代碼,但都造成了同樣的錯誤 像drawble獲得的圖像或從SD卡中選擇

我試過了

FilePath=data.getData().getPath(); 

第二

Uri imageUri = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + 
         "://" + getApplicationContext().getResources().getResourcePackageName(R.drawable.write)); 

FilePath=Environment.getExternalStorageDirectory().getPath()+ imageUri.toString()+".jpg"; 

File myFile = new File(FilePath); 
     FilePath=Environment.getExternalStorageDirectory().getPath()+ myFile.getAbsolutePath()+".jpg"; 

String imageUri = "/drawable://" + R.drawable.write; 
     FilePath=Environment.getExternalStorageDirectory().getPath()+imageUri+".jpg"; 

沒有什麼工作,我得到同樣的錯誤:(幫助!

+0

您不必大寫每一個字。它看起來很愚蠢。就像其他人所做的一樣,謝謝。 – EJP

+0

它只是我的寫作風格好的,我會避免下一次thnku :) –

回答

0

退房這個問題:How to get the file path from URI? 這裏的關鍵是,你需要將文件路徑傳遞給FileDataSource。在Windows上它應該像「C:/mypath/myfile.ext」。在linux上:「/home/user/path/myfile.ext」。所以,你需要將你的URI轉換成真實的文件路徑。

我建議嘗試在我提到的問題中提到的方法:

File myFile = new File(uri.getPath()); 
myFile.getAbsolutePath() 
+0

先生相同** java.io.FileNotFoundException:/ drawable:/ 2130837597 ** j With:File myFile = new File(uri.getPath( )); String **路徑** j = myFile。getAbsolutePath(); –

+0

您可能想要更正圖像的路徑:http://stackoverflow.com/a/6606163/562970 它是資源中的drawable嗎? – Igor

+0

先生連我選擇一個圖像文件從存儲使用 '意圖intent = new Intent(); intent.setType(「image/*」); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(Intent.createChooser(意向, 「選擇圖片」),PICK_IMAGE);' 而** ** onActivityResult '公共無效onActivityResult(INT requestCode,INT resultCode爲,意圖數據) URI路徑= data.getData (); File myFile = new File(path.getPath()); FilePath = myFile.getAbsolutePath();' 相同** FileNotFoundException:/ document/image:23 ** –