Flutter升级SDK Target至34后应用无法访问手机存储求助
Android 14(SDK34)下Hive存储权限问题解决指南
针对你把Target SDK改为34后Hive无法访问存储的问题,以下是具体的排查和解决步骤:
核心误区纠正
Hive默认存储在应用私有目录(/data/data/[你的包名]/files/),这个目录属于应用专属空间,不需要任何外部存储权限,哪怕是SDK34也能直接读写。如果你的Hive没手动指定外部存储路径,完全不需要申请WRITE_EXTERNAL_STORAGE、MANAGE_EXTERNAL_STORAGE这类权限。
步骤1:清理冗余权限并修正错误
你的Manifest配置里存在两个问题:
READ_EXTERNAL_STORAGE权限声明末尾多了一个空格,会导致权限无效,直接删除空格;- 如果用Hive默认存储,删除
WRITE_EXTERNAL_STORAGE、READ_EXTERNAL_STORAGE、MANAGE_EXTERNAL_STORAGE这三个权限,留着反而会干扰权限逻辑。
修正后的Manifest权限部分示例:
<uses-permission android:name="android.permission.USE_BIOMETRIC"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/> <uses-permission android:name="android.permission.READ_MEDIA_VIDEO"/> <uses-permission android:name="android.permission.READ_MEDIA_AUDIO"/> <uses-permission android:name="com.google.android.gms.permission.AD_ID"/>
步骤2:检查Hive初始化路径
确认你没有手动指定外部存储路径作为Hive的存储目录。如果是默认初始化,直接用下面的代码即可正常工作:
import 'package:hive/hive.dart'; import 'package:path_provider/path_provider.dart'; Future<void> initHive() async { final appDir = await getApplicationDocumentsDirectory(); Hive.init(appDir.path); // 测试存储 var testBox = await Hive.openBox('test'); await testBox.put('demo', 'success'); print(testBox.get('demo')); // 输出success说明存储正常 }
如果你确实需要使用外部存储
如果业务必须让Hive存储到外部目录,需注意SDK34对MANAGE_EXTERNAL_STORAGE权限的限制:
- 该权限无法通过常规弹窗请求,必须引导用户到应用设置页面手动开启「所有文件访问权限」;
- 你的权限请求逻辑缺少主动发起请求的步骤,修正后的代码:
var status = await Permission.manageExternalStorage.status; if (status.isGranted) { return; } else if (status.isDenied) { // 先发起权限请求 var result = await Permission.manageExternalStorage.request(); if (!result.isGranted) { openAppSettings(); } } else if (status.isPermanentlyDenied) { openAppSettings(); }
- 注意:Google Play对使用
MANAGE_EXTERNAL_STORAGE权限的应用审核非常严格,非必要不建议使用。
额外排查点
- 检查ProGuard/R8配置:如果开启了代码混淆,确保没有混淆Hive的核心类,否则会导致存储失败;
- 手动指定路径时,先判断目录是否存在,不存在则主动创建:
final dir = Directory('/sdcard/your_hive_path'); if (!dir.existsSync()) { dir.createSync(recursive: true); } Hive.init(dir.path);
内容的提问来源于stack exchange,提问作者Hacker M.t.s
相关产品推荐
相关产品推荐

