5

我想在 PC 或 Android 手机上运行的草图中保存用户偏好,尽可能使用与标准“Java 方式”相同的代码。

对我而言,理想的候选人似乎是 java.util.prefs.Preferences 类。所以,我写了一个小测试脚本,看看它是否正在处理中:

String prId = "counter";
Preferences prefs = Preferences.userNodeForPackage(this.getClass());
int counter = prefs.getInt(prId, 0);

println(counter);
prefs.putInt(prId, 1+counter);

该程序每次执行时都会输出一个递增的数字 - 在 PC 上。在 Android 上,始终显示默认值 (0)。是否需要任何其他步骤才能使其在 Android 上运行?要请求的权限?是否有任何替代方法可以在两个平台上保存名称 - 值对?

观察:“WRITE_EXTERNAL_STORAGE”权限已启用

4

2 回答 2

2

不幸的是,这是一个已知的 Android 错误:https ://code.google.com/p/android/issues/detail?id=22232

基本上,该应用程序没有生成路径的写入权限,该路径应该是用户具有写入权限的系统特定位置。

最简单的(跨平台)解决方法可能是使用 java.util.Properties,您可以在其中控制存储位置。

另一种解决方法(如果您因某种原因与 Preferences API 相关联)可能是提供您自己的 AbstractPreferences 实现(可能由 Android SharedPreferences 支持?),请参阅此 SO 帖子:Is there a way to use java.util.Preferences under没有它的 Windows 使用注册表作为后端?

PS:另一种解决方法可能是使用Preferences.exportSubtree(OutputStream os)和 显式导出/导入数据Preferences.importPreferences(InputStream is)

于 2017-01-15T12:44:11.190 回答
0

在 Android 中,存储首选项的首选方式是使用SharedPreferences. 等效代码如下:

String prId = "counter";
SharedPreferences prefs = getPreferences(MODE_PRIVATE);
int counter = prefs.getInt(prId,0);    // Get int, default is 0

SharedPreferences.Editor prefsEditor = prefs.edit();
prefsEditor.putInt(prId, counter++);    // Put counter back
prefsEditor.commit();    //Don't forget to commit the changes

我不知道为什么java.util.prefs.Preferences会在 Android 中失败。Activity我怀疑原因是当前或应用程序被破坏后数据将被删除。

由于每个平台的目录结构不同,仅使用一种相同的方法很难获得偏好。例如,数据存储在/.java/.userPrefs/**yourpacakgename**/prefs.xmlAndroid 上,而它在 Windows 上的注册表和~/Library/Preferences/**yourpacakgename**/prefs.xmlMac OS X 上。此外,您不能Preferences.userRoot()在 Android 中使用,因为应用程序无法root访问。

于 2013-03-07T19:43:51.493 回答