如何在同一设备上运行的Android应用程序之间传输文件?

Eri*_*ine 25 android ipc android-service android-contentprovider

我正在编写一个与RESTful服务接口的Android应用程序.此Web服务基本上是文件系统的前端,并提供元数据以及对文件的CRUD访问.我的应用程序检索元数据,并通过a将其公开给第三方应用程序ContentProvider.

我需要添加第三方应用程序的能力,在与我的应用程序相同的设备上运行,通过向我的应用程序发送请求(而不是直接与服务器)来CRUD实际文件.这意味着他们需要通过我的应用程序发送或接收文件的内容(通常是XML或图像).

我想到了实现这个的两种方法:

选项1 - 使用ContentProvider.openFile

这似乎是让第三方应用程序能够从我的文件中读取文件的明显选择ContentProvider.我认为当这些应用程序需要通过我的`ContentProvider'创建或更新文件时,它开始变得棘手.完成后我需要回调才能知道何时将新的/更改的文件发送回服务器.我相信我可以为此目的使用FileObserver.

选项2 - 通过服务使用Messenger

通过这种方法,我可以通过应用程序和客户端应用程序之间的文件发送Messenger.该文件必须通过一个传递Bundle,所以我不知道什么是最好的格式是发送它们(File,FileDescriptor,字节数组,别的东西?).如果文件变得很大,我不能很好地处理这会导致问题.

选项3 - 混合方法

  1. 将外部存储上的文件夹用作下拉框
  2. 通过Messenger/ 传递CRUD请求和删除框内容Service
  3. 使用它ContentProvider来存储请求的状态
  4. 第三方应用通过a接收状态更新 ContentObserver

摘要

我认为使用ContentProvider将是理想的解决方案,但似乎API并不完全支持我的用例.我担心尝试沿着这条路走下去可能会导致一个愚蠢的实施.如果我采用MessengerService接近,我不确定通过a传输文件的最强大的方法Bundle.

混合方法似乎非常强大,但实现起来最复杂.文件实际上并没有被传递,因此性能应该很好.但是,我担心这会过度设计解决方案.

在同一Android设备上运行的应用程序之间传输文件的最佳方法是什么? 当然,我对我在问题中没有概述的其他选项持开放态度.

Mer*_*lin 16

内容提供商绝对是最佳选择.如果你认为谷歌几乎所有的东西都使用这种方法,那么这就是预期的设计方法.

我不是在颂扬他们的美德,但在盲人的土地上,独眼的内容提供者是王者.

更新

有一个如何在CommonsWare书中执行此操作的示例,请参阅提供的链接.

内容提供者/文件的来源

使用内容提供程序的synch框架.只需维护一个请求列表,然后安排同步以下载这些文件.您也可以在网络勾选等方面执行此操作.您可以使用广播意图或contentobserver通知客户端文件已下载.

实质上,这可能类似于您的第三个选项,但重要的是它使用Android提供的工具而不是自己动手.

Ad Endum

最好的起点是android SDK示例:android-sdk\samples\android-8\SampleSyncAdapter但要注意的是,有大量的联系人相关的东西掩盖了多汁的比特.我花了一段时间才发现除了syncadapter之外我几乎可以删除所有内容