Android — SharedPreferences в профилях

Есть ли способ получить доступ к SharedPreferences через профили пользователей на Android?

Например, если UserA вносит изменения в настройки приложения, я хочу, чтобы это изменение было доступно и для UserB. Я пытался использовать текстовый файл, записанный по пути getFilesFir(), и прочитать его из другой учетной записи, но когда пользователь A записывает файл, он недоступен для пользователя B. Я пишу файлы с MODE_PRIVATE, так как MODE_WORLD_READABLE и MODE_WORLD_WRITABLE устарели, но я не уверен, что их использование поможет начать с них.

Кто-нибудь знает, есть ли способ централизовать настройки моего приложения, чтобы их можно было использовать для всех пользователей? Я хочу избежать записи чего-либо на SD-карту.


person Ali    schedule 11.09.2013    source источник
comment
Вы когда-нибудь заставляли это работать? у меня такая же проблема   -  person Tim    schedule 21.04.2016
comment
В итоге я написал файл на внешнем хранилище. Я использовал скрытие facebook, чтобы зашифровать его. Работал как шарм, не идеальное решение, но безопасно. Если вы хотите увидеть код, который я использовал, вы можете найти его здесь.   -  person Ali    schedule 26.04.2016


Ответы (4)


Вы не можете. Только SD-карта не требует разрешения пользователя.

person regisd    schedule 13.02.2016

Возможно, вы захотите ознакомиться с правилами, действующими при добавлении нескольких пользователей на устройство в этот документ в разделе Эффекты. Должно быть очевидно, что то, чего вы пытаетесь достичь, будет «творческим обходным путем» или просто невозможным.

Итак, какие средства Android существуют для того, чтобы приложения могли обмениваться данными, которые не являются файловой системой? Обычно используется ContentProvider, но я подозреваю, что два экземпляра приложения в песочнице не могут получить доступ к ContentProviders друг друга (и, кроме того, как бы вы их отличили друг от друга?).

Предположим, что приложения-экземпляры пользователя просто не могут получить доступ друг к другу. Может быть, они могли бы совместно использовать некоторые средства системного уровня, которые постоянно доступны для всех приложений, независимо от того, кто является активным пользователем? Единственное, что приходит мне в голову, когда я пишу это, это DropBoxManager. К сожалению, он не является надежно постоянным, поскольку существуют ограничения на объем, который он может хранить, и эти ограничения могут привести к тому, что ваши данные будут удалены из очереди в любое время, прежде чем они смогут быть прочитаны другим экземпляром приложения. Кроме того, данные там по существу общедоступны, что может быть не то, что вам нужно.

Если вы хотите сойти с ума, вы можете вернуться к ContentProviders и каким-то образом использовать поставщиков системного уровня для календаря или контактов, чтобы спрятать данные, если оба приложения знают, как найти секретную специальную запись. Дикие вещи.

Другим решением может быть хранение всех ваших данных на каком-либо сервере, и каждый пользователь должен вводить некоторый ключ, чтобы иметь возможность размещать и читать/записывать ваш блок данных на сервере. Если это не ручной ключ, попробуйте использовать некоторое "уникальное" свойство устройства как ключ. Это, вероятно, лучшее решение, так как у вас больше гарантий, что кто-то случайно не удалит или не раскроет ваши данные.

person Doug Stevenson    schedule 19.02.2016

Использование getSharedPreferences() с MODE_PRIVATE должно быть достаточным. Единственное, что вам нужно, это использовать контекст приложения. Таким образом, ваши общие настройки будут доступны из всех ваших действий независимо от текущего пользователя.

String PREFS_NAME = "com.your_application";
Context context = getApplicationContext();

Прочитайте пример предпочтения:

SharedPreferences reader;
reader = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
reader.getInt("name1", 3);

Напишите пример предпочтения:

SharedPreferences.Editor writer;
writer = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE).edit();
writer.putString("name2", "string").apply();
person toro    schedule 19.02.2016

Решением может быть предоставление поставщику содержимого настраиваемых разрешений и определите протокол для сохранения и восстановления настроек этого контент-провайдера.

person Radu Ionescu    schedule 19.02.2016