2013-08-19 3 views
6

Протестировано на Android 4.3. У меня есть два приложения: com.my.app.first и com.my.app.second. В своей деятельности я хочу читать настройки из другого приложения. Я решил использовать тот же идентификатор пользователя для обоих моих приложений:Как читать SharedPreferences другого приложения (тот же идентификатор пользователя)?

android:sharedUserId="com.my.app"

Я всегда загружать свои предпочтения, как это:

prefs = getSharedPreferences("MyAppPreferences", Context.MODE_PRIVATE); 

Теперь в моем втором приложении я делаю следующее:

try { 
    Context context = createPackageContext("com.my.app.first", Context.CONTEXT_IGNORE_SECURITY); 
    // context.getPackageName() does indeed return "com.my.app.first" 

    // Note: Context.MODE_WORLD_READABLE makes no difference here! 
    prefs = context.getSharedPreferences("MyAppPreferences", Context.MODE_PRIVATE); 
} 

prefs.mFile ошибочно указывает на /data/data/com.my.app.second/shared_prefs/MyAppPreferences.xml.

Очевидно, что вызов getSharedPreferences возвращает предпочтений для текущего приложения, хотя я использовал контекст другого приложения. Что я делаю не так? Пожалуйста помоги!

+0

в приложении, которое вы создаете SharedPrefs вы установите режим как MODE_WORLD_READABLE? – JimBoyHac

+0

Нет. И это не нужно, так как используется тот же 'sharedUserId'. – l33t

ответ

2

Нашли проблему! Это похоже на ошибку в API getSharedPreferences. Оказалось, что предыдущий вызов getSharedPreferences вызвал другой вызов context.getSharedPreferences(), чтобы вернуть предыдущий экземпляр - предпочтения текущего приложения.

Решение должно было удостовериться, что getSharedPreferences() был НЕ вызывал перед чтением предпочтений другого приложения.

+0

правый! звучит логично .. –

1

Вы можете сделать SharedPreference созданный в App A MODE_WORLD_READABLE и использовать общий sharedUserId как для App A и B. App как упоминалось в ссылке,

http://androiddhamu.blogspot.in/2012/03/share-data-across-application-in.html

+0

Спасибо, но не 'MODE_WORLD_READABLE' делает предпочтения читабельными * всеми * приложениями? Я думал, что целью 'sharedUserId' было разрешить чтение частных данных. – l33t

+0

Это то, что документация говорит о 'MODE_PRIVATE': * Режим создания файла: режим по умолчанию, где доступ к созданному файлу может быть доступен только вызывающему приложению (или всем приложениям, использующим один и тот же идентификатор пользователя). Вот почему я опубликовал свой вопрос. – l33t

+0

Право MODE_WORLD_READABLE делает его доступным для чтения всем приложениям по своей природе и моим плохим данным об sharedUserId, вместо этого я имел в виду использование уникального имени при вызове как context.getSharedPreference («unique», MODE). http://developer.android.com/reference/android/content/Context.html#getSharedPreferences(java.lang.String, int) –

2

Решено, просто прочитав старый контекст снова. Звучит как кэш для меня тоже.

Context tempContext = context.createPackageContext(originalContext.getPackageName(),Context.CONTEXT_IGNORE_SECURITY); 
SharedPreferences sharedInformationM2 = tempContext.getSharedPreferences("sharedInformation", Context.MODE_WORLD_READABLE); 
+0

Не работает, так же проблема с этим подходом. – Bonton255

0

Так как ваши приложения работает вы также можете решить эту проблему, установив общие предпочтения:

tempContext.getSharedPreferences("sharedInformation", Context.MODE_MULTI_PROCESS);