Записать файл личного доступа в каталог файлов другого приложения - PullRequest
7 голосов
/ 01 декабря 2010

Два приложения имеют одинаковый sharedUserId. Когда я использую этот код в app1

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

Я получаю исключение, сообщающее, что файл содержит разделитель пути.

Я пытаюсь записать файл из app1 в хранилище app2. (Мне, конечно же, нужно убедиться, что каталог файлов app2 существует первым)

В идеале, я бы писал в каталог для конкретного пользователя, а не в каталог для конкретного приложения, но я не знаю, можно ли это сделать

Ответы [ 4 ]

6 голосов
/ 01 декабря 2010

Прежде всего, НИКОГДА не используйте полный путь к внутренней памяти, такой как /data/data. Позвольте операционной системе указать вам путь (например, через Context.getFilesDir() или Environment.getExternalStorageState()). Не делайте предположений о том, где находятся данные.

Во-вторых, вы уже это делаете! В отличие от File, Context.openFileOutput уже добавляет /data/data/[package] к вашему пути, поэтому вам не нужно это указывать. Просто укажите имя файла.

Если вы действительно чувствуете, что это безопасно и необходимо, и если оба приложения используют один и тот же идентификатор пользователя с помощью android: sharedUserId в манифесте, вы можете получить контекст другого приложения с помощью Context.createPackageContext() и используйте CONTEXT_RESTRICTED, затем используйте openFileOutput только с именем файла.

5 голосов
/ 15 июля 2011

Поскольку этому месяцу, я предполагаю, что вы уже решили свою проблему, но я все равно внесу свой вклад.

Обмен данными между приложениями - это то, для чего нужны 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", только приложения, подписанные вами, могут получить доступ к поставщику контента и, следовательно, к вашим файлам.

5 голосов
/ 01 декабря 2010

Откройте FileOutputStream необходимого файла относительно этого пути:

String filePath = getPackageManager().
    getPackageInfo("com.your2ndApp.package", 0).
    applicationInfo.dataDir;
2 голосов
/ 01 декабря 2010

Вы не должны перезаписывать файлы других приложений. Тем не менее, у вас есть два решения

  1. Используйте общедоступное внешнее хранилище (например, SD-карту) для обмена файлами между приложениями.
  2. Если другое приложение не ваше, вы не можете писать в его каталог / data, без root. С root'ом возможно все, только не ожидайте, что у всех ваших пользователей есть root-доступ.

Редактировать: разработчику принадлежат оба приложения

Спасибо за Романа Курика за то, что указал на это. Ссылка на его пост на SO

с андроида документы

андроид: sharedUserId

Имя идентификатора пользователя Linux, который будет поделиться с другими приложениями. От по умолчанию Android назначает каждый Приложение имеет собственный уникальный идентификатор пользователя. Однако, если этот атрибут установлен в одинаковое значение для двух или более приложения, они все будут делиться тот же идентификатор - при условии, что они также подписано тем же сертификатом. Приложение с тем же идентификатором пользователя может доступ к данным друг друга и, если желательно, запустить в том же процессе.

Так что именно так работает идентификатор пользователя в linux, по сути вы являетесь владельцем обоих и имеете доступ на чтение и запись к обоим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...