Android 将私人访问文件写入另一个应用程序';s文件目录
这两个应用程序具有相同的sharedUserId。当我在app1中使用此代码时Android 将私人访问文件写入另一个应用程序';s文件目录,android,file,shared,Android,File,Shared,这两个应用程序具有相同的sharedUserId。当我在app1中使用此代码时 context.openFileOutput("/data/data/org.me.app2/files/shared-data.dat", MODE_PRIVATE) 我得到一个异常,告诉我文件包含一个路径分隔符 我正试图将一个文件从app1写入app2的存储器。(我当然需要首先确保app2的文件目录存在) 理想情况下,我会写入特定于用户的目录,而不是特定于应用程序的目录,但我不知道是否可以这样做首先,不要使用像
context.openFileOutput("/data/data/org.me.app2/files/shared-data.dat", MODE_PRIVATE)
我得到一个异常,告诉我文件包含一个路径分隔符
我正试图将一个文件从app1写入app2的存储器。(我当然需要首先确保app2的文件目录存在)
理想情况下,我会写入特定于用户的目录,而不是特定于应用程序的目录,但我不知道是否可以这样做首先,不要使用像
/data/data
这样的内部存储的完整路径。让操作系统为您提供路径(例如,通过Context.getFilesDir()
或Environment.getExternalStorageState()
)。不要假设数据在哪里
第二,你已经在这么做了!与File
不同,Context.openFileOutput
已将/data/data/[package]
预先添加到路径中,因此无需指定该路径。只需指定文件名
如果您确实认为这是安全和必要的,并且如果两个应用程序在清单中使用android:sharedUserId共享相同的用户ID,您可以通过使用和使用context_RESTRICTED来获取另一个应用程序的上下文,然后使用openFileOutput,仅使用文件名。您不应该覆盖其他应用程序文件。也就是说你有两个解决方案
因此,这正是用户id在linux中的工作方式,本质上,您是这两个文件的所有者,并且对这两个文件都有读/写访问权。打开所需文件的
文件输出流
,相对于以下路径:
String filePath = getPackageManager().
getPackageInfo("com.your2ndApp.package", 0).
applicationInfo.dataDir;
因为这已经有几个月了,我想你已经解决了你的问题,但我还是会做出贡献的 在应用程序之间共享数据是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”,只有您签名的应用程序才能访问您的内容提供商,从而访问您的文件。但我怎么说app1应该将文件写入app2?这通常是不鼓励的。您不应该写入其他应用程序的私有存储!MODE_PRIVATE对你没有多大好处-其他应用程序甚至无法读取数据!如果确实需要,请使用
File
指定绝对路径。但听起来你一开始使用的方法是错误的。首先(我认为)MODE_PRIVATE会起作用,因为我使用的是同一个sharedUserId。其次,我计划将共享数据写入这两个应用程序。未知应用不能访问共享数据,这一点很重要。请尝试使用context.createPackageContent()
为其他应用创建上下文,然后仅使用文件名使用openFileOutput
。我还没试过,但既然你有一个sharedUserId,那可能就行了。如果它不起作用,我也不会感到惊讶。如果你把有用的信息从评论中移到答案中,我会给你一票。这两个应用程序有相同的sharedUserId。我控制这两个应用程序。同样重要的是,不相关的应用程序不能访问我的数据。所以我认为这两种选择中的任何一种都行不通。。。但这是关于根的。你是说我可以以root用户身份运行我的应用程序吗?在大多数手机上都可以获得root用户访问权限,这就是自定义ROM的安装方式。从那里,应用程序可以通过“超级用户”应用程序请求root用户。但是,既然你控制了这两个应用程序,那么应该有一个更简单的解决方案,我稍后会给你回复。+1:我可以用这个来检查其他应用程序上的修改时间/存在,而不使用绝对路径。。谢谢。事实上,我最终使用了createPackageContent
非常有趣。但是,我无法尝试,因为该解决方案已经实施,任何/所有其他应用程序/升级都可能重新使用现有系统+1无论如何。我认为你的解决方案是有效的,尽管我还没有测试出来。