【问题标题】:Get all SharedPreferences names and all their keys?获取所有 SharedPreferences 名称及​​其所有密钥?
【发布时间】:2011-10-04 02:47:28
【问题描述】:

我正在制作备份程序,将手机SharedPreferences 的数据保存到我自己结构的文件中。但我不知道如何将它们全部列出,我需要:

例如,2 个程序使用名称 "Program A" 和 "Program B" 保存了他们的 SharedPreferences。我需要获取包含这两个名称的字符串数组。然后,我将getSharedPreferences 与“程序A”一起使用,我需要获取程序保存的所有密钥。

真的可以吗?

EDIT1:我不知道手机上有哪些程序/活动。我想获得每个程序保存的所有keys。就像您备份所有手机数据一样,但仅备份 SharedPreferences 值。

例如:您的手机有 10 个程序,每个程序都会创建一个名为 Program 1 到 Program 10 的 SharedPreferences(当然,他们想要的任何名称)。我想获得所有这些Program 1 到Program 10 字符串。那么,如果Program 1 有5 个key 分别叫Key 1 到Key 5,我想获取这些key 的名字。

EDIT2:根据NikolaMKD 指南,这是我到目前为止所做的,但列表返回所有程序,在所有行都带有“无首选项”,即使在第一行,我也将 SharedPreferences 与我的活动一起保存:

public class Test extends ListActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SharedPreferences preferences = getSharedPreferences("Test", 1);
        // No matter what name is: Test or the package name
        Editor editor = preferences.edit();
        editor.putInt("TestKey", 0);
        editor.commit();

        List<ResolveInfo> Temp = 
            getPackageManager().queryIntentActivities(
                    new Intent(Intent.ACTION_MAIN, null)
                    .addCategory(Intent.CATEGORY_LAUNCHER), 0);
        String[] App = new String[Temp.size()];
        for (int i = 0; i < Temp.size(); i++) {
            App[i] = Temp.get(i).activityInfo.name;
            FileReader reader = null;
            try {
                reader = new FileReader("/data/data/"
                        + App[i] + "/shared_prefs/" + App[i] + "_preferences.xml");
            } catch (FileNotFoundException e) {
                reader = null;
            }
            if (reader != null)
                App[i] += " (Have Prefereces)";
            else
                App[i] += " (No Prefereces)";
        }
        setListAdapter(new ArrayAdapter<String>(this, R.layout.main, App));
    }



}

【问题讨论】:

  • 您的应用听起来需要 root 权限才能运行。
  • @Tom Dignan:我已经扎根了!
  • @Tom Dignan:呃,你的意思是?手机root,还是软件的root权限?我能用其他方法解决这个问题吗?
  • 首选项通常对应用程序是私有的,因此除非设备已获得 root 权限,否则您将无法读取任意应用程序的首选项存储。
  • 那不烂..这叫安全....

标签: android backup sharedpreferences


【解决方案1】:

这是一个很好的问题,我认为没有直接的方法可以做到这一点。最好的方法是将这些名称存储在 DefaultSharedPreferences 或某种全局数组中,或者如果您知道偏好资源 ID,您可以从 Activity 本身检索 sharedPreferences:

String packageName = String packageName = context.getPackageName(); 
Resources resources = context.getResources(); 
String sharedPrefName = resources.getResourceEntryName(R.id.PREFERENCES_RESOURCE_ID); 
sharedPrefName = packageName+"_"+sharedPrefName;

【讨论】:

  • 不,我是指手机上的所有程序,这意味着,我不知道哪些程序/活动保存了它们。我已编辑我的帖子以获取更多信息。
【解决方案2】:

从

获取所有的_preferences.xml

/data/data/(package)/shared_prefs/(package)_preferences.xml

解析 XML,在 XML 中有每个键的名称。我可能误解了你的问题

【讨论】:

  • 数据文件夹在哪里?我该如何阅读?我需要任何许可吗?我什至在IO File Manager 或我的电脑上都看不到这个文件夹。
  • 它在您的 IDE 的 DDMS 透视图中,然后在文件资源管理器中您可以找到电话目录。您可以使用 AssetManager 对其进行迭代。权限基于您的目录,-d--xwr--- 类似这样,但大多数目录都允许读取,因为这是您需要的。
  • 包裹怎么样?我不知道设备上有哪些程序,我想把它们都列出来吗?顺便说一句,从 DDMS 读取的数据文件夹是一个空文件夹。
  • 可能程序没有保存任何首选项。 context.getPackageManager().queryIntentActivities(Intent, 0);这就是您列出所有已安装应用程序的方式。然后使用名称列表进行迭代。剩下的就是逻辑..
  • 嗨,我已经编辑了我的问题。请给我一些建议。谢谢。
【解决方案3】:

不要以为可能,你无法读取其他应用程序的 /data/data/ 文件夹。在模拟器上你可以阅读它们,因为你有 root 访问权限。

【讨论】:

  • 如果我的应用有 root 权限,我可以这样做吗?
  • 是的,应该。 root 可以访问 /data/data 文件夹和子文件夹。共享首选项文件的完整路径是 /data/data/[package name]/shared_prefs/[file name].xml
  • reader = new FileReader("/data/data/" + App[i] + "/shared_prefs/" + App[i] + "_preferences.xml"); 不起作用,因为 xml 文件可以命名为包名称以外的名称。您必须解析 /shared_prefs 文件夹下的所有文件。
  • 感谢您提供的有用信息!我已经完成了程序。
【解决方案4】:

使用返回Map的sharedPreference.getAll();。

【讨论】:

    【解决方案5】:

    试试这个:

        Map<String, ?> allPrefs = prefs.getAll(); //your sharedPreference
        Set<String> set = allPrefs.keySet();
        for(String s : set){
            LOG.d(TAG, s + "<" + allPrefs.get(s).getClass().getSimpleName() +"> =  "
                    + allPrefs.get(s).toString());
        }
    

    【讨论】:

      【解决方案6】:

      您可以遍历共享首选项目录中的所有 xml 文件,并获取所有文件的名称,这些文件是您应用中的共享首选项名称。

      File src = new File("/data/data/" + BuildConfig.APPLICATION_ID + "/shared_prefs");
      if (src.isDirectory()) {
          String files[] = src.list();
          for (int i = 0; i < files.length; i++) {
              if (files[i].contains(".xml")) {
                  reloadSharedPreference(context, files[i].replace(".xml", ""));
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2020-05-27
        • 2021-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多