Android: 无法为SharedPreferences文件创建目录

10
我想通过另一个应用程序来编辑一个应用程序的SharedPreferences,我的代码如下:
try {
Context plutoContext = getApplicationContext().createPackageContext("me.test",Context.MODE_WORLD_WRITEABLE);
SharedPreferences plutoPreferences = PreferenceManager.getDefaultSharedPreferences(plutoContext);
Editor plutoPrefEditor = plutoPreferences.edit();
plutoPrefEditor.putString("country", "India");
plutoPrefEditor.commit();
}

我遇到了一个错误

E/SharedPreferencesImpl( 304): 无法为SharedPreferences文件 /data/data/me.test/shared_prefs/me.test_preferences.xml 创建目录

其中me.test是我的另一个项目, 在me.test项目中,我可以轻松编辑和检索SharedPreferences

我正在Nexus S android 4.0.4 (Samsung)上进行测试,有人能帮我吗?


1
你的“me.test”项目是否使用MODE_WORLD_WRITEABLE创建了SharedPreferences? - WarrenFaith
@ WarrenFaith,感谢您的评论。我不知道如何创建MODE_WORLD_WRITEABLE,我只是创建了普通的。 - Sharanabasu Angadi
你能否写出异常的类型? - teoREtik
@teoREtik,感谢您的评论。它没有崩溃,但是当我查看日志时,我得到了与我在问题中提到的结果相同的结果。 - Sharanabasu Angadi
我在Android Studio上使用PreferenceActivity时遇到了相同的问题,并在LG-D855上进行了测试。 当我运行应用并通过“返回”按钮关闭它时,一切正常,但是当我完全关闭它时,所有内容都消失了,并且在Logcat中出现了以下错误: 无法为SharedPreferences文件创建目录 - Alireza
我不知道这是否合乎逻辑,但在清除应用程序数据(在应用程序信息中)之后,一切恢复正常。我认为为了测试目的而反复安装应用程序导致了这个问题,顺便说一下,谢谢。 - Alireza
6个回答

5

您需要在AndroidManifest.xml中添加权限:

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

我和你遇到了相同的问题,但是通过以上方法解决了这个问题。


3
你确定要为访问共享首选项添加权限吗? - Leo DroidCoder

1

在应用中使用不同的包名即可。这将在不同的目录中创建偏好设置。


1
顺便说一下(这与问题无关,但是无论如何),您错误地使用了createPackageContext()方法。您在那里传递了MODE_WORLD_WRITEABLE标志,其值为2,等于CONTEXT_IGNORE_SECURITY标志,因此在逻辑上会被错误地解释,我认为这是不正确的。

我对IMHO不是很了解。我的基本操作是从一个应用程序编辑另一个应用程序的共享首选项。 - Sharanabasu Angadi
所以,正如@WarrenFaith所说,您应该在拥有它的应用程序中使用getSharedPreferences(String name,int mode)创建SharedPreferences,并使用MODE_WORLD_WRITEABLE模式。 - teoREtik
MODE_WORLD_WRITEABLE现在已被弃用 - Leo DroidCoder

1
问题 - 当您已经在项目中创建了默认共享首选项时,将出现“Android:无法为SharedPreferences文件创建目录”的问题。 因此,一个共享首选项已经存在,并且再次使用相同名称的默认首选项添加。 解决方案 - 在应用程序中仅创建一个默认共享首选项。如果您想要创建更多的共享首选项,则请使用某些名称创建共享首选项。
注意 - 一个应用程序中只有一个默认共享首选项。

0
如果您的第一个应用程序想要创建一个可以被另一个应用程序读取的SharedPreference,请确保使用正确的模式创建SharedPreference。请查看getSharedPreferences()PreferenceManager类以获取更多详细信息。

0

在我的情况下,重新启动三星设备解决了相同的问题。


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