2012-09-19 29 views
9

He estado desarrollando una aplicación de Android que interactúa con otras aplicaciones instaladas en el dispositivo a través de un archivo de preferencias compartidas.Preferencias compartidas de Android en diferentes aplicaciones

Este archivo se creó como MODE.WORLD_READABLE y cada aplicación instalada tiene su propio archivo con un nombre y una propiedad definidos comunes (lo que cambia es el valor de esa propiedad específica).

Por ejemplo, AppA y AppB deben tener cada uno un archivo compartido denominado "app_shared_file.xml" con una propiedad "property_shared_file".

Desde mi aplicación, quiero acceder primero a este archivo y leer el valor de la propiedad, y dependiendo de ese resultado quiero crear/actualizar el mío.

Sin embargo, tengo algunos problemas para lograrlo. En la documentación de Android veo que:

recuperar y almacenar el contenido de las preferencias de archivo 'nombre', volver a SharedPreferences a través del cual se puede recuperar y modificar sus valores. Solo se devuelve una instancia del objeto SharedPreferences a quienes llamen para el mismo nombre, lo que significa que verán las ediciones de los demás tan pronto como se realicen.

Después de leer el otro archivo de preferencias compartidas de la aplicación, cuando intento crear/actualizar el sistema, en lugar de editar el mío, utilizo el que he leído previamente. Si, por el contrario, empiezo por actualizar el mío y leo la otra aplicación más tarde, en lugar de leer la otra, la que se accede es mía.

¿Alguna idea?

El código que estoy usando para leer el pref es compartida [donde packageName es la otra aplicación pckg]:

Context con = context.createPackageContext(packageName, Context.CONTEXT_IGNORE_SECURITY); 
SharedPreferences pref = con.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_WORLD_READABLE); 
pref.getBoolean(SHARED_PREF_PROP, false); 

El código que estoy usando para escribir en la aplicación compartida pref es:

SharedPreferences prefs= getSharedPreferences(SHARED_PREF_NAME, context.MODE_WORLD_READABLE); 
SharedPreferences.Editor editor = prefs.edit(); 
editor.putBoolean(SHARED_PREF_PROP, value); 
editor.commit(); 

Gracias de antemano.

Respuesta

3

SharedPreferences are stored local to the package name of your application. Por lo que parece, tiene dos aplicaciones completamente separadas con diferentes nombres de paquetes. Esto significa que en lugar de leer desde uno, está creando dos archivos del mismo nombre que están almacenados en diferentes carpetas. Para que las diferentes actividades puedan leer desde los mismos archivos SharedPreferences, debe tenerlos con el mismo nombre de paquete definido en el archivo AndroidManifest.

La otra opción, ya que conoce el nombre del paquete de las otras aplicaciones (supongo), es elegir la aplicación principal que lo creará y manejará. Luego, lea directamente desde el archivo usando el URI directo. Como está configurando los permisos en MODE_WORLD_READABLE, el sistema debería permitirle hacer esto. Aunque puede bloquear el acceso a la carpeta. Yo personalmente nunca lo intenté.

I believe I have found the answer you are looking for.

+0

Sí, hay dos aplicaciones diferentes y cada aplicación tiene su propio archivo de preferencias compartidas almacenado en su propia carpeta shared_prefs. Sí, conozco el nombre del paquete de la otra aplicación a través de PackageManager, pero no tengo la opción de saber qué actividad/clase lo manejará. Ya había visto ese enlace, el problema aquí es acceder a dos preferencias compartidas diferentes con el mismo nombre, la mía y la otra aplicación. Después de abrir uno, cuando intento abrir el otro, los puntos de referencia se abren inicialmente y no el que se envía como contexto. – user1683087

0

puede leer las preferencias de otra aplicación con este fragmento.

String PACKAGE_NAME = "com.gr.iasi"; 
String PREFERENCE_NAME = "GlobalPrefsJorge"; 


try { 
     myContext = createPackageContext(PACKAGE_NAME,Context.MODE_WORLD_WRITEABLE);    
      SharedPreferences testPrefs = myContext.getSharedPreferences(PREFERENCE_NAME, Context.MODE_WORLD_READABLE); 

     Map<String, ?> items = testPrefs .getAll(); 
     for(String s : items.keySet()){ 
      //Print keys and values; 
      Log.i("***" +s.toString(), items.get(s).toString()); 
      } 

     } catch (NameNotFoundException e) {  
      e.printStackTrace(); 
     } 
Cuestiones relacionadas