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

时间:2015-08-31 19:37:04

标签: android android-intent attachment

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

它在做什么:

public static bool IsDayWhatYouWant()
{
    var now = DateTime.UtcNow;
    return IsFirstThreeDays(now) && IsWeekday(now) && !IsHoliday(now);
}

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

  

无法附加空文件

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

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

  

将文件选为

     
      
  • 普通Android方式(适用于彩信,Gmail,...)
  •   
  • 文件方式(如果失败,请尝试此操作)
  •   

“文件方式”会因我的程序而失败。 “普通Android方式”可以正常使用。

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

提前致谢!

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

5 个答案:

答案 0 :(得分:17)

好的,经过大量研究和拦截一些意图后,现在就开始工作了。

我必须做的是将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。

答案 1 :(得分:15)

请参阅以下问题:

android-6-cannot-share-files-anymore

此行为适用于Android 6.0和Gmail。请参阅以下主题。

Issue 3141 - android-developer-preview

  

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

     

Gmail应该要求"存储"在这种情况下的权限和它   可以像以前版本的Android一样工作。

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

答案 2 :(得分:2)

以下是如何修复它。

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

答案 3 :(得分:0)

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

使用此获取下载路径 的 Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)

将完整路径拉到downlaods文件夹复制attachemnt到那里,我们很好。超过20M的文件不会出现

答案 4 :(得分:0)

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

<AppPermissionRequests AllowAppOnlyPolicy="true">
<AppPermissionRequest Scope="http://sharepoint/content/sitecollection/web" Right="FullControl" />

只需将 //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); 中的authorities与方法manifest的参数匹配。

在清单中

getUriForFile