三星Tab E(Android7.1.1/API25)SharedPreferences读取异常求助
三星Tab E(Android 7.1.1,API25)完全支持SharedPreferences,这是Android从API1就提供的基础存储API,你的问题属于设备权限或调试环境异常导致的读写失败,而非API兼容性问题。
问题原因分析
- 三星平板出现的
run as: could not set capabilities: operation not permitted报错,是调试工具访问私有存储目录时的权限限制,但核心问题是应用自身未能成功创建/读写SharedPreferences文件——对应路径下无文件,说明写入操作未执行成功。 - 两台设备在
内部存储/Android/data/...找不到偏好文件是正常现象:getDefaultSharedPreferences()默认将文件存在应用私有目录/data/data/包名/shared_prefs/下,不会存储到外部存储的Android/data路径。
解决方法
验证应用存储权限
进入设备「设置-应用-你的应用-权限」,确认存储权限已开启(API25及以下默认允许私有存储读写,但部分定制系统可能存在异常限制)。修复调试权限异常
- 重启设备与Android Studio,重新建立调试连接,尝试重新访问私有目录。
- 使用
adb命令验证文件是否存在:
若命令提示文件不存在,说明应用写入失败;若能成功导出,仅为Android Studio文件管理器的权限问题,不影响应用正常读写。adb pull /data/data/gmd.com.mickwebsite.metaquest/shared_prefs/gmd.com.mickwebsite.metaquest_preferences.xml
优化SharedPreferences写入逻辑
替换异步的apply()为同步的commit(),通过返回值判断写入结果:SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putInt("geoCount", geoCount); boolean writeSuccess = editor.commit(); if (!writeSuccess) { Log.e("SP_ERROR", "SharedPreferences写入失败"); }
代码位置最佳实践
- OnCreate读取:合理,适合页面初始化时加载配置,当前读取int值的操作无性能问题,无需调整。
- finish方法写入:存在风险——
finish()调用后Activity可能快速销毁,异步的apply()可能未完成写入就被系统终止。建议:- 改为在
geoCount数值变化时立即执行写入,而非等到页面销毁时统一提交。 - 若必须在页面销毁时写入,将代码迁移至
onPause()或onStop(),这两个生命周期方法的执行时机更可靠,能保证写入操作有足够时间完成。
- 改为在
内容的提问来源于stack exchange,提问作者Mick
相关产品推荐
相关产品推荐

