2010-11-30 45 views
7

这两个应用程序具有相同的sharedUserId。当我在app1中使用此代码时将私人访问文件写入其他应用程序的文件目录

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

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

我想从app1写入文件到app2的存储。 (我当然需要确保App2的文件目录第一存在)

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

回答

6

首先,不要使用像/data/data这样的内部存储的完整路径。让操作系统为您提供路径(例如,通过Context.getFilesDir()Environment.getExternalStorageState())。不要假设数据在哪里。

其次 - 你已经这么做了!与File不同,Context.openFileOutput已经将/data/data/[package]加到您的路径中,因此您无需指定该路径。只需指定文件名称即可。

如果你真的认为它是安全的和必要的,如果这两个应用程序使用的android共享相同的用户ID:在清单sharedUserId,您可以通过使用Context.createPackageContext()得到其他应用程序的情况下,用CONTEXT_RESTRICTED,然后用openFileOutput只有文件名。

+1

但我怎么说app1应该写一个文件到app2? – 2010-11-30 21:23:06

+1

这通常是不鼓励的。你不应该写入另一个应用程序的私人存储! MODE_PRIVATE特别不会让你变得很好 - 数据甚至不会被其他应用程序读取!如果你确实需要使用`File`来指定一个绝对路径。但这听起来像是你开始时使用了错误的方法。 – EboMike 2010-11-30 21:24:51

+1

首先(我认为)MODE_PRIVATE会工作,因为我使用相同的sharedUserId。其次,我打算将共享数据写入这两个应用程序。未知应用无法访问共享数据很重要。 – 2010-11-30 21:28:11

2

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

  1. 使用公共外部存储(如SD卡)在应用程序之间共享文件。
  2. 如果其他应用程序不是你的,那么你不能写入它的/ data目录,没有root的。任何使用root的都可能,只是不要指望你的用户都拥有root权限。

编辑:开发者同时拥有应用

感谢罗马Kurik指出了这一点。他的帖子的链接上SO

从Android docs

安卓sharedUserId

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

因此,这正是用户ID在Linux中的工作方式,基本上你是两者的拥有者,并且都具有读/写访问权限。

5

打开所需要的文件的FileOutputStream,相对于这个路径:

String filePath = getPackageManager(). 
    getPackageInfo("com.your2ndApp.package", 0). 
    applicationInfo.dataDir; 
5

由于这是个老我假设你已经解决了你的问题,但无论如何,我会做出贡献。

在应用程序之间共享数据是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"/> 

,并在这两个应用程序添加此“签名”,只有您签名的应用才能访问您的内容提供商,从而访问您的文件。

相关问题