Android 将文件附加到 GMAIL - 无法附加空文件

Posted

技术标签:

【中文标题】Android 将文件附加到 GMAIL - 无法附加空文件【英文标题】:Android Attaching a file to GMAIL - Can't attach empty file 【发布时间】:2015-11-25 22:15:37 【问题描述】:

我有一个程序总是将相同的文件附加到 GMAIL(撰写>附加文件>打开自>“我的程序”)。它总是会选择同一个文件。

它在做什么:

String path = Environment.getExternalStorageDirectory() + "/file.3gp";
File f = new File(path);
Uri data = Uri.fromFile(f);
Intent i = new Intent();
i.setData(data);
setResult(Activity.RESULT_OK, i);
finish();

这在 android 6.0 之前运行良好。 现在,我在尝试使用它时收到以下错误:

无法附加空文件

Astro 文件共享给了我同样的错误(可能是旧版本)。

但是,我安装了 ES 文件资源管理器,当我执行相同的例程并选择文件时,我收到一个对话框,上面写着:

提取文件为

普通 Android 方式(用于彩信、Gmail 等) 文件方式(如果上述方法失败,请尝试此方法)

“文件方式”会像我的程序一样失败。 “正常的 Android 方式”可以正常工作。

有人知道它的作用,所以我可以复制吗?

提前致谢!

OBS:已经尝试了很多次 putExtra(STREAM, path),但没有成功。

【问题讨论】:

文件名有多长? @Skizo 这是完整路径 + 名称:“file:///sdcard/Example_1MBattachment.mpx” 尽量用字母少的名字,我知道一个人是他的错。 @Skizo 尝试使用 test.mpx 和 test2.3gp。没有工作。他们确实可以使用 ES 文件资源管理器。 我已经尝试将文件路径从 file:///... 更改为 content://...,现在 toast 消息不同了。现在它说“无法附加文件。”。我仍在使用 setData,而 putExtra 不工作(什么都不做) 【参考方案1】:

好的,经过大量研究并拦截了一些 Intent,现在可以使用它了。

我要做的就是将 file:/// 更改为 content://。

我是根据来自 Android 的以下信息执行此操作的:https://developer.android.com/reference/android/support/v4/content/FileProvider.html

唯一的主要变化是我使用了 /sdcard/file.ext 的硬编码路径。 另外,这条线

getUriForFile(getContext(), "com.mydomain.fileprovider", newFile);

改为

Uri contentUri = FileProvider.getUriForFile(this, "com.mydomain.fileprovider", newFile);

还必须包括:

intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
i.setData(contentUri);

我真的不明白为什么我必须将从文件更改为内容,但是在此之后,文件现在又被附加了!如果您遇到此问题,请查看链接,不要忘记需要创建的新 .xml。

【讨论】:

你能详细说明你是如何工作的吗?我在同一个坑里。我想详细了解。谢谢。 @prashantwosti 嘿,我很抱歉,但我真的不记得我是如何找到问题的底部的(已经有一段时间了)。我知道我有很多尝试和错误。明天上班后我会去看看。尝试查看我引用的链接,这可能会对您有所帮助,特别是前两段解释 ContentFile 太棒了!和上面描述的方式有关系吗?还是完全不同? @prashantwosti 该解决方案已在此处提及:***.com/a/32982050/614451【参考方案2】:

请参阅以下问题:

android-6-cannot-share-files-anymore

此行为适用于 Android 6.0 和 Gmail。请看下面的帖子。

Issue 3141 - android-developer-preview

如果您转到设置->应用程序->Gmail->权限并启用 手动“存储”权限,然后共享工作。

在这种情况下,Gmail 应该请求“存储”权限,并且它 将像在所有过去的 Android 版本中一样工作。

其他电子邮件应用程序应正确处理附件。

【讨论】:

谢谢 mkabatek。我不确定我是否可以再次测试它,因为它已经改变了,但如果可以的话,我会报告结果! 我在 nexus 6p 上遇到了同样的问题,可以使用此设置修复它。在装有 Android 6.0.1 的 Nexus 7 上,这是默认设置,我不必手动设置。 它不起作用。我已将此权限添加到 gmail 但我不起作用。【参考方案3】:

这是解决方法。

转到设置 -> 应用程序 -> Gmail -> 权限 打开“存储”的权限 该解决方法为我解决了这个问题。

【讨论】:

【参考方案4】:

我找不到明确的答案(在没有 SD 卡的情况下通过 gmail 发送附件)我试图复制到另一个文件名但没有雪茄。我让它工作的方式是复制到下载文件夹并从那里开始。

用这个获取下载路径 Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)

拉取下载文件夹的完整路径,将附件复制到那里,我们很好。超过 20M 的文件不走

【讨论】:

【参考方案5】:

使用提供给定文件路径的 INTENT 共享任何文件

    //File file= shareable File Path
    Uri uri = FileProvider.getUriForFile(this, "com.example.myapp.fileprovider", file); 
    //FileProvider authorities from Manifest
            
    Intent sharingIntent = new Intent(Intent.ACTION_SEND);
    sharingIntent.setType("*/*");

    sharingIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    sharingIntent.putExtra(Intent.EXTRA_STREAM, uri);
    startActivity(sharingIntent);

只需在方法getUriForFile 的参数中匹配manifest 中的authorities

在清单中

 <provider
        android:name="androidx.core.content.FileProvider"
        android:authorities="com.example.myapp.fileprovider"
        android:grantUriPermissions="true"
        android:exported="false">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/filepaths" />
    </provider>

【讨论】:

以上是关于Android 将文件附加到 GMAIL - 无法附加空文件的主要内容,如果未能解决你的问题,请参考以下文章

Android:如何将生成的临时图像附加到电子邮件中?

Android - 无法使用 FileProvider 添加电子邮件附件

使用带有 Gmail API 的可恢复上传附加文件

使用 android 直接连接到 GMAIL [重复]

如何将图像从 Android 中的 Drawable 附加到彩信?

Chrome扩展程序(Angularjs)到Gmail附加组件(Appscript)