You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

跨应用访问SharedPreferences存储数据的可行性及替代方案咨询

问题解答

首先直接给出结论:另一个应用完全无法通过这段代码访问到目标数据,不管设备是否重启都不行

为什么访问不到?

getDefaultSharedPreferences()获取的是当前应用的私有SharedPreferences实例,它的存储文件位于应用专属的沙箱目录(/data/data/[你的应用包名]/shared_prefs/)。Android的应用沙箱机制会严格隔离不同应用的私有目录,其他应用没有权限访问这个路径下的内容。

而且每个应用的getDefaultSharedPreferences对应的文件名是和包名绑定的,不同应用调用这个方法时,指向的是完全不同的文件,自然读不到其他应用存储的数据。

实现跨应用数据共享的可行方案

如果需要让多个应用共享数据,推荐以下几种规范的方式:

  • 带sharedUserId的自定义SharedPreferences

    1. 在两个应用的AndroidManifest.xml中添加相同的sharedUserId属性,比如:
      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
                android:sharedUserId="com.yourcompany.shared">
      
    2. 存储数据时,不要用getDefaultSharedPreferences,而是使用自定义的SharedPreferences:
      SharedPreferences.Editor preferencesEditor = getSharedPreferences("shared_count", Context.MODE_PRIVATE).edit();
      preferencesEditor.putInt("count", mValue);
      preferencesEditor.apply();
      
    3. 另一个应用用相同的方式读取:
      SharedPreferences sharedPref = getSharedPreferences("shared_count", Context.MODE_PRIVATE);
      int value = sharedPref.getInt("count",0);
      

    注意:这种方式要求两个应用使用相同的签名打包,且sharedUserId一旦设置就不能随意修改,否则会导致应用无法正常更新。

  • ContentProvider(官方推荐)
    这是Android跨应用数据共享的标准方案,你可以在存储数据的应用中实现自定义ContentProvider,封装数据的读取、写入逻辑,另一个应用通过ContentResolver来调用这些接口。这种方式支持权限控制,能精准限制哪些应用可以访问数据,还能处理并发访问的问题,安全性和扩展性都更好。

  • 绑定服务(Bound Service)
    如果共享数据需要复杂的业务逻辑支撑,可以在存储数据的应用中创建绑定服务,提供数据访问的方法,其他应用通过绑定该服务来获取数据。同样可以通过权限配置来管控访问权限。

  • 外部存储(谨慎使用)
    把数据存储在外部存储的公共目录,或者应用的外部私有目录(需申请存储权限)。但这种方式安全性较低,任何拥有存储权限的应用都可能访问到数据,且数据容易被用户清除或丢失。

⚠️ 注意:不要使用已废弃的MODE_WORLD_READABLEMODE_WORLD_WRITEABLE模式,这些模式存在严重的安全漏洞,Android 7.0及以上版本已经完全禁用了它们。

内容的提问来源于stack exchange,提问作者Bazouk55555

火山引擎 最新活动