将私人访问文件写入其他应用程序的文件目录
这两个应用程序具有相同的sharedUserId。当我在app1中使用此代码时将私人访问文件写入其他应用程序的文件目录
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共享相同的用户ID:在清单sharedUserId,您可以通过使用Context.createPackageContext()
得到其他应用程序的情况下,用CONTEXT_RESTRICTED,然后用openFileOutput只有文件名。
您不应该覆盖其他应用程序文件。这就是说你有两个解决方案
- 使用公共外部存储(如SD卡)在应用程序之间共享文件。
- 如果其他应用程序不是你的,那么你不能写入它的/ data目录,没有root的。任何使用root的都可能,只是不要指望你的用户都拥有root权限。
编辑:开发者同时拥有应用
感谢罗马Kurik指出了这一点。他的帖子的链接上SO
从Android docs
安卓sharedUserId
将 与其他应用程序共享一个Linux用户ID的名称。默认情况下,Android为每个 应用程序分配其自己的唯一用户ID。 但是,如果此属性设置为 两个或多个应用程序的相同值,它们将全部共享 相同的ID - 前提是它们也由 由相同证书签名。 具有相同用户ID的应用程序可以使用 访问彼此的数据,并且如果需要 ,则可以在相同的过程中运行。
因此,这正是用户ID在Linux中的工作方式,基本上你是两者的拥有者,并且都具有读/写访问权限。
打开所需要的文件的FileOutputStream
,相对于这个路径:
String filePath = getPackageManager().
getPackageInfo("com.your2ndApp.package", 0).
applicationInfo.dataDir;
由于这是个老我假设你已经解决了你的问题,但无论如何,我会做出贡献。
在应用程序之间共享数据是ContentProviders的用途。假设您知道如何编写ContentProvider并访问它,可以通过ParcelFileDescriptor访问文件,ParcelFileDescriptor包含创建文件的模式的常量。
您现在需要的是限制访问权限,以便不是每个人都可以通过内容提供者读取文件,而是通过android权限执行此操作。在一个你的应用程序的清单,一个将主机上的文件和内容提供商,写的是这样的:使用的ProtectionLevel =
<uses-permission android:name="com.example.android.provider.ACCESS" />
:
<permission android:name="com.example.android.provider.ACCESS" android:protectionLevel="signature"/>
,并在这两个应用程序添加此“签名”,只有您签名的应用才能访问您的内容提供商,从而访问您的文件。
但我怎么说app1应该写一个文件到app2? – 2010-11-30 21:23:06
这通常是不鼓励的。你不应该写入另一个应用程序的私人存储! MODE_PRIVATE特别不会让你变得很好 - 数据甚至不会被其他应用程序读取!如果你确实需要使用`File`来指定一个绝对路径。但这听起来像是你开始时使用了错误的方法。 – EboMike 2010-11-30 21:24:51
首先(我认为)MODE_PRIVATE会工作,因为我使用相同的sharedUserId。其次,我打算将共享数据写入这两个应用程序。未知应用无法访问共享数据很重要。 – 2010-11-30 21:28:11