Android: как удалить общие настройки в другом пакете

В моем приложении Android я закодировал, чтобы читать общие данные другого приложения Android, а затем удалять эти данные из общих настроек. Мой код выглядит следующим образом:

try { con = createPackageContext("com.testapp.ws", 0); SharedPreferences pref = con.getSharedPreferences("demopref", Context.MODE_PRIVATE); ipAdr = pref.getString("demostring", "No Value"); pref.edit().remove("demopref").commit(); } 

Это показывает следующую ошибку:

 06-12 11:52:07.400: E/ApplicationContext(3587): Couldn't rename file /data/data/com.testapp.ws/shared_prefs/demopref.xml to backup file /data/data/com.testapp.ws/shared_prefs/demopref.xml.bak 

Я использовал этот метод в другом приложении для создания общих данных

  public void shareData(){ String strShareValue = ip; SharedPreferences prefs = getSharedPreferences("demopref",Context.MODE_WORLD_READABLE); SharedPreferences.Editor editor = prefs.edit(); editor.putString("demostring", strShareValue); editor.commit(); } 

Как я могу это сделать ? Можно ли добавить файл манифеста?

Благодаря!

Если вы используете android: sharedUserId в файлах манифеста, он должен работать. Это проблема с разрешениями, которые я использовал для себя.

Для этого вам просто нужно добавить тег, такой как android:sharedUserId="com.example.you" в свой <manifest> в файле AndroidManifest.xml для обоих ваших приложений (и com.example.you Быть одинаковым в обоих приложениях, конечно).

Пример начала файла манифеста:

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="package.name" android:versionCode="1" android:versionName="1.0" android:sharedUserId="com.example.you" > ... 

Подробное описание способа получения этой работы см. В моем ответе « Как я могу поделиться файлом SharedPreferences в двух разных приложениях для Android?

Вы должны использовать MODE_WORLD_READABLE вместо MODE_PRIVATE . Прочтите документы для получения дополнительной информации.

Ниже приведено руководство, чтобы проверить, если у вас есть больше ошибок.

В то время как другие решения здесь будут технически работать в большинстве случаев, инфраструктура, которую Android предоставила вам для обмена данными между процессами / приложениями, – это ContentProvider . Это может показаться большим количеством дополнительной абстракции, но это тот, который гарантированно работает.

Хотя интерфейс для этого компонента отражает вызовы в базе данных, базовая структура данных может быть любым, что вам нравится. В частности, вы можете вернуть MatrixCursor в ответ на запросы, которые предоставляют содержимое вашего объекта SharedPreferences , и вы можете реализовать схему URI для вызовов для удаления / обновления, которые могут использоваться для изменения предпочтений других приложений.

Вот ссылка на сообщение в блоге от другого разработчика, который использовал MatrixCursor для обмена предпочтениями.

НТН

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

Обратите внимание, что все мои замечания касаются ICS (4.0.2 и 4.0.4).

  1. Если вы измените android:sharedUserId , удалите приложение, поскольку права на файл / папку будут неверными. Поэтому вы не должны изменять это значение, если вы уже изменили приложение.
  2. Если вы измените значения Context.MODE_* , удалите данные приложения (или все приложение), чтобы убедиться, что права доступа к файлам неверны.
  3. Если вы используете android:sharedUserId , обязательно подпишите приложения с тем же сертификатом .
  4. Используйте другое имя файла для предпочтений в двух приложениях. У меня были проблемы с приложением, просто просматривающим локальные общие настройки, хотя я использовал createPackageContex() .

Это то, что сработало для меня в конце:

  1. Я использовал тот же android:sharedUserId для двух приложений. (Не тот же android:process .)
  2. Я использовал Context.MODE_WORLD_READABLE для чтения и записи локальных префов, а также для чтения привилегий другого приложения.
  3. Я использовал Context.CONTEXT_IGNORE_SECURITY при вызове createPackageContext() .