2016-11-28 147 views
0

我写了2个应用程序,其数据从互联网下载。由于此数据(大约40Mb,在几个zip文件中)是相同的,因此我希望在2个应用程序之间共享它,以便为用户消耗更少的带宽和更少的存储空间。在Android应用程序之间共享不可变文件

目前,我还没有找到一个很好的解决方案:

  • 的渊源,我在公众下载目录中保存的数据。 这是一个简单的解决方案,但它需要读取权限,我想避免这种情况。
  • 后来我想,我可以使用内容提供商(和inputStreams和mmaped字节缓冲区),但为核心,我的应用使许多zip文件 在一个大ZipResourceFile其中: 一些压缩文件的读取和复制 一些非压缩文件被mmaped和

所以作为Lucene的数据库,我可以约一个简单的FileProvider忘记,因为我需要一个文件得到的ZipFile以解压缩我的数据

此外,它可能会建立一个ZipFileProvider,在那里我的文件将被放在一个大的ZipResourceFile中,其部分将被服务唉内容提供商,像这样的库做:
https://github.com/jarondl/android-zipfileprovider/blob/master/src/net/jarondl/zipfileprovider/ZipFileProvider.java

但是,如果我得到一些通过这样的ZipFileContentProvider mmaped字节缓冲区,这将是能够有一个长期和安全的生活吗? (我应该使用服务?) 如果服务它的ZipFileContentProvider进程死了怎么办? 记忆体消耗情况如何?什么是警告? ContentProvider是不是应该以短命的方式使用?

有没有更好的解决方案?

UPDATE:

真的很讨厌那个机器人不能共享目录从同一developper(和其他没有人)一些应用程序。或者可能吗?

UPDATE2:

我认为存储文件的getExternalFilesDir(),但下面的正式警告是让我非常紧张(什么写什么?):

注意事项虽然提供的目录getExternalFilesDir()和 getExternalFilesDirs()不是由MediaStore内容提供商 访问,其他应用程序与READ_EXTERNAL_STORAGE权限的用户可以访问 到外部存储器上的所有文件,包括这些。如果您需要 完全限制文件的访问权限,则应该将文件写入 到内部存储器。

+0

不能使用ZipInputStream封装从ContentResolver打开的InputStream吗? –

+0

没想过。与ZipFileProvider相比,性能应该是可怕的,尽管当你必须遍历整个文件来读取最后一个zipEntry时... – Lakedaemon

回答

1

真的很讨厌那个机器人不能共享的目录来自同一developper一些应用程序。或者可能吗?其可能的

幽州在此之前这一点,但你要设法避免它

的渊源,我在公众下载目录中保存的数据。这是一个简单的解决方案,但它需要读取权限,我想避免这种情况。

使用读取权限没有任何问题。或者为此写入许可。是否有任何特定原因希望避免它?

在适合您的两个应用程序的位置添加读取/写入权限,并访问您自己的重新使用的文件夹结构。它不一定是公共下载目录。例如<com.MyCompanyNamespace>/Data

然后,你可以:

  1. 检查您的文件夹
  2. 否则检查公共文件夹,并移动到文件夹。
  3. 否则直接下载网站。

使用读/写比较没有任何问题。你可以在应用程序商店或应用程序中说明为什么需要权限,以缓解他们的想法。

我知道你已经加载了更多的问题,但希望这个简单的答案消除了需求。

+1

1)money:一些用户避开要求权限的应用程序 2)security:如果恶意应用程序读/写权限访问我的文件在外部存储(比如getExternalFilesDir())并巧妙地篡改它们(以便应用程序有时崩溃)? – Lakedaemon

+0

@Lakedaemon虽然我同意第1点,但这是一个很小的百分比,大多数(如果不是全部的话)可以通过在安装之前指定什么权限来重新确定。又名应用程序之间存储共享文件。不从设备读取任何其他数据。 (如上所述)2.然后,您击中了根本不读取权限的其他受众。这是可以接受的超出你的控制。但应该考虑,如果发生这种情况,它将不得不针对每个文件(不太可能是特定的)。所有应用程序/设备都会受到影响。你的应用不会被指责。 – Doomsknight

+0

如果每个应用程序在getExternalFileDirs()中写入数据并要求读取权限来访问其他应用程序的数据,它确实提供了最佳的类性能,并要求单个读取权限作为权衡。 如果没有更好的解决方案出现,我会接受你的答案。 – Lakedaemon

相关问题