studio - Android: recuperación de preferencias compartidas de otra aplicación
sharedpreferences android code (6)
Tengo una aplicación de configuración de la que tengo que recuperar otras preferencias de las aplicaciones, pero no tengo los detalles de las claves en ellos, ¿cómo puedo recuperar todas las claves disponibles y los valores en esa preferencia?
Gracias, Swathi
¡Bueno! usando este código en la Aplicación 1 (con el nombre del paquete es "com.sharedpref1") para almacenar datos con Preferencias Compartidas.
SharedPreferences prefs = getSharedPreferences("demopref",
Context.MODE_WORLD_READABLE);
SharedPreferences.Editor editor = prefs.edit();
editor.putString("demostring", strShareValue);
editor.commit();
Y usar este código en la Aplicación 2 para obtener datos de las Preferencias Compartidas en la Aplicación 1. Podemos obtenerlo porque usamos MODE_WORLD_READABLE en la aplicación 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());
}
Más información, visite esta URL: http://androiddhamu.blogspot.in/2012/03/share-data-across-application-in.html
Además, debe agregar el mismo android: sharedUserId en el archivo de manifiesto de ambas aplicaciones.
Desafortunadamente, los documentos ahora ni siquiera explican MODE_WORLD_READABLE y MODE_WORLD_WRITEABLE, sino que dicen:
Esta constante se depreció en el nivel de API 17. La creación de archivos legibles a nivel mundial es muy peligrosa y es probable que cause agujeros de seguridad en las aplicaciones. Es fuertemente desaconsejado; en cambio, ... etc.
Desde la depreciación, implementar el uso compartido de archivos entre aplicaciones con preferencias compartidas puede ser demasiado arriesgado, aunque fue simple. No me preocupan demasiado los agujeros de seguridad del modo MODE_WORLD_READABLE en las aplicaciones de juegos en las que solo quiero transferir caracteres de una aplicación a otra. Es una lástima que depreciaron ambos modos de compartir.
Es simple recuperar datos de preferencias compartidas de la tienda de una aplicación a otra.
Paso 1: agregue el mismo android:sharedUserId="android.uid.shared"
en los archivos de manifiesto de ambas aplicaciones.
Paso 2: Aplicación Value Value1
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();
Paso 3: Obtener valor de la aplicación2
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();
}
Puede funcionar si queremos leer el valor de la periferia de otra aplicación / paquete / proceso. pero hay algo mal en la respuesta de jkhouw1:
Context myContext = createPackageContext("com.example",
Context.MODE_WORLD_WRITEABLE);
Debería ser :
Context myContext = createPackageContext("com.example",
Context.CONTEXT_IGNORE_SECURITY);
sin embargo, CONTEXT_IGNORE_SECURITY y MODE_WORLD_WRITEABLE con el mismo valor de "int 2" En absoluto, gracias por esta pregunta y respuestas.
Suponiendo que la preferencia sea WORLD_READABLE, esto podría funcionar:
final ArrayList<HashMap<String,String>> LIST = new ArrayList<HashMap<String,String>>();
Context myContext = createPackageContext("com.example",
Context.MODE_WORLD_WRITEABLE); // where com.example is the owning app containing the preferences
SharedPreferences testPrefs = myContext.getSharedPreferences
("test_prefs", Context.MODE_WORLD_READABLE);
Map<String, ?> items = testPrefs .getAll();
for(String s : items.keySet()){
//do somthing like String value= items.get(s).toString());
}