2012-04-03 105 views
2

我正在研究一个功能,其中我的应用程序将从服务器下载文件,然后允许用户在外部第三方应用程序中打开这些文件(假设用户安装了可以查看文件的应用程序类型)。Android:共享下载的文件

文件被下载并存储为字节数组,其中包含一些伴随的元数据,其中包括MIME类型和文件扩展名。

自定义ContentProvider似乎是明显的方式,因为我的应用程序需要保留对下载文件的控制 - 即其他应用程序的访问应该是只读的,并且我的应用程序应该控制是否/当文件被删除。

说到实施我的自定义ContentProvider,我不清楚几件事情。我看只有教程似乎在两个

  1. 之间,共享数据所关心的是它不够的,只是重写和实现openFile()和实施query()insert()等为“什么也不做”存根的方法呢?
  2. 假设执行openFile()是要走的路,我该如何处理从字节数组创建ParcelFileDescriptor

注意:如果可能的话,我需要一直支持API级别3(Cupcake)。

回答

2

我做了一些更多的挖掘,终于遇到了this source开放Android AttachmentProvider实现(为他们的电子邮件客户端)。

因此,要回答我自己的问题:

  1. 它看起来像我需要实现openFile()getType()query()。他们的query()实现提供对显示名称,uri,文件大小和'_ID'列(as recommended by the dev guide)列的访问。
  2. ParcelFileDescriptor s是专门设计用于与File s(我想是线索的名字!)所以唯一的方法是将字节数组写入文件系统,然后为该File创建一个ParcelFileDescriptor。幸运的是,我似乎可以写入应用程序的私人文件夹,以防止其他应用程序与我的文件混淆。
+0

另一种可能是使用MemoryFile。我现在正在研究这个解决方案,希望性能比普通文件更快。 – Georgie 2013-03-10 23:23:54

+0

关于我上面的评论,我尝试了在内容提供者openFile()实现中使用MemoryFile,但没有成功。原因之一是支持与MemoryFile相关的ParcelFileDescriptor在最近的Android版本中已经消失。甚至在此之前它需要反射技巧才能访问。 – Georgie 2013-03-15 03:09:27

+0

有什么方法可以将字节数组传递给'ParcelFileDescriptor'吗?出于安全原因,我无法在手机上保存PDF文件。 – 2015-06-15 20:29:45