添加附件到电子邮件(Android SDK)

时间:2016-02-03 14:18:24

标签: java android email-attachments

在继续之前,您必须意识到这个问题确实来自我的一个学生。他必须制作一个应用程序(使用Android SDK)作为学校项目的一部分。他和我都不具备Java的精湛工作知识,这是必需的语言。

我们到目前为止的内容如下:

package com.example.thomas.sendemailtaketwenty;

import android.content.Intent;
import android.net.Uri;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import java.io.File;

public class MainActivity extends AppCompatActivity {
    Button sendEmail;
    EditText msg;

    @Override

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        sendEmail = (Button) findViewById(R.id.sendBtn);
        sendEmail.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                msg = (EditText) findViewById(R.id.msgTxt);
                String message = msg.getText().toString();
                sendEmail(message);


            }
        });
    }

    protected void sendEmail(String message) {
        File externalStorage = Environment.getExternalStorageDirectory();

        Uri uri = Uri.fromFile(new File(externalStorage.getAbsolutePath() + "/" + "103950019.jpg"));


        String[] to=new String[]{"tom.walford@gmail.com"};
        String subject = ("House Rosebowl Scores");
        Intent emailIntent = new Intent(Intent.ACTION_SEND);
        emailIntent.putExtra(Intent.EXTRA_EMAIL, to);
        emailIntent.putExtra(Intent.EXTRA_STREAM, uri);
        emailIntent.putExtra(Intent.EXTRA_TEXT, message);
        emailIntent.setType("message/rfc822");
        startActivity(Intent.createChooser(emailIntent, "Email"));

    }

}

它将加载电子邮件程序(已尝试过Outlook和Gmail客户端),但它们不会加载附件(无法加载空文件或io错误),这些文件存储在外部SD卡的根目录中。

请任何人都可以提供帮助,但同样请记住,我们需要“婴儿步骤”而不是“巨大飞跃”的帮助!

非常感谢。

汤姆。

1 个答案:

答案 0 :(得分:2)

步骤1:替换

Uri uri = Uri.fromFile(new File(externalStorage.getAbsolutePath() + "/" + "103950019.jpg"));

Uri uri = Uri.fromFile(new File(externalStorage, "103950019.jpg"));

因为这对外部存储根目录的编码方式更具弹性。

步骤2:删除Intent.EXTRA_TEXTACTION_SEND文档说明支持EXTRA_TEXT EXTRA_STREAM。使用两者可能会导致问题。

步骤3:替换

emailIntent.setType("message/rfc822");

emailIntent.setType("image/jpeg");

除非你有一个非常奇怪的附件,否则该附件是JPEG文件,而不是RFC822消息。

第4步:考虑使用ACTION_SENDTOmailto: Uri,而不是ACTION_SENDEXTRA_EMAIL,因为第3步将导致您的请求匹配与电子邮件无关的应用程序。

步骤5:确保您已运行Outlook和/或Gmail,设置了帐户,并且(如果您使用的是Android 6.0+)已授予他们使用外部存储的权限。后者特别重要,因为您的代码可能非常好,但如果其他应用无法访问外部存储,您的附件仍然无效。作为解决方法,您可以使用FileProvider从应用程序的内部存储中提供文件,但这会带来一系列兼容性问题。