通过 FileProvider 和 Intent 将缓存文件附加到 GMail 不起作用

问题描述

所以过去一天我一直在用头撞墙,试图弄清楚为什么文件不会附加到电子邮件中。每次应用程序运行时,我都会收到一条吐司消息,弹出“无法附加文件”。 To 和 Subject 字段按照我的预期填写。第一个问题是,我怎样才能找到这个错误背后的更多信息?此消息是从 GMail 应用程序而不是我自己的程序抛出的。它肯定会为我指明正确的方向,所以如果我有这个错误的原因,我可以自己进一步调试。我在下面包含了可能相关的信息。文件大小为 78.5kb,我可以验证该文件是否存在以及是否包含我想要附加的正确内容。根据文件资源管理器,文件的权限为所有者和组的 rw。

我在输入这篇文章时发现了一些有趣的事情;使用文件浏览器在 gmail 应用程序中添加附件时,Android/data 目录不是一个选项!但是,当您在 gmail 应用程序之外使用文件浏览器时,它会出现。所以我在想这可能是权限问题吗?它无法访问此文件夹。如果是这种情况,推荐的存储此文件的位置是什么?理想情况下,在这种情况下,它应该是某种缓存位置或临时文件位置。

我尝试在 Android Outlook 应用程序中而不是 GMail 中添加附件,但文件确实被附加了。

尝试使用 Pixel 4 Emulator 在 Android 11 API 30 上运行。

电子邮件意图代码

protected void sendEmail(File f){
    final String[] TO = { "foo@bar.com" };

    Intent emailIntent = new Intent(Intent.ACTION_SENDTO);
    emailIntent.setData(Uri.parse("mailto:"));
    emailIntent.putExtra(Intent.EXTRA_EMAIL,TO);
    emailIntent.putExtra(Intent.EXTRA_SUBJECT,f.getName().replaceAll("(?i).pdf",""));

    if (!f.exists() || !f.canRead()) {
        Toast.makeText(this,"Attachment Error",Toast.LENGTH_SHORT).show();
        finish();
        return;
    }

    emailIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    Uri uri = FileProvider.getUriForFile(getApplicationContext(),BuildConfig.APPLICATION_ID,f);
    emailIntent.putExtra(Intent.EXTRA_STREAM,uri);

    try {
        startActivity(emailIntent);
        finish();
    } catch (android.content.ActivityNotFoundException ex) {
        Toast.makeText(MainActivity.this,"There is no email client installed.",Toast.LENGTH_SHORT).show();
    }

AndroidManifest.xml:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
...
<provider
    android:name="androidx.core.content.FileProvider"
    android:authorities="${applicationId}"
    android:exported="false"
    android:grantUriPermissions="true">
    <Meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/provider_paths" />
</provider>

provider_paths.xml:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-cache-path name="external_cache" path="."/>
</paths>

f 的值:

/storage/emulated/0/Android/data/com.bar.foo/cache/Form2020-12-27.pdf

uri 路径的值:

content://com.bar.foo/external_cache/Form2020-12-27.pdf

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)