2011-05-17 26 views

Respuesta

19

Suponiendo que la preferencia son 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()); 
    } 
+2

Usted lo hace en la otra aplicación (la aplicación que posee las preferencias).Que de su pregunta no parece que tenga acceso, ya que si lo hiciera, conocería las claves disponibles. Pero lo haces de una manera similar a la anterior con mode_world_readable. es realmente una muy mala forma de hacer las cosas, y si desea compartir datos, debe seguir la sugerencia de commonsware – jkhouw1

+0

; la aplicación necesita tener el modo WORLD_READABLE. ¿Quizás eso es lo que quiso decir y lo tipeó incorrectamente? WOLRD_WRITABLE significa que cualquiera puede escribir en él. – jkhouw1

+0

Lo probé pero no puedo leer el valor de la otra aplicación –

4

Se puede trabajar si queremos leer el valor de otros perference/PKG/proceso de aplicación. pero hay algo mal en la respuesta de jkhouw1:

Context myContext = createPackageContext("com.example", 
      Context.MODE_WORLD_WRITEABLE); 

que debe ser:

Context myContext = createPackageContext("com.example", 
      Context.CONTEXT_IGNORE_SECURITY); 

embargo, CONTEXT_IGNORE_SECURITY y MODE_WORLD_WRITEABLE con el mismo valor de "INT 2" En todas, gracias por esta pregunta y respuestas.

42

¡Bien! 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 el uso de este código en aplicación 2 para obtener datos de preferencias compartidas en Aplicación 1. Podemos conseguirlo porque usamos MODE_WORLD_READABLE de 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 la siguiente dirección: http://androiddhamu.blogspot.in/2012/03/share-data-across-application-in.html

+4

lo siento, parece que accidentalmente hice clic en "votar hacia abajo" en su respuesta, y ahora no puedo deshacer esto, a menos que edite su respuesta. Si pudiera, edítelo al menos mínimamente, para poder votar en su lugar ... De nuevo, disculpe mi error, un clic accidental involuntario. – gregko

+9

este es un buen código: en mi caso, al principio no utilicé la entrada del nombre del paquete de la primera aplicación. pero ahora funciona En lugar de "Context.MODE_WORLD_READABLE" en App1, lo intenté con "Context.MODE_PRIVATE" en combinación con "android: sharedUserId" y "android: sharedUserLabel" en ambas aplicaciones AndroidManifest.xml. La razón por la que utilicé esta combinación fue que solo quiero privilegios de acceso solo para mis propias aplicaciones desarrolladas. Con "MODE_WORLD_READABLE" también habría un acceso para otras aplicaciones, que no quiero. Tal vez esta información también sea útil para algunos. – KingAlex1985

+2

Esta es una gran respuesta, y la adición de @ KingAlex1985 permite que mi aplicación paga lea las preferencias compartidas de su hermano libre, sin exponerlas al mundo. Funciona con 'PreferenceManager.getDefaultSharedPreferences (con)' también. Agregué 'android: sharedUserId' y 'android: sharedUserLabel' a ambas aplicaciones. –

10

Además hay que añadir misma androide: sharedUserId en el archivo de manifiesto tanto de aplicación.

8

Desafortunadamente los documentos ahora ni siquiera se explican MODE_WORLD_READABLE y MODE_WORLD_WRITEABLE, en lugar diciendo:

Esta constante se deprecia en el nivel de la API 17. Creación de archivos legibles mundo es muy peligroso y puede causar agujeros de seguridad en aplicaciones. Es fuertemente desaconsejado; en su lugar, .... etc

Desde la depreciación, la implementación del 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.

-1

Es sencillo 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: Tienda Básica Application1

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 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(); 
     } 
Cuestiones relacionadas