将私有访问文件写入另一个应用程序的文件目录

时间:2010-11-30 21:15:45

标签: android file shared

这两个应用具有相同的sharedUserId。当我在app1中使用此代码时

context.openFileOutput("/data/data/org.me.app2/files/shared-data.dat", MODE_PRIVATE)

我得到一个异常,告诉我该文件包含一个路径分隔符。

我正在尝试将app1中的文件写入app2的存储空间。 (我当然需要确保app2的文件目录首先存在)

理想情况下,我会写一个特定于用户的目录而不是特定于应用程序的目录,但我不知道是否可以这样做

4 个答案:

答案 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)

您不应该覆盖其他应用程序文件。那说你有两个解决方案

  1. 使用公共外部存储(如SD卡)在应用程序之间共享文件。
  2. 如果其他应用程序不是您的,那么您无法写入其/ data目录,没有root用户。 root用户可以做任何事情,只是不要指望你的用户都拥有root权限。
  3. 编辑:开发者拥有两个应用程序

    感谢Roman Kurik指出这一点。指向SO

    上的帖子的链接

    来自android docs

      

    机器人:sharedUserId

         

    将要使用的Linux用户ID的名称   与其他应用程序共享。通过   默认情况下,Android分配每个   应用程序自己唯一的用户ID。   但是,如果此属性设置为   两个或两个以上相同的值   应用程序,他们将共享   相同的ID - 只要他们也是   由同一证书签署。   具有相同用户ID的应用程序可以   访问彼此的数据,如果   期望,在同一过程中运行。

    所以这正是用户id在linux中工作的方式,基本上你是两者的拥有者,并且对两者都有读/写权限。