2013-08-19 65 views
6

在Android 4.3上測試。我有兩個應用程序,com.my.app.firstcom.my.app.second。在我的活動中,我想閱讀其他應用程序的偏好設置。我選擇使用兩個我的應用程序相同的用戶ID:如何閱讀其他應用程序的SharedPreferences(相同的用戶ID)?

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

? – JimBoyHac

+0

沒有。由於使用了相同的'sharedUserId',所以不需要它。 – l33t

回答

2

發現問題!這肯定看起來像是getSharedPreferences API中的一個錯誤。原來,之前的致電getSharedPreferences致使其他context.getSharedPreferences()調用返回先前的實例 - 當前應用的首選項。

解決的辦法是確保getSharedPreferences()不是在讀取其他應用程序的偏好之前調用。

+0

對!聽起來合乎邏輯.. –

1

你可能想在一個應用程序中創建MODE_WORLD_READABLE的SharedPreference和使用共同sharedUserId兩個應用程序A和鏈路提到的應用程序B.一樣,

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

+0

非常感謝,但'MODE_WORLD_READABLE'不能使所有*應用程序可讀的首選項?我認爲'sharedUserId'的目的是允許讀取私人數據。 – l33t

+0

這是文檔中關於'MODE_PRIVATE'的說明:*文件創建模式:默認模式,創建的文件只能被調用應用程序訪問(或者所有應用程序共享相同的用戶ID)*這就是爲什麼我發佈我的題。 – 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

由於兩個您的應用程序正在運行,你也可以通過設置共享偏好解決這個問題:你所設定的模式爲MODE_WORLD_READABLE在您創建的SharedPrefs應用

tempContext.getSharedPreferences("sharedInformation", Context.MODE_MULTI_PROCESS); 
相關問題