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

发布于 2024-10-05 05:59:25 字数 299 浏览 4 评论 0原文

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

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

出现异常,告诉我该文件包含路径分隔符。

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

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

The two apps have the same sharedUserId. When I use this code in app1

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

I get an exception telling me that the file contains a path separator.

I am trying to write a file from app1 into app2's storage. (I do of course need to make sure that app2's files directory exists first)

Ideally, I would write to a user specific directory instead of an app specific directory, but I do not know if that can be done

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

凝望流年 2024-10-12 05:59:25

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

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

如果您确实认为这是安全且必要的,并且两个应用程序在清单中使用 android:sharedUserId 共享相同的用户 ID,则可以使用 Context.createPackageContext() 并使用CONTEXT_RESTRICTED,然后使用仅包含文件名的 openFileOutput。

First of all, NEVER use a full path to internal storage like /data/data. Let the operating system give you the path (for example, via Context.getFilesDir() or Environment.getExternalStorageState()). Don't make assumption on where the data is.

Secondly - you already are doing that! Unlike File, Context.openFileOutput already prepends /data/data/[package] to your path, so you don't need to specify that. Just specify the file name.

If you really feel that it's safe and necessary, and if both apps share the same user ID using android:sharedUserId in the manifest, you can get a context of the other app by using Context.createPackageContext() and use CONTEXT_RESTRICTED, then use openFileOutput with only the file name.

梦里梦着梦中梦 2024-10-12 05:59:25

打开所需文件的 FileOutputStream ,相对于此路径:

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

Open a FileOutputStream of the needed file, relative to this path:

String filePath = getPackageManager().
    getPackageInfo("com.your2ndApp.package", 0).
    applicationInfo.dataDir;
黎夕旧梦 2024-10-12 05:59:25

由于这已经有几个月了,我认为您已经解决了您的问题,但无论如何我都会做出贡献。

ContentProvider 的用途是在应用程序之间共享数据。假设您知道如何编写 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”,只有您签名的应用程序才能访问您的内容提供程序,以及您的文件。

Since this is months old I assume you've already solved your problem, but I'll contribute anyway.

Sharing data between apps is what ContentProviders are for. Assuming that you know how to write a ContentProvider and access it, you can access files via ParcelFileDescriptor, which includes constants for the mode in which you create the files.

What you need now is to limit access so that not everybody can read the files through the content provider, and you do that via android permissions. In the manifest of one your apps, the one that will host the files and the content provider, write something like this:

<permission android:name="com.example.android.provider.ACCESS" android:protectionLevel="signature"/>

and in both apps add this:

<uses-permission android:name="com.example.android.provider.ACCESS" /> 

by using protectionLevel="signature", only apps signed by you can access your content provider, and thus your files.

星星的轨迹 2024-10-12 05:59:25

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

  1. 使用公共外部存储(如 SD 卡)在应用程序之间共享文件。
  2. 如果其他应用程序不是您的,那么您无法写入其 /data 目录,除非有 root 权限。使用 root 一切皆有可能,只是不要指望您的用户都拥有 root 访问权限。

编辑:开发人员拥有这两个应用程序

感谢 Roman Kurik 指出了这一点。从

android 文档

android:sharedUserId

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

所以这正是用户 ID 在 Linux 中的工作方式,本质上你是两者的所有者并且对两者都有读/写访问权限。

You should not be overwriting other applications files. That said you have two solutions

  1. Use public external storage (like the SD card) to share the file between the apps.
  2. If the other app is not yours then you can't write to its /data directory, without root that is. Anything is possible with root, just don't expect your users to all have root access.

Edit: Developer owns both applications

Thanks for Roman Kurik for pointing this out. A link to his post on SO

From the android docs

android:sharedUserId

The name of a Linux user ID that will
be shared with other applications. By
default, Android assigns each
application its own unique user ID.
However, if this attribute is set to
the same value for two or more
applications, they will all share the
same ID — provided that they are also
signed by the same certificate.
Application with the same user ID can
access each other's data and, if
desired, run in the same process.

So this is exactly the way user id's work in linux, essentially you are the owner of both and have read/write access to both.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文