我尝试使用以下代码通过gmail发送带有附件的邮件:
Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts(
"mailto", "test@mail.com", null));
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "test Mail");
File file = ..function that return file with logs...
File newFile = new File(getFilesDir() + File.separator + "logs" + File.separator + System.currentTimeMillis() + ".log");
FileTools.fileCopy(file, newFile);
Uri uri = FileProvider.getUriForFile(this,
"test.test.test.provider", newFile);
emailIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
emailIntent.putExtra(Intent.EXTRA_STREAM, uri);
startActivityForResult(Intent.createChooser(emailIntent, "eMail"), 1);
我还添加了文件夹日志的路径
<files-path name="logs" path="logs/" />
它运行带有Toast“无法附加文件”的gmail应用程序。 在调试uri变量中看起来:
content://test.test.test.provider/logs/1545415598572.log
当我改变
Uri uri = FileProvider.getUriForFile(this, "test.test.test.provider", newFile);
使用
Uri uri = Uri.uri(newFile);
它有效,但仅适用于外部存储中的文件。
为什么它不能与FileProvider一起使用?
答案 0 :(得分:0)
应用程序包-ru.exampleapp
file_provider.xml
<?xml version="1.0" encoding="utf-8"?>
<paths>
<files-path
name="files"
path="." />
</paths>
然后在Android清单中添加了提供程序。
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="ru.exampleapp"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_provider" />
</provider>
这是一个示例,说明如何创建和启动意图。
val emailIntent = Intent(Intent.ACTION_SENDTO)
val intent = Intent(Intent.ACTION_SEND)
val devInfoFile = context.getFileStreamPath("debug_info.txt")
val outputWriter = OutputStreamWriter(devInfoFile.outputStream())
outputWriter.write("Model: ${Build.MODEL}\n")
outputWriter.write("Id: ${Build.ID}\n")
outputWriter.write("Manufacturer: ${Build.MANUFACTURER}\n")
var devInfoUri: Uri? = null
try {
devInfoUri = FileProvider.getUriForFile(context, "ru.exampleapp", devInfoFile)
} catch (e: java.lang.Exception) { }
intent.putExtra(Intent.EXTRA_STREAM, devInfoUri)
emailIntent.data = Uri.parse("mailto:")
intent.putExtra(Intent.EXTRA_EMAIL, arrayOf(context.getString(R.string.admin_email)))
intent.putExtra(Intent.EXTRA_SUBJECT, emailSubject)
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
intent.selector = emailIntent
try {
context.startActivity(Intent.createChooser(intent,
context.getString(R.string.report_message)))
} catch (e: java.lang.Exception) {
}
我还添加了选择器,这是仅通过电子邮件应用程序发送邮件的方式。