Android 将私人访问文件写入另一个应用程序';s文件目录

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的文件目录存在) 理想情况下,我会写入特定于用户的目录,而不是特定于应用程序的目录,但我不知道是否可以这样做首先,不要使用像

这两个应用程序具有相同的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:sharedUserId共享相同的用户ID,您可以通过使用和使用context_RESTRICTED来获取另一个应用程序的上下文,然后使用openFileOutput,仅使用文件名。

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

  • 使用公共外部存储(如SD卡)在应用程序之间共享文件
  • 如果另一个应用程序不是你的,那么如果没有根目录,你就无法写入它的/data目录。使用root,任何事情都是可能的,只是不要期望您的用户都具有root访问权限
  • 编辑:开发者拥有这两个应用程序

    感谢罗曼·库里克指出这一点。链接到他在

    来自安卓系统

    android:sharedUserId

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


    因此,这正是用户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无论如何。我认为你的解决方案是有效的,尽管我还没有测试出来。