这两个应用具有相同的sharedUserId。当我在app1中使用此代码时
context.openFileOutput("/data/data/org.me.app2/files/shared-data.dat", MODE_PRIVATE)
我得到一个异常,告诉我该文件包含一个路径分隔符。
我正在尝试将app1中的文件写入app2的存储空间。 (我当然需要确保app2的文件目录首先存在)
理想情况下,我会写一个特定于用户的目录而不是特定于应用程序的目录,但我不知道是否可以这样做
答案 0 :(得分:6)
首先,永远不要使用像/data/data
这样的内部存储的完整路径。让操作系统为您提供路径(例如,通过Context.getFilesDir()
或Environment.getExternalStorageState()
)。不要假设数据在哪里。
其次 - 你已经这样做了!与File
不同,Context.openFileOutput
已将/data/data/[package]
添加到您的路径中,因此您无需指定该路径。只需指定文件名。
如果您确实认为它是安全且必要的,并且两个应用程序在清单中使用android:sharedUserId共享相同的用户ID,您可以使用Context.createPackageContext()
获取其他应用程序的上下文并使用CONTEXT_RESTRICTED,然后使用openFileOutput只使用文件名。
答案 1 :(得分:5)
相对于此路径打开所需文件的FileOutputStream
:
String filePath = getPackageManager().
getPackageInfo("com.your2ndApp.package", 0).
applicationInfo.dataDir;
答案 2 :(得分:5)
由于这已经有几个月了,我认为你已经解决了问题,但无论如何我都会做出贡献。
在应用程序之间共享数据是ContentProviders的用途。假设您知道如何编写ContentProvider并访问它,您可以通过ParcelFileDescriptor访问文件,其中包括您创建文件的模式的常量。
您现在需要的是限制访问权限,以便不是每个人都可以通过内容提供商读取文件,并通过Android权限执行此操作。在您的应用程序的清单中,将托管文件和内容提供程序的应用程序,编写如下内容:
<permission android:name="com.example.android.provider.ACCESS" android:protectionLevel="signature"/>
并在两个应用中添加:
<uses-permission android:name="com.example.android.provider.ACCESS" />
使用protectionLevel =“signature”,只有您签名的应用才能访问您的内容提供商,从而访问您的文件。
答案 3 :(得分:2)
您不应该覆盖其他应用程序文件。那说你有两个解决方案
编辑:开发者拥有两个应用程序
感谢Roman Kurik指出这一点。指向SO
上的帖子的链接来自android docs
机器人:sharedUserId
将要使用的Linux用户ID的名称 与其他应用程序共享。通过 默认情况下,Android分配每个 应用程序自己唯一的用户ID。 但是,如果此属性设置为 两个或两个以上相同的值 应用程序,他们将共享 相同的ID - 只要他们也是 由同一证书签署。 具有相同用户ID的应用程序可以 访问彼此的数据,如果 期望,在同一过程中运行。
所以这正是用户id在linux中工作的方式,基本上你是两者的拥有者,并且对两者都有读/写权限。