#android #preferences #shared
#Android #настройки #общие
Вопрос:
У меня есть приложение настроек, из которого я должен получить настройки других приложений, но у меня нет сведений о ключах в них, как я могу получить все доступные ключи и значения в этом предпочтении?
Спасибо, Swathi
Ответ №1:
Хорошо! использование этого кода в приложении 1 (с именем пакета «com.sharedpref1») для хранения данных с общими настройками.
SharedPreferences prefs = getSharedPreferences("demopref",
Context.MODE_WORLD_READABLE);
SharedPreferences.Editor editor = prefs.edit();
editor.putString("demostring", strShareValue);
editor.commit();
И использование этого кода в приложении 2 для получения данных из общих настроек в приложении 1. Мы можем получить это, потому что мы используем MODE_WORLD_READABLE в приложении 1:
try {
con = createPackageContext("com.sharedpref1", 0);
SharedPreferences pref = con.getSharedPreferences(
"demopref", Context.MODE_PRIVATE);
String data = pref.getString("demostring", "No Value");
displaySharedValue.setText(data);
} catch (NameNotFoundException e) {
Log.e("Not data shared", e.toString());
}
Для получения дополнительной информации, пожалуйста, посетите этот URL:
http://androiddhamu.blogspot.in/2012/03/share-data-across-application-in.html
Комментарии:
1. это хороший код: в моем случае сначала я не использовал ввод имени пакета из первого приложения. но теперь это работает. Вместо «Context.MODE_WORLD_READABLE» в App1 я попробовал использовать «Context.MODE_PRIVATE» в сочетании с «android: sharedUserId» и «android: sharedUserLabel» в обоих AndroidManifest.xml Приложения. Причина, по которой я использовал эту комбинацию, заключалась в том, что мне нужны права доступа только для моих собственных приложений. С «MODE_WORLD_READABLE» был бы также доступ к другим приложениям, которые мне не нужны. Возможно, эта информация также полезна для некоторых.
2. Это отличный ответ, и дополнение @KingAlex1985 позволяет моему платному приложению считывать общие настройки своего бесплатного собрата, не открывая их миру. Также работает с ‘PreferenceManager.getDefaultSharedPreferences(con)’. Я добавил ‘android: sharedUserId’ и ‘android: sharedUserLabel’ к обоим приложениям.
3. @danhnn.uit Почему ты вставил
0
вcreatePackageContext
?4. Кроме того, с точки зрения безопасности вы можете использовать алгоритм шифрования в приложении 1, затем сохранить его в общих настройках, а затем использовать расшифровку в приложении 2 для доступа к данным. Это гарантирует вам, что если в любом случае какое-либо другое приложение имеет доступ к общим данным предпочтений, то и это приложение не сможет увидеть ваши конфиденциальные данные.
Ответ №2:
Предполагая, что предпочтения являются WORLD_READABLE, это может сработать:
final ArrayList<HashMap<String,String>> LIST = new ArrayList<HashMap<String,String>>();
// where com.example is the owning app containing the preferences
Context myContext = createPackageContext("com.example", Context.MODE_WORLD_WRITEABLE);
SharedPreferences testPrefs = myContext.getSharedPreferences("test_prefs", Context.MODE_WORLD_READABLE);
Map<String, ?> items = testPrefs .getAll();
for(String s : items.keySet()) {
// do something like String value = items.get(s).toString());
}
Комментарии:
1. Вы делаете это в другом приложении (приложении, которому принадлежат настройки). К какому из ваших вопросов, похоже, у вас нет доступа, поскольку, если бы вы это сделали, вы бы знали доступные ключи. Но вы делаете это аналогично описанному выше с помощью mode_world_readable. это действительно очень плохой способ ведения дел, и если вы хотите поделиться данными, вы должны следовать предложению commonsware
2. приложение должно иметь режим WORLD_READABLE — может быть, вы это имели в виду и неправильно ввели его? WOLRD_WRITABLE означает, что любой может писать в него.
3. Я пробовал, но не могу прочитать значение из другого приложения
4. как бы вы обновили значение в настройках, загруженных из другого приложения …?
5. Режимы MODE_WORLD_READABLE и MODE_WORLD_WRITEABLE устарели с 17-го уровня API. Начиная с 24-го уровня API, это вызовет исключение SecurityException: developer.android.com/training/data-storage / …
Ответ №3:
Кроме того, вы должны добавить тот же android: sharedUserId в файл манифеста обоих приложений.
Комментарии:
1. Как мы можем использовать файлы манифеста в обоих приложениях. Не могли бы вы, пожалуйста, привести пример для того же?
Ответ №4:
К сожалению, документы теперь даже не объясняют MODE_WORLD_READABLE и MODE_WORLD_WRITEABLE, вместо этого говоря:
Эта константа была снижена на уровне API 17. Создание файлов, доступных для чтения во всем мире, очень опасно и может привести к дырам в безопасности приложений. Это настоятельно не рекомендуется; вместо этого …. и т. Д
После снижения стоимости реализация совместного использования файлов между приложениями с sharedpreferences может быть слишком рискованной, хотя это было просто. Меня не слишком беспокоят дыры в безопасности из-за режима MODE_WORLD_READABLE в игровых приложениях, где я просто хочу иметь возможность переносить персонажей из одного приложения в другое. Очень жаль, что они обесценили оба режима совместного использования.
Ответ №5:
Это может сработать, если мы хотим прочитать значение perference из другого приложения / pkg / process. но в ответе jkhouw1 что-то не так:
Context myContext = createPackageContext("com.example",
Context.MODE_WORLD_WRITEABLE);
Это должно быть :
Context myContext = createPackageContext("com.example",
Context.CONTEXT_IGNORE_SECURITY);
хотя CONTEXT_IGNORE_SECURITY и MODE_WORLD_WRITEABLE имеют одинаковое значение «int 2»
В целом, спасибо за этот вопрос и ответы.
Ответ №6:
Легко получить данные общих настроек хранилища из одного приложения в другое приложение.
Шаг 1: добавьте одно и то же android:sharedUserId="android.uid.shared"
в файлы манифеста обоих приложений.
Шаг 2: Приложение для сохранения значений1
SharedPreferences preferences = context.getSharedPreferences("token_id", Context.MODE_WORLD_READABLE);
Editor editor = preferences.edit();
editor.putString("shared_token", encryptedValue);
Log.e("aaa *** shared_token : ", encryptedValue.toString());
editor.commit();
Шаг 3: Получаем значение из application2
Context con = null;
try {
con = createPackageContext("application2 package name", Context.CONTEXT_IGNORE_SECURITY);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
try {
if (con != null) {
SharedPreferences pref = con.getSharedPreferences(
"token_id", Context.MODE_WORLD_READABLE);
String data = pref.getString("shared_token", "");
Log.d("msg", "Other App Data: " data);
} else {
Log.d("msg", "Other App Data: Context null");
}
} catch (Exception e) {
e.printStackTrace();
}