【问题标题】:Android: Viewing SharedPreferences file?Android:查看 SharedPreferences 文件?
【发布时间】:2011-08-22 12:37:20
【问题描述】:

出于调试目的,我需要访问我的应用程序的共享首选项文件。据我所知,我应该在 /data/... 中找到这个文件,但我无法通过缺少权限访问 /data 文件夹。这是正常的吗?任何方式仍然可以访问该文件? (除了可能从应用程序内部对其进行操作?)手机没有植根,我也不想植根它。 感谢您的任何提示!

【问题讨论】:

标签: android preferences android-preferences


【解决方案1】:

不幸的是,在无根手机上没有访问 /data 文件夹的好方法。您可以尝试使用MODE_WORLD_READABLE 创建文件,如下所示:

SharedPreferences myPrefs = this.getSharedPreferences("prefs", MODE_WORLD_READABLE);

然后尝试使用adb pull 将文件提取到桌面。

adb pull /data/data/<packagename>/shared_prefs/prefs.xml

但您的里程可能会有所不同。

【讨论】:

  • hmm 我如何实际创建文件?我使用 xml 来指定我的偏好,而 android 处理它的存储......我只需要通过代码从中检索值。感谢您的任何提示和回复:-)
  • 该文件由 Preferences 框架自动创建:如果您需要访问代码中的数据,您应该能够使用 developer.android.com/guide/topics/data/data-storage.html#pref 中描述的首选项框架
  • 感谢 femi,这行得通,但不知何故我使用了错误的密钥或 android 存储了与预期不同的东西......这就是为什么我想查看所有值/文件本身):编辑:好吧,有 getAll() 方法,将看看它。
  • 啊,奇怪。 get 中的错误值在您设置并使用 commit()get 返回的值与您设置的不同 后什么也不返回?
  • 其实我没有手动设置,安卓系统会。我只是在阅读共享的偏好并获得了价值,但这不是他们应该的。我想我正在混合两个键,如果我可以查看所有保存的键值对,那么我可以选择正确的。
【解决方案2】:

我过去曾遇到过这个问题(在文件系统上没有 root 权限,但需要访问应用程序数据文件夹)。如果您没有根设备或 ADP1 等开发人员设备,那么您可以尝试在模拟器上运行您的应用程序,然后从 eclipse 或 DDMS 中的“文件资源管理器”访问文件。

编辑#1: 尝试使用 sharedPreferences 的getAll 函数并将其保存到文件中,我将看看是否可以将示例放在一起。

编辑#2: 示例代码,从网络上的随机样本创建,可能不是最好的方法,但我测试了它并且它确实有效。它将文件写入 sdcard 的根目录。确保你有

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

在您的清单中设置

private void saveSharedPreferences()
{
    // create some junk data to populate the shared preferences
    SharedPreferences prefs = getSharedPreferences("MyPrefs", MODE_PRIVATE);
    SharedPreferences.Editor prefEdit = prefs.edit();
    prefEdit.putBoolean("SomeBooleanValue_True", true);
    prefEdit.putInt("SomeIntValue_100", 100);
    prefEdit.putFloat("SomeFloatValue_1.11", 1.11f);
    prefEdit.putString("SomeStringValue_Unicorns", "Unicorns");
    prefEdit.commit();

    // BEGIN EXAMPLE
    File myPath = new File(Environment.getExternalStorageDirectory().toString());
    File myFile = new File(myPath, "MySharedPreferences");

    try
    {
        FileWriter fw = new FileWriter(myFile);
        PrintWriter pw = new PrintWriter(fw);

        Map<String,?> prefsMap = prefs.getAll();

        for(Map.Entry<String,?> entry : prefsMap.entrySet())
        {
            pw.println(entry.getKey() + ": " + entry.getValue().toString());            
        }

        pw.close();
        fw.close();
    }
    catch (Exception e)
    {
        // what a terrible failure...
        Log.wtf(getClass().getName(), e.toString());
    }
}

来源OneTwoThree

【讨论】:

  • 很遗憾我的应用程序涉及到 wlan 并且 wlan 在模拟器上不可用,不是吗?
  • 不相信模拟器上有wlan,我再看看
  • snctln,我有同样的想法,不要做任何工作,我会试试,不需要样品;-)
  • 好的,我有一个问题,在 Map getAll () 中,“?”是什么意思?意思是?缺少这方面的一些 Java 知识):
  • 啊,在我看到你的回复之前就把这个例子拿出来了 :) 我不得不查找“?”同样,我最终阅读了angelikalanger.com/GenericsFAQ/FAQSections/… 并看到了“?”是一个通配符,可以表示任何类型。因此,我没有尝试花哨并将其保存为变量,而是在地图条目上使用了“getValue().toString()”
【解决方案3】:

您可以使用 stetho 轻松访问和修改 SharedPreferences 数据。跟着 下面提供的链接可将其添加到您的 android 项目并查看数据。

http://facebook.github.io/stetho/

【讨论】:

    猜你喜欢
    • 2016-04-27
    • 1970-01-01
    • 2018-05-29
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多