我的应用程序中有一个导出功能。这只是一个复制操作,因为我的所有设置都存储在共享首选项中。
我只是将xml文件从/data/data/package.name/shared_prefs/settings.xml复制到SD卡。它对我的宏达电的愿望很好。但是,它可能无法在三星设备上运行,我在尝试复制文件时出现以下错误。
i/system.out(3166):/data/data/package.name/shared_prefs/settings.xml(没有这样的文件或目录)
在目录里。
有人知道如何修复它,或者有没有其他简单的方法来存储共享的首选项?
谢谢。
最佳答案
Commonware的建议是一个聪明的方法,但不幸的是它行不通。
三星并不总是将共享的prefs目录放在与getFilesDir()
相同的父目录中。
我建议测试是否存在(硬编码,包名除外):/dbdata/databases/<package_name>/shared_prefs/package.name_preferences.xml
如果它存在,就使用它,否则就返回到commonware的建议new File(getFilesDir(), "../shared_prefs")
或只是/data/data/<package_name>/shared_prefs/package.name_preferences.xml
。
不过,如果用户从三星rom切换到自定义rom而不进行擦除,则此方法可能会出现问题,因为/dbdata/databases
文件可能未使用但仍然存在。
更多细节
在一些三星设备上,例如运行Froyo的Galaxy S系列,设置如下:/data/data/<package_name>/(lib|files|databases)
有时也有共享的pref,但这只是三星试图迷惑你!别相信它!(我认为这可能是从2.1升级到2.2的遗留问题,但可能是用户切换rom的遗留问题。我不太清楚,我只是在我的应用程序的bug报告界面中同时包含了这两个文件,有时会看到这两个文件)。
还有:/dbdata/databases/<package_name>/shared_prefs
这是真正的共享prefs目录。
但是在弗罗约的银河标签上,这很奇怪。一般来说:/data/data/<package_name>/(lib|shared_prefs|files|databases)
没有/dbdata/databases/<package_name>
目录,但系统应用程序似乎有:/dbdata/databases/<package_name>/yourdatabase.db
另外,还有一个好处是,在卸载应用程序时,/dbdata/databases/<package_name>
不会被删除。如果用户重新安装了你的应用程序,请使用SharedPreferences祝你好运!