通过FileProvider将缓存文件附加到Gmail,但Intent不起作用 [英] Attaching cache file to GMail through FileProvider and Intent not working

查看:117
本文介绍了通过FileProvider将缓存文件附加到Gmail,但Intent不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

我在输入这篇文章时发现了一些有趣的事情;当使用文件资源管理器在Gmail应用程序中添加附件时,android/data目录不是一个选项!不过,当你在Gmail应用程序之外使用文件资源管理器时,它会显示出来。所以我想这可能是权限问题?它无法访问此文件夹。如果是这样的话,建议存储此文件的位置是什么?理想情况下,它应该是某种缓存位置或此实例中的临时文件位置。

我已尝试在Android Outlook应用程序(而不是Gmail)中添加附件,但确实附加了该文件。

正在尝试使用Pixel 4仿真程序在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

推荐答案

改用ACTION_SEND

TO也将在此处实现。

添加:

emailIntent.setType("message/rfc822");

可以删除setData()调用;

这篇关于通过FileProvider将缓存文件附加到Gmail,但Intent不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆