如何在内容提供商中存储文件

时间:2011-06-30 12:25:45

标签: android android-contentprovider

我需要将Zip文件附加到Android电子邮件编辑器中的邮件中。

Zip文件由我的应用程序创建并存储在应用程序的私有存储区域中(可通过getFilesDirectory()访问)。 我正在获取此Zip文件的URI并将其附加到电子邮件意图对象;当我启动电子邮件活动时,我能看到附件,但我的电子邮件收件人没有收到文件,

在对此进行一些研究后,我发现我的应用程序数据无法与其他应用程序共享(在本例中为Android电子邮件应用程序)。

要解决此问题,我想实施使用内容提供商分享我的应用程序数据的推荐解决方案。

首先,我想确认一下是否可行,如果可以,请给我一些关于如何做到这一点的提示。我需要知道如何将我的Zip文件从我的应用程序的getFilesDirectory()复制到内容提供程序,以及如何将内容提供程序URI附加到电子邮件意图对象。

我无法将我的zip文件放入SD卡......

我只想将我的文件存储到设备内部存储空间并附加到电子邮件编辑器。

2 个答案:

答案 0 :(得分:5)

默认情况下,设备上的任何应用程序都可以访问ContentProvider。如果您愿意通过设备上的任何应用程序访问这些文件,请创建ContentProvider,其中包含getType()openFile()的实际实施。然后,content://网址应与电子邮件应用AFAIK一起使用。

Here is a sample project演示ContentProvider从本地存储中提供文件,在本例中为WebView

答案 1 :(得分:0)

如果您只想避免在外部SD卡上存储,那么您不需要ContentProvider。你可以忍受

openFileOutput("yourzipfile.zip", MODE_WORLD_READABLE)

并传递

putExtra(Intent.EXTRA_STREAM, Uri.fromFile(getFileStreamPath("yourzipfile.zip))

以及您的ACTION_SEND意图。

但是,电子邮件程序可能不会设置内容类型。

此外,没有可靠的方法来判断电子邮件应用程序何时不再需要您的文件。这意味着您要么冒险使用许多文件,要么发送较新的内容作为旧电子邮件的附件。

此解决方案的另一个问题是每个人都可以阅读您的zip文件。 ContentProvider解决方案不会出现此问题,您可以在每个Intent的基础上授予访问权限,即仅允许一个电子邮件Intent访问一个文件。

然后通过URI完成Uri的匹配,URI可以从您的包名开始,例如

content://com.yourdomain.yourapp.yourproviderclass/some/path

您可能需要查看http://developer.android.com/guide/topics/manifest/provider-element.html