问题在我的Android应用程序中将内部文件附加到GMail

时间:2011-04-23 04:00:53

标签: android

我的应用将数据写入文本文件(在SD卡和内部存储器上)。 稍后,该应用程序会将文本文件通过电子邮件发送给人员列表。 我无法让gmail附加从内部应用程序文件区域提取的文件。 “原生Android邮件”可以从内部或SD卡区域附加文件,没有任何问题。如果文件来自SD卡,则Gmail会附加文件,但如果文件位于内部存储中,则不会附加文件。

//这会从SD发送文件 - 适用于android mail和gmail

Intent jj=new Intent(android.content.Intent.ACTION_SEND);

String fileName = "file://" + Environment.getExternalStorageDirectory()+"/aFolder/externalfile.txt"           

jj.putExtra(Intent.EXTRA_STREAM, Uri.parse(fileName));
jj.setType("text/plain");

Intent chooser = Intent.createChooser(jj , "Select Sender");
startActivity(chooser);

//这会发送一个内部文件 - 用于安卓邮件,但没有附件发送到gmail

Intent jj=new Intent(android.content.Intent.ACTION_SEND);

String fileName = "file://" + getFilesDir().toString() + "/internalfile.txt";

jj.putExtra(Intent.EXTRA_STREAM, Uri.parse(fileName));
jj.setType("text/plain");

Intent chooser = Intent.createChooser(jj , "Select Sender");
startActivity(chooser);

有什么建议吗? 我是否需要以某种方式授予Gmail特殊权限? 我的附件都是文本文件 - 由应用程序编写 内部文件是使用openFileOutput(myFile,32769)

创建的

由于 约翰D

3 个答案:

答案 0 :(得分:2)

我找到的唯一方法是制作我自己的内容提供商,并将uri作为附件传递给我的内容提供商。

答案 1 :(得分:1)

与Dhego一样,我使用了内容提供商。特别是,一个FileProvider。

https://developer.android.com/reference/android/support/v4/content/FileProvider.html

使用此选项只需要修改Manifest并创建其他资源文件。此外,您需要通过FileProvider提供的静态方法获取格式有效的URI。

在你的Manfiest:

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

“com.example.authority.fileprovider”是您附加了“fileprovider”的应用程序权限。

在res / xml文件夹中,创建一个file_paths.xml文件,其中包含要公开的文件的路径。在我的例子中,我将它们从应用程序缓存目录中公开,所以我的XML看起来像:

    <paths xmlns:android="http://schemas.android.com/apk/res/android">
        <cache-path name="reports" path="reports/"/>
    </paths>

就我而言,“reports”是我正在编写文件的应用程序缓存目录中的文件夹。

最后要做的是在你的代码中:

  1. 将要公开的文件写入file_paths.xml中指定的文件夹和存储区域。
  2. 生成一个有效的URI,用于设置要发送电子邮件的Intent(Intent.ACTION_SEND)。
  3. 以下是一些示例代码:

    emailIntent.putExtra(Intent.EXTRA_STREAM, FileProvider.getUriForFile(getActivity(), "com.example.authority.fileprovider", fileToAttach));
    

    在你的Intent上调用startActivity,应该是它!

答案 2 :(得分:0)

似乎确实an issue with gmail。然而不幸的是,在撰写本文时,它似乎尚未修复。