Android:查看SharedPreferences文件?

20

为了调试目的,我需要访问应用程序的共享首选项文件。据我所知,我应该在 /data/... 中找到这个文件,但由于权限不足,我无法访问 /data 文件夹。这正常吗?除了从应用程序内部读取之外,还有什么办法可以访问该文件吗?我的手机没有被Root,我也不想Root它。 感谢任何提示!


我的回答可能会有所帮助https://dev59.com/LGAg5IYBdhLWcg3wZ6TY#40464820 - Maksim Turaev
3个回答

18
我曾经遇到过这个问题(没有root权限访问应用程序数据文件夹)。如果您没有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());
    }
}

来源 One Two Three


很不幸,我的应用涉及 WLAN,而模拟器上没有 WLAN,是吗? - stefan.at.kotlin
我不相信模拟器上有 WLAN 可用,我会再看一下。 - snctln
snctln,我有同样的想法,不用做任何工作,我会尝试它,不需要示例;-) - stefan.at.kotlin
我有一个问题,在Map<String,?> getAll()中,"?"代表什么意思?我对Java的知识有所欠缺。 - stefan.at.kotlin
啊,我在看到你的回复之前就已经把例子搞定了 :) 我也不知道"?"是什么意思,所以我去读了http://www.angelikalanger.com/GenericsFAQ/FAQSections/ParameterizedTypes.html,发现"?"是一个通配符,可以表示任何类型。因此,我没有试图把它保存为变量,而是在Map Entry上使用了"getValue().toString()"。 - snctln
snctln,感谢您的热心帮助 :-) 您比我更快,所以对于我仍然很有用 :-) - stefan.at.kotlin

1

在未root的手机上,很遗憾无法很好地访问/data文件夹。您可以尝试使用MODE_WORLD_READABLE创建文件:

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

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

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

但你的情况可能会有所不同。


嗯,我该如何创建文件呢?我使用XML来指定我的偏好设置,而Android负责存储它...不过我只需要通过代码从中检索值。感谢您的提示和回复 :-) - stefan.at.kotlin
该文件是由首选项框架自动创建的:如果您需要在代码中访问数据,您应该能够像http://developer.android.com/guide/topics/data/data-storage.html#pref中描述的那样使用首选项框架。 - Femi
谢谢Femi,它确实起作用了,但不知何故我正在使用错误的密钥或Android存储的内容与预期不同...这就是为什么我想查看所有值/文件本身的原因。 编辑:好吧,有getAll()方法,我会看看它。 - stefan.at.kotlin
共享首选项如果您没有写入任何值,将不会返回任何值。上传一个代码示例? - Femi
好的,Android 写它们,我读取并使用它们。我在 XML 中指定了一个 PreferenceScreen,就像这里 http://developer.android.com/reference/android/preference/PreferenceScreen.html 一样。然后 Android 将用户的选择/输入保存在共享首选项中,我读取并使用它们,但我不编写代码来保存它们。 - stefan.at.kotlin
显示剩余6条评论

0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接