Java MailJob-Android studio中附加的图像

Java MailJob-Android studio中附加的图像,java,android,email,Java,Android,Email,我实现了一个MailJob类来发送电子邮件,效果很好。我还需要发送附加图像,但它不工作 这是我实现的代码 class MailJob extends AsyncTask<MailJob.Mail,Void,Void> { private final String user; private final String pass; public MailJob(String user, String pass) { super(); this.user=user;

我实现了一个MailJob类来发送电子邮件,效果很好。我还需要发送附加图像,但它不工作

这是我实现的代码

 class MailJob extends AsyncTask<MailJob.Mail,Void,Void> {
private final String user;
private final String pass;


public MailJob(String user, String pass) {
    super();
    this.user=user;
    this.pass=pass;
}

@Override
protected Void doInBackground(Mail... mails) {

    Properties props = new Properties();
    props.put("mail.smtp.auth", "true");
    props.put("mail.smtp.starttls.enable", "true");
    props.put("mail.smtp.host", "smtp.gmail.com");
    props.put("mail.smtp.port", "587");

    Session session = Session.getInstance(props,
            new javax.mail.Authenticator() {
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication(user, pass);
                }
            });
    for (Mail mail:mails) {

        try {

            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress(mail.from));
            message.setRecipients(Message.RecipientType.TO,
                    InternetAddress.parse(mail.to));
            message.setSubject(mail.subject);
            message.setText(mail.content);

            // Send message
            Transport.send(message);


        } catch (MessagingException e) {
            Log.d("MailJob", e.getMessage());
        }
    }
    return null;
}

public static class Mail{
    private final String subject;
    private final String content;
    private final String from;
    private final String to;
    private final Uri camino;


    public Mail(String from, String to, String subject, String content, Uri camino){
        this.subject=subject;
        this.content=content;
        this.from=from;
        this.to=to;
        this.camino=camino;
    }
}
我使用以下命令获取路径和文件:

 private void openGallery(){
    Intent gallery = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.INTERNAL_CONTENT_URI);
    startActivityForResult(gallery, PICK_IMAGE);
}

  @Override
  public void onActivityResult(int requestCode, int resultCode, Intent data){
    if(resultCode == RESULT_OK && requestCode == PICK_IMAGE){
        imageUri = data.getData();
        Bitmap bitmap = null;
        try {
            bitmap = MediaStore.Images.Media.getBitmap(getContext().getContentResolver(), imageUri);
        } catch (IOException e) {
            e.printStackTrace();
        }
        mg.setImageBitmap(bitmap);
        a.add(bitmap);

    }
}
因此,Uri.getPath()是路径,数据文件是getFileName(imageUri):

日志:

javax.mail.MessagingException: IOException while sending message;
  nested exception is:
    java.io.FileNotFoundException: /external/images/media/4176/20200505_103438.jpg (No such file or directory)
    at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1290)
    at javax.mail.Transport.send0(Transport.java:255)
    at javax.mail.Transport.send(Transport.java:124)
    at com.example.operacioneschecklist.MailJob.doInBackground(MailJob.java:87)
    at com.example.operacioneschecklist.MailJob.doInBackground(MailJob.java:24)
    at android.os.AsyncTask$2.call(AsyncTask.java:333)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
    at java.lang.Thread.run(Thread.java:764)
 Caused by: java.io.FileNotFoundException: /external/images/media/4176/20200505_103438.jpg (No such file or directory)
    at java.io.FileInputStream.open0(Native Method)
    at java.io.FileInputStream.open(FileInputStream.java:231)
    at java.io.FileInputStream.<init>(FileInputStream.java:165)
    at javax.activation.FileDataSource.getInputStream(FileDataSource.java:110)
    at javax.activation.DataHandler.writeTo(DataHandler.java:318)
    at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1645)
    at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:961)
    at javax.mail.internet.MimeMultipart.writeTo(MimeMultipart.java:553)
    at com.sun.mail.handlers.multipart_mixed.writeTo(multipart_mixed.java:81)
    at javax.activation.ObjectDataContentHandler.writeTo(DataHandler.java:900)
    at javax.activation.DataHandler.writeTo(DataHandler.java:330)
    at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1645)
    at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1850)
    at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1241)
    at javax.mail.Transport.send0(Transport.java:255) 
    at javax.mail.Transport.send(Transport.java:124) 
    at com.example.operacioneschecklist.MailJob.doInBackground(MailJob.java:87) 
    at com.example.operacioneschecklist.MailJob.doInBackground(MailJob.java:24) 
    at android.os.AsyncTask$2.call(AsyncTask.java:333) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 
    at java.lang.Thread.run(Thread.java:764) 
javax.mail.MessaginException:IOException发送消息时;
嵌套异常是:
java.io.FileNotFoundException:/external/images/media/4176/20200505_103438.jpg(无此类文件或目录)
在com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1290)上
位于javax.mail.Transport.send0(Transport.java:255)
在javax.mail.Transport.send(Transport.java:124)
位于com.example.operacioneschecklist.MailJob.doInBackground(MailJob.java:87)
位于com.example.operacioneschecklist.MailJob.doInBackground(MailJob.java:24)
位于android.os.AsyncTask$2.call(AsyncTask.java:333)
在java.util.concurrent.FutureTask.run(FutureTask.java:266)处
在android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
运行(Thread.java:764)
原因:java.io.FileNotFoundException:/external/images/media/4176/20200505_103438.jpg(无此类文件或目录)
位于java.io.FileInputStream.open0(本机方法)
在java.io.FileInputStream.open(FileInputStream.java:231)
位于java.io.FileInputStream。(FileInputStream.java:165)
位于javax.activation.FileDataSource.getInputStream(FileDataSource.java:110)
在javax.activation.DataHandler.writeTo(DataHandler.java:318)
在javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1645)
在javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:961)
位于javax.mail.internet.MimeMultipart.writeTo(MimeMultipart.java:553)
位于com.sun.mail.handlers.multipart_mixed.writeTo(multipart_mixed.java:81)
位于javax.activation.ObjectDataContentHandler.writeTo(DataHandler.java:900)
在javax.activation.DataHandler.writeTo(DataHandler.java:330)
在javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1645)
在javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1850)
在com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1241)上
位于javax.mail.Transport.send0(Transport.java:255)
在javax.mail.Transport.send(Transport.java:124)
位于com.example.operacioneschecklist.MailJob.doInBackground(MailJob.java:87)
位于com.example.operacioneschecklist.MailJob.doInBackground(MailJob.java:24)
位于android.os.AsyncTask$2.call(AsyncTask.java:333)
在java.util.concurrent.FutureTask.run(FutureTask.java:266)处
在android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
运行(Thread.java:764)

如果您在发送messageReplace
Log.D(“MailJob”,e.getMessage())时发布整个堆栈跟踪,而不仅仅是错误行,那么您的运气会更好带有
Log.e(“MailJob”,“异常发送邮件”,e)。然后检查整个堆栈跟踪并考虑将其添加到您的问题中。我得到的是:java. Io.FieloToFunExtExcExt:Ext/图像/媒体/ 4176 /202005 513Y1864 5.JPG(没有这样的文件或目录)。如何获取路径和文件名在代码中我们仍然没有完整的堆栈跟踪。我猜您的问题在于
DataSource source=newfiledatasource(String.valueOf(mail.camino))
,其中
mail.camino
返回错误中显示的值。您需要确定该
camino
值的来源。它不是有效的文件系统路径。我的猜测是,您将
Uri
视为一个文件。如果您在发送messageReplace
Log.D(“MailJob”,e.getMessage())时发布整个堆栈跟踪,而不仅仅是错误行,那么您的运气会更好带有
Log.e(“MailJob”,“异常发送邮件”,e)。然后检查整个堆栈跟踪并考虑将其添加到您的问题中。我得到的是:java. Io.FieloToFunExtExcExt:Ext/图像/媒体/ 4176 /202005 513Y1864 5.JPG(没有这样的文件或目录)。如何获取路径和文件名在代码中我们仍然没有完整的堆栈跟踪。我猜您的问题在于
DataSource source=newfiledatasource(String.valueOf(mail.camino))
,其中
mail.camino
返回错误中显示的值。您需要确定该
camino
值的来源。它不是有效的文件系统路径。我的猜测是,您将
Uri
视为一个文件。
 Caused by: java.io.FileNotFoundException: external/images/media/4176/20200513_190645.jpg (No such file or directory)
 private void openGallery(){
    Intent gallery = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.INTERNAL_CONTENT_URI);
    startActivityForResult(gallery, PICK_IMAGE);
}

  @Override
  public void onActivityResult(int requestCode, int resultCode, Intent data){
    if(resultCode == RESULT_OK && requestCode == PICK_IMAGE){
        imageUri = data.getData();
        Bitmap bitmap = null;
        try {
            bitmap = MediaStore.Images.Media.getBitmap(getContext().getContentResolver(), imageUri);
        } catch (IOException e) {
            e.printStackTrace();
        }
        mg.setImageBitmap(bitmap);
        a.add(bitmap);

    }
}
 public String getFileName(Uri uri) {
    String result = null;
    if (uri.getScheme().equals("content")) {
        Cursor cursor = getContext().getContentResolver().query(uri, null, null, null, null);
        try {
            if (cursor != null && cursor.moveToFirst()) {
                result = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
            }
        } finally {
            cursor.close();
        }
    }
    if (result == null) {
        result = uri.getPath();
        int cut = result.lastIndexOf('/');
        if (cut != -1) {
            result = result.substring(cut + 1);
        }
    }
    return result;
}
javax.mail.MessagingException: IOException while sending message;
  nested exception is:
    java.io.FileNotFoundException: /external/images/media/4176/20200505_103438.jpg (No such file or directory)
    at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1290)
    at javax.mail.Transport.send0(Transport.java:255)
    at javax.mail.Transport.send(Transport.java:124)
    at com.example.operacioneschecklist.MailJob.doInBackground(MailJob.java:87)
    at com.example.operacioneschecklist.MailJob.doInBackground(MailJob.java:24)
    at android.os.AsyncTask$2.call(AsyncTask.java:333)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
    at java.lang.Thread.run(Thread.java:764)
 Caused by: java.io.FileNotFoundException: /external/images/media/4176/20200505_103438.jpg (No such file or directory)
    at java.io.FileInputStream.open0(Native Method)
    at java.io.FileInputStream.open(FileInputStream.java:231)
    at java.io.FileInputStream.<init>(FileInputStream.java:165)
    at javax.activation.FileDataSource.getInputStream(FileDataSource.java:110)
    at javax.activation.DataHandler.writeTo(DataHandler.java:318)
    at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1645)
    at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:961)
    at javax.mail.internet.MimeMultipart.writeTo(MimeMultipart.java:553)
    at com.sun.mail.handlers.multipart_mixed.writeTo(multipart_mixed.java:81)
    at javax.activation.ObjectDataContentHandler.writeTo(DataHandler.java:900)
    at javax.activation.DataHandler.writeTo(DataHandler.java:330)
    at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1645)
    at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1850)
    at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1241)
    at javax.mail.Transport.send0(Transport.java:255) 
    at javax.mail.Transport.send(Transport.java:124) 
    at com.example.operacioneschecklist.MailJob.doInBackground(MailJob.java:87) 
    at com.example.operacioneschecklist.MailJob.doInBackground(MailJob.java:24) 
    at android.os.AsyncTask$2.call(AsyncTask.java:333) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 
    at java.lang.Thread.run(Thread.java:764)