在继续之前,您必须意识到这个问题确实来自我的一个学生。他必须制作一个应用程序(使用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卡的根目录中。
请任何人都可以提供帮助,但同样请记住,我们需要“婴儿步骤”而不是“巨大飞跃”的帮助!
非常感谢。
汤姆。
答案 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_TEXT
。 ACTION_SEND
文档说明支持EXTRA_TEXT
或 EXTRA_STREAM
。使用两者可能会导致问题。
步骤3:替换
emailIntent.setType("message/rfc822");
与
emailIntent.setType("image/jpeg");
除非你有一个非常奇怪的附件,否则该附件是JPEG文件,而不是RFC822消息。
第4步:考虑使用ACTION_SENDTO
和mailto:
Uri
,而不是ACTION_SEND
和EXTRA_EMAIL
,因为第3步将导致您的请求匹配与电子邮件无关的应用程序。
步骤5:确保您已运行Outlook和/或Gmail,设置了帐户,并且(如果您使用的是Android 6.0+)已授予他们使用外部存储的权限。后者特别重要,因为您的代码可能非常好,但如果其他应用无法访问外部存储,您的附件仍然无效。作为解决方法,您可以使用FileProvider
从应用程序的内部存储中提供文件,但这会带来一系列兼容性问题。