You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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配置里存在两个问题:

  1. READ_EXTERNAL_STORAGE权限声明末尾多了一个空格,会导致权限无效,直接删除空格;
  2. 如果用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权限的限制:

  1. 该权限无法通过常规弹窗请求,必须引导用户到应用设置页面手动开启「所有文件访问权限」;
  2. 你的权限请求逻辑缺少主动发起请求的步骤,修正后的代码:
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();
}
  1. 注意: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 20:38:16