2012-09-19 13 views
9

Ho sviluppato un'applicazione Android che interagisce con altre applicazioni installate sul dispositivo tramite un file sharedpreference.Preferenze condivise Android su diverse applicazioni

Questo file è stato creato come MODE.WORLD_READABLE e ogni applicazione installata ha il proprio file con un nome e una proprietà definiti in comune (ciò che cambia è il valore per quella specifica proprietà).

Ad esempio, AppA e AppB devono avere ciascuno un file condiviso denominato "app_shared_file.xml" con una proprietà "file_shared_data".

Dalla mia applicazione voglio prima accedere a questo file e leggere quel valore di proprietà, e in base al risultato che voglio creare/aggiornare il mio.

Tuttavia, sto avendo qualche problema nel raggiungimento di questo. Sulla documentazione di Android vedo che:

recuperare e tenere il contenuto dei file delle preferenze 'nome', tornando a SharedPreferences attraverso il quale è possibile recuperare e modificare i suoi valori. Solo un'istanza dell'oggetto SharedPreferences viene restituita a tutti i chiamanti con lo stesso nome, nel senso che vedranno reciprocamente le modifiche non appena vengono apportate.

Dopo aver letto l'altro file delle preferenze condivise dell'applicazione, quando provo a creare/aggiornare il mio sistema invece di modificare il mio si utilizza quello che ho letto in precedenza. Se, al contrario, inizio aggiornando il mio e leggo l'altra app in un secondo momento - invece di leggere l'altro, quello a cui si accede è mio.

Qualche idea?

Il codice che sto utilizzando per la lettura del pref condivisa è [dove packageName è l'altra applicazione 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); 

Il codice che sto utilizzando per la scrittura in app condiviso pref è:

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

Grazie in anticipo.

risposta

3

SharedPreferences are stored local to the package name of your application. Da quello che sembra, hai due app completamente separate con nomi di pacchetti diversi. Ciò significa che invece di leggere da uno, stai creando due file con lo stesso nome che sono memorizzati in cartelle diverse. Affinché le attività diverse possano leggere dagli stessi file SharedPreferences, è necessario averli con lo stesso nome di pacchetto definito dal file AndroidManifest.

L'altra opzione, poiché si conosce il nome del pacchetto delle altre applicazioni (presumo), è scegliere l'app principale che la creerà e gestirla. Quindi leggi direttamente dal file stesso usando l'URI diretto. Dato che stai impostando le autorizzazioni su MODE_WORLD_READABLE, il sistema dovrebbe consentire di farlo. Sebbene, potrebbe bloccare l'accesso alla cartella stessa. Non ho mai provato personalmente.

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

+0

Sì, ci sono due diverse applicazioni e ogni applicazione ha il proprio file di preferenze condivise memorizzato nella propria cartella shared_prefs. Sì, conosco il nome del pacchetto dell'altra applicazione tramite PackageManager, ma non ho alcuna opzione per sapere quale attività/classe lo gestirà. Avevo già visto quel collegamento, il problema qui è di accedere a due diverse pref condivise con lo stesso nome - la mia e l'altra applicazione. Dopo aver aperto uno, quando provo ad aprire l'altro i punti di riferimento a quello inizialmente aperto e non quello inviato come contesto. – user1683087

0

è possibile leggere le preferenze degli altri app con questo frammento.

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(); 
     } 
Problemi correlati