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

2024-05-14

我正在编写一个与 RESTful 服务交互的 Android 应用程序。该 Web 服务本质上是一个文件系统,并提供元数据以及对文件的 CRUD 访问。我的应用程序检索元数据,并通过ContentProvider.

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

我想到了两种实现此目的的方法:

选项 1 - 使用 ContentProvider.openFile

这似乎是一个显而易见的选择,让第三方应用程序能够从我的应用程序读取文件ContentProvider。我认为当这些应用程序需要通过我的“ContentProvider”创建或更新文件时,事情就开始变得棘手。当它们完成时,我需要回调,以便知道何时将新的/更改的文件发送回服务器。我相信我可以使用文件观察器 http://developer.android.com/reference/android/os/FileObserver.html不过为了这个目的。

选项 2 - 通过服务使用 Messenger

通过这种方法,我可以通过以下方式在我的应用程序和客户端应用程序之间发送文件Messenger。这些文件必须通过Bundle,所以我不确定传输它们的最佳格式是什么(File, FileDescriptor、字节数组、其他东西??)。我不太清楚如果文件变得很大这是否会导致问题。

选项 3 - 混合方法

  1. 使用外部存储上的文件夹作为投递箱
  2. 通过一个通信 CRUD 请求和投递箱内容Messenger/Service
  3. Use the ContentProvider存储请求的状态
  4. 3rd 方应用程序通过接收状态更新ContentObserver

Summary

我认为使用ContentProvider将是理想的解决方案,但该 API 似乎并不完全支持我的用例。我担心尝试走这条路可能会导致实施过程的混乱。如果我和一个Messenger and Service方法,我不确定通过传输文件的最可靠的方法Bundle.

混合方法看起来相当强大,但实施起来最复杂。文件实际上并没有被传递,所以性能应该很好。然而,我担心这对解决方案进行了过度设计。

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


内容提供商绝对是一条出路。如果您认为谷歌几乎在所有事情上都使用这种方法,那么显然这就是预期的设计方法。

我并不是在赞扬他们的美德,但在盲人的土地上,独眼内容提供商才是王道。

Update

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

内容提供商/文件的来源 https://github.com/commonsguy/cw-advandroid/tree/master/ContentProvider/Files

使用内容提供商的同步框架。只需维护请求列表,然后安排同步来下载这些文件。您还可以在网络上执行此操作等。您可以使用广播意图或内容观察器来通知客户端文件已下载。

本质上,这可能与您的第三个选项类似,但重要的是它使用 Android 提供的工具,而不是您自己的工具。

Ad Endum

最好的起点是 android-sdk\samples\android-8\SampleSyncAdapter 中的 android SDK 示例,但请注意,有大量与联系人相关的内容掩盖了有趣的部分。我花了一段时间才发现我可以删除除同步适配器之外的几乎所有内容

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • SQL Server 不使用索引将日期时间与非空进行比较

    我有一个与其他任何表都不相关的简单表 它有一个非 PK 列 它是一个日期 我已经为该列创建了一个非聚集索引 如果我提出这个查询 select from table where datecolumn is not null 但如果我删除 no
  • Android 认为我没有关闭数据库!为什么?

    我有一个 SQLiteDatabase 数据成员 我在 onCreate 中初始化它 并在 onPause onStop 和 onDestroy 中调用 close 它在 onResume 中重新初始化 它似乎运行得很好 但当我查看调试器时
  • 在 Scala 中将元素追加到列表末尾

    我无法添加 type 元素T到一个列表中List T 我尝试过myList myElement但它似乎创建了一个奇怪的对象并访问myList last始终返回放入列表中的第一个元素 我怎么解决这个问题 List 1 2 3 4 Result
  • 无需构建树即可预测霍夫曼压缩比

    我有一个二进制文件 我知道其中每个符号出现的次数 如果我要使用霍夫曼算法压缩它 我需要预测压缩文件的长度 我只对假设的输出长度感兴趣 而不对单个符号的代码感兴趣 因此构建霍夫曼树似乎是多余的 作为一个例子 我需要得到类似的东西 包含 4 个
  • 在 pygame 中,我如何创建一个数据结构来跟踪调整大小事件和对象的坐标?

    我希望在调整屏幕大小后使鼠标事件与对象保持同步 有人告诉我需要创建一个数据结构来跟踪 调整事件大小 新坐标以匹配调整大小 如何使用简单的代数方程来完成此操作并将其集成到调整大小事件中以进行准确更新 反过来做 创建一个虚拟游戏地图 在绘制场景
  • 子类 B 继承自模板类 A [重复]

    这个问题在这里已经有答案了 我最近偶然发现了如下代码 但我无法理解它 template
  • Winform 上的 C# ComboBox 是否有 BeforeUpdate

    我来自 VBA 世界 记得有一个BeforeUpdate我可以在组合框上进行调用 现在我使用 C 并且喜欢它 我想知道是否有一个BeforeUpdate呼吁ComboBox在 Winform 上 我可以制作一个不可见的文本框并在那里存储我需
  • 生成一个新终端并写入其标准输出

    我有一个应用程序 它使用 GUI 来完成与用户的大部分界面 不过 我想要一个单独的终端窗口 我可以写入一些错误检查 原始值等 我知道我可以使用以下命令生成一个新终端system 命令 但我不知道是否可以进行交互 在最好的情况下 我希望有一个
  • 定时任务应该放在哪一层?

    我正在尝试使用分层架构来实现 DDD 应用程序 我有 基础设施层 实现应用程序的技术特定部分的层 领域层 包含领域模型的层 应用层 包含与领域模型交互的干扰的层 接口层 从外部接收事件的层 经典的 3 层 基础设施 架构非常清晰 但我的应用
  • 对 URL 进行编码 C#

    所以我有一个看起来像这样的 URL http www test com folder1 id 3 但基本上 当他们单击按钮时 我想在 URL 栏中显示与该 id 关联的值的名称 例如 id 3 是名为 Rollex 的手表 所以我想要读取
  • scala中的反引号有什么用[重复]

    这个问题在这里已经有答案了 我在一本书上找到了以下代码 val list List 5 4 3 2 1 val result 0 list running total next element running total next elem
  • CouchDB 中的分页?

    我将如何实现分页所需的查询 基本上 当请求第 1 页时 获取前 5 个条目 对于第 2 页 获取接下来的 5 页 依此类推 我计划通过 couchdb python 模块使用它 但这不会对实现产生任何影响 The CouchDB 指南 ht
  • 如何解构 React props 并仍然访问其他 props?

    我很好奇如果我想要所有的 props 但也想要解构单个属性 那么组件的参数 props 是否可以像导入一样解构 我想这更像是一个 JavaScript 问题 而不是一个 React 问题 但是举个例子 import React useEff
  • 无需递归即可对可观察结果进行分页 - RxJava

    我有一个非常标准的 API 分页问题 您可以通过一些简单的递归来处理 这是一个捏造的例子 public Observable
  • 为什么 C11 标准不删除不安全的 strcat()、strcpy() 函数?

    C11 C 14标准已经下降gets 本质上不安全的函数会导致安全问题 因为它不会在缓冲区溢出时执行边界检查结果 那么为什么C11标准不下降strcat strcpy 功能 strcat 函数不会检查第二个字符串是否适合第一个数组 strc
  • 用于从某些标记生成 ASCII 图表的工具?

    有没有一种工具可以从某种标记生成 ASCII 图表 用例 能够快速创建和编辑可嵌入 javadoc 或任何其他注释 中的图表 类似于允许我们编写一些标记的内容 A HAS gt B B HAS gt C 该工具将生成可视化结果 A HAS
  • Swift - 将图像插入 PDF 不再适用于 iOS 13

    目前正在开发在我的贷款计算器应用程序上导出 PDF 的功能 我有一个预览屏幕 可以在您保存 PDF 之前显示它 预览屏幕由带有 html 的 webView 组成 其中包含占位符 我能够成功地将图像插入到正确的占位符上 并将其显示在 PDF
  • postgresql-按每个元素中的单词对数组进行排序

    有字符串数组 ARRAY CAT CAT DOG CAT DOG Cat 现在我想根据每个元素中的单词数对该数组进行排序 我已经尝试过 但没有取得任何成功 我想要这个输出 ARRAY CAT DOG CAT DOG CAT Cat 我怎样才
  • AndEngine MenuScene - 无法单击按钮

    我有一个关于 android 和 andengine 的小问题 这是我的主菜单的源代码 AbstractScene is extending Scene public class MainMenuScene extends Abstract
  • 如何在同一设备上运行的 Android 应用程序之间传输文件?

    我正在编写一个与 RESTful 服务交互的 Android 应用程序 该 Web 服务本质上是一个文件系统 并提供元数据以及对文件的 CRUD 访问 我的应用程序检索元数据 并通过ContentProvider 我需要添加与我的应用程序在