2012-09-19 153 views
9

我一直在開發一個Android應用程序,它通過sharedpreference文件與安裝在設備上的其他應用程序進行交互。不同應用程序之間的Android共享首選項

該文件創建爲MODE.WORLD_READABLE,每個已安裝的應用程序都有自己的文件,並具有通用的已定義名稱和屬性(該特定屬性的值有哪些更改)。

例如,AppA和AppB應該爲每個應用程序分配一個名爲「app_shared_file.xml」的共享文件,其中包含屬性「property_shared_file」。

從我的應用程序我想先訪問此文件並閱讀該屬性值,並根據我想要創建/更新我的結果。

不過,我在實現這個過程中遇到了一些問題。在Android文檔我看到:

檢索並按住喜好文件的內容「姓名」, 返回SharedPreferences,通過它可以檢索和 修改其值。 SharedPreferences對象 只有一個實例返回給同名的任何呼叫者,這意味着他們將在製作後立即看到 彼此的編輯。

閱讀其他應用程序共享偏好文件後,當我嘗試創建/更新我的系統而不是編輯我的系統時,使用了我之前閱讀的那個。如果恰恰相反,我開始通過更新我的內容並在稍後閱讀另一個應用程序 - 而不是閱讀另一個,被訪問的是我的。

有什麼想法?

我使用用於讀取共享PREF的代碼是[其中的packageName是其他應用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); 

我使用在應用程序共享PREF編寫的代碼是:

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

在此先感謝。

回答

3

SharedPreferences are stored local to the package name of your application.從聽起來像是,你有兩個完全獨立的應用程序與不同的軟件包名稱。這意味着您不是從一個文件夾讀取數據,而是創建兩個存儲在不同文件夾中的同名文件。爲了從同一個SharedPreferences文件中讀取不同的活動,必須使用與AndroidManifest文件中定義的包名相同的包名。

另一種選擇,因爲你知道其他應用程序的包名(我假設),是選擇將創建並處理它的主應用程序。然後使用直接URI從文件本身直接讀取。由於您將權限設置爲MODE_WORLD_READABLE,因此係統應允許您執行此操作。雖然,它可能會阻止您訪問文件夾本身。我個人從未嘗試過。

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

+0

是的,有兩種不同的應用程序,每個應用程序都有自己的shared_prefs文件夾中存儲的共享首選項文件。 是的,我通過PackageManager知道其他應用程序的包名,但我無法知道哪個活動/類將處理它。 我已經看到了這個鏈接,這裏的問題是訪問兩個不同的共享前綴具有相同的名稱 - 我自己的和其他應用程序。打開一個後,當我嘗試打開另一個參考點時,最初打開的參考點不是作爲上下文發送的參考點。 – user1683087

0

,你可以在這個片段中讀取其他應用程序的首選項。

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(); 
     } 
相關問題