如何在Android中跨一组应用程序共享数据

如何在Android中跨一组应用程序共享数据,android,sharedpreferences,android-contentprovider,android-external-storage,Android,Sharedpreferences,Android Contentprovider,Android External Storage,考虑以下场景。一家公司发布了许多应用程序。他们希望在所有这些应用程序中共享一些数据。这些应用程序中的任何一个都可以创建或读取这些数据,就像普通数据库一样。所以公司决定创建一个android库来实现这个目的。我搜索了几天,下面给出了我的分析 SharedReferences-不建议使用,已弃用。它也不起作用。所有其他应用程序都需要知道创建数据的应用程序的程序包名称才能创建PackageContext。在这里,这是不切实际的,因为任何应用程序都可以创建/更新/读取数据,并且不可能说出谁是谁 Cont

考虑以下场景。一家公司发布了许多应用程序。他们希望在所有这些应用程序中共享一些数据。这些应用程序中的任何一个都可以创建或读取这些数据,就像普通数据库一样。所以公司决定创建一个android库来实现这个目的。我搜索了几天,下面给出了我的分析

  • SharedReferences-不建议使用,已弃用。它也不起作用。所有其他应用程序都需要知道创建数据的应用程序的程序包名称才能创建PackageContext。在这里,这是不切实际的,因为任何应用程序都可以创建/更新/读取数据,并且不可能说出谁是谁

  • ContentProviders-这对我不起作用。每个应用程序中都必须存在内容提供商的原因。设备中不能有两个同名的内容提供商。除此之外,ContentProviders基本上是指一个应用程序创建数据,而其他应用程序使用Content_Uri订阅数据

  • 网络连接-我们不想在任何服务器上存储数据

  • 外部存储—这是剩下的唯一选项。我应该买这个吗

  • 有趣的是,数据也必须得到保护,这在任何存储选项中都不受支持


    注意:对于iOS,我们使用keychain实现相同的功能

    似乎您需要的是

    它允许应用程序沙箱在多个android应用程序之间共享,如果它们都由相同的签名签名


    但是,小心

    是的。在所有应用程序的外部存储中使用相同的路径可能是最好的方法。代码的公共部分可用于了解数据库是否存在,从而打开或创建新的数据库。为了安全起见,我建议在连接数据库时始终使用“用户”和“密码”,但如果您认为这还不够,我建议您查看以下内容:

    了解Android上的问题

    具有讽刺意味的是,由于iOS上的密集沙箱,如果需要共享数据的应用程序都是由同一个开发人员开发的,那么有一种简单的方法可以实现这一点(应用程序组)。很可能是因为安卓在安全性方面更灵活,这实际上是一个更困难的问题。到目前为止,安卓团队认为不适合提供一种方便、安全的方式来专门共享此类数据,因为存在一种低安全性的解决方法

    也就是说,有很多方法可以在不涉及云的情况下在应用程序之间共享数据

    共享参考资料

    原始问题指出SharedReference已被弃用。据我所知,这不是真的,但是MODE_WORLD_可读和MODE_WORLD_可写上下文已被弃用,这使得这种方法在将来可能无法工作。不过,自安卓4.2(2012年)以来,这种模式已经有相当一段时间被弃用了。在当前的Android文档中,没有任何威胁表明他们实际上正在逐步淘汰它(有时不赞成只是意味着“这不是一个好主意”而不是“这将被删除”)。我怀疑,在设置级别缺乏更安全的操作系统级别的直接应用程序数据共享替代方案,这可能是过去5年中将其保留在弃用状态的原因

    文件访问

    据我所知,在Android上实现应用程序间数据共享的最简单也是最常见的方法就是简单地请求设备上的文件访问,并在外部存储器上为这些数据创建一个共享位置。(不要被“外部存储”的名称所迷惑——这正是Android指共享数据的方式。它不一定指SD卡。)你给文件一个唯一的名称,然后把它存储在你的应用程序知道在哪里查找的地方。获得该路径的最佳方法如下: Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY\u文档)

    这方面的明显问题是安全性。虽然操作系统并不反对它,但它引入了与Android文档列表相同的问题,作为反对“世界”模式的原因——它本质上是不安全的,并在应用程序中打开了潜在的漏洞

    • 您正在将信息放置在一切都可以访问的位置 它
    • 您正在请求应用程序可能不需要的权限
    • 您正在读取无法验证其来源的文件
    如果您的应用程序没有处理任何敏感数据,那么这对您来说可能无关紧要(对您的用户来说可能无关紧要)。如果您计划从这些文件中读取数据,则应确保在解析之前为该数据提供最大限度的验证。检查文件大小、验证格式等

    创建自己的服务

    您始终可以创建服务或IntentService。(两者之间有细微的区别,但IntentService是服务的一个子类,在工作线程中运行,而服务中断主线程。IntentService还实现了Intent支持,在Android上提供最直接的应用程序间通信)

    此服务有自己的专用存储,它具有完全的读/写访问权限,但其他任何功能都没有。然后,该服务提供一个接口,用于接收来自其他应用程序的意图,并将结果(作为意图)返回给这些应用程序。这是实现应用程序间数据的一种非常友好的方法,同时最大限度地提高数据的隐私性和安全性。如果外围应用程序主要需要从中央应用程序请求非常基本的信息,这是您的入门级选项

    实现广播接收机

    同样,BroadcastReceiver类也是如此。这取决于您打算在应用程序之间共享的数据类型,以及这些应用程序对您的特定方法的熟悉程度