2011-05-17 61 views
27

的检索共享偏好我有一个应用程序的设置,从我所检索的其他应用程序的喜好,但我没有在其中的密钥的细节,我怎么能取回所有可用键和值该偏好?安卓:其他应用

感谢, Swathi

回答

19

假设偏好是WORLD_READABLE,这可能工作:

final ArrayList<HashMap<String,String>> LIST = new ArrayList<HashMap<String,String>>(); 
Context myContext = createPackageContext("com.example", 
Context.MODE_WORLD_WRITEABLE); // where com.example is the owning app containing the preferences 
    SharedPreferences testPrefs = myContext.getSharedPreferences 
("test_prefs", Context.MODE_WORLD_READABLE); 


Map<String, ?> items = testPrefs .getAll(); 
for(String s : items.keySet()){ 
    //do somthing like String value= items.get(s).toString()); 
    } 
+2

你做到这一点在其他应用程序(拥有优先的应用程序)。从你的问题来看,你似乎没有权限访问,因为如果你这样做了,你会知道可用的密钥。但是你可以用类似于mode_world_readable的方式来完成它。它确实是一种非常糟糕的做事方式,如果你想共享数据,你应该遵循普通软件的建议 – jkhouw1 2011-05-17 13:12:59

+0

应用程序需要有模式WORLD_READABLE - 也许这就是你的意思和误输入它? WOLRD_WRITABLE意味着任何人都可以写信给它。 – jkhouw1 2011-05-18 09:27:10

+0

我试过了,但我无法读取其他应用程序的值 – 2013-03-09 20:26:53

4

它可以工作,如果我们想要阅读其他应用程序/包装/工艺亲景值。 但也有一些是错误的jkhouw1的回答是:

Context myContext = createPackageContext("com.example", 
      Context.MODE_WORLD_WRITEABLE); 

它应该是:

Context myContext = createPackageContext("com.example", 
      Context.CONTEXT_IGNORE_SECURITY); 

虽然CONTEXT_IGNORE_SECURITY和MODE_WORLD_WRITEABLE具有相同的值 “INT 2” 可言,感谢这个问题和答案。

42

好吧!在应用程序1中使用此代码(包名称为“com.sharedpref1”)以使用共享首选项存储数据。

SharedPreferences prefs = getSharedPreferences("demopref", 
        Context.MODE_WORLD_READABLE); 
      SharedPreferences.Editor editor = prefs.edit(); 
      editor.putString("demostring", strShareValue); 
      editor.commit(); 

并使用应用2中得到应用中1.共享偏好数据的代码,我们可以得到它,因为我们在应用1使用MODE_WORLD_READABLE:

try { 
       con = createPackageContext("com.sharedpref1", 0); 
       SharedPreferences pref = con.getSharedPreferences(
         "demopref", Context.MODE_PRIVATE); 
       String data = pref.getString("demostring", "No Value"); 
       displaySharedValue.setText(data); 

      } catch (NameNotFoundException e) { 
       Log.e("Not data shared", e.toString()); 
      } 

更多信息,请访问以下网址: http://androiddhamu.blogspot.in/2012/03/share-data-across-application-in.html

+4

对不起,看起来像意外地我点击了你的答案中的“反对票”,现在不能撤销这个,除非你编辑你的答复。如果可以的话,请至少编辑一下,以便我可以对它进行反对投票。再次,对于我的错误,随机意外点击感到抱歉。 – gregko 2013-06-13 13:37:32

+9

这是一个很好的代码: 在我的情况下,起初我没有使用从第一个应用程序包名称的条目。但现在它工作。在App1中,我没有使用“Context.MODE_WORLD_READABLE”,而是在两个AndroidManifest.xml应用程序中与“android:sharedUserId”和“android:sharedUserLabel”结合使用了“Context.MODE_PRIVATE”。我使用这种组合的原因是,我只想要我自己开发的应用程序的访问权限。通过“MODE_WORLD_READABLE”,还可以访问其他应用程序,这是我不需要的。也许这个信息对一些人也是有用的。 – KingAlex1985 2014-06-17 09:57:36

+2

这是一个很好的答案,并且@ KingAlex1985除此之外还允许我的付费应用程序读取它的免费兄弟的共享首选项,而不会将它们暴露给全世界。同样适用于'PreferenceManager.getDefaultSharedPreferences(con)'。我向两个应用程序添加了“android:sharedUserId”和“android:sharedUserLabel”。 – 2015-02-01 00:37:55

10

此外,你必须在两个应用程序的清单文件中添加相同的android:sharedUserId

8

不幸的是,现在的文档甚至不解释MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE,而不是说:

这个常量是在API水平贬值17 创建世界可读的文件是很危险的,容易造成安全漏洞应用。强烈不鼓励;相反,....等

由于折旧,实现与sharedpreferences应用程序之间的文件共享可能是太冒险了,虽然它很简单。我不是太关心从游戏应用程序,我只是希望能够从一个应用转移字符到另一个MODE_WORLD_READABLE模式的安全漏洞。这太糟糕了,他们贬低了这两种共享模式。

-1

很简单检索店共享偏好一个应用程序的数据到另一个应用程序。

第1步:添加同一android:sharedUserId="android.uid.shared"在这两个应用程序的清单文件。

第2步:储值应用1

SharedPreferences preferences = context.getSharedPreferences("token_id", Context.MODE_WORLD_READABLE); 
     Editor editor = preferences.edit(); 
     editor.putString("shared_token", encryptedValue); 
     Log.e("aaa *** shared_token : ", encryptedValue.toString()); 
     editor.commit(); 

第3步:获得值从应用2

Context con = null; 
     try { 
      con = createPackageContext("application2 package name", Context.CONTEXT_IGNORE_SECURITY); 
     } catch (PackageManager.NameNotFoundException e) { 
      e.printStackTrace(); 
     } 

     try { 
      if (con != null) { 
       SharedPreferences pref = con.getSharedPreferences(
         "token_id", Context.MODE_WORLD_READABLE); 

       String data = pref.getString("shared_token", ""); 
       Log.d("msg", "Other App Data: " + data); 
      } else { 
       Log.d("msg", "Other App Data: Context null"); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     }