Flutter中PhotoManager.getAssetPathList()在Android真机运行报错
问题排查方案
权限配置检查
- Android 13(SDK33)下仅靠
android:requestLegacyExternalStorage="true"无法满足媒体访问需求,必须在AndroidManifest.xml中添加针对性的媒体权限:<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> <!-- 若需加载视频,额外添加:<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" /> --> - 注意:
READ_EXTERNAL_STORAGE在SDK33已被废弃,不能再作为主要权限依赖。
动态权限申请验证
- 必须在代码中主动请求
READ_MEDIA_IMAGES权限,且要在调用PhotoManager的任何方法前确认权限已通过,示例代码:import 'package:permission_handler/permission_handler.dart'; Future<void> checkAndRequestPermissions() async { final status = await Permission.photos.status; if (!status.isGranted) { await Permission.photos.request(); } } - 权限未通过时,PhotoManager无法获取媒体文件,直接调用
albums.first这类方法会触发Bad state: No element异常。
代码逻辑防护
- 避免直接访问列表的首个元素,先判断相册列表是否为空:
final albums = await PhotoManager.getAssetPathList( type: RequestType.image, onlyAll: false, ); if (albums.isNotEmpty) { final assets = await albums.first.getAssetListPaged(page: 0, size: 20); // 处理图片资源逻辑 } else { // 提示用户无可用图片或权限未授权 }
设备特殊适配
- 检查Galaxy Fold2的系统设置,确认应用已开启「媒体和文件」权限,部分折叠屏设备对权限范围有额外限制。
- 尝试清除应用缓存与存储后重新安装,避免旧权限配置残留影响。
日志辅助排查
- 在关键节点添加日志,确认权限状态与相册列表长度:
print('照片权限状态:${await Permission.photos.status}'); final albums = await PhotoManager.getAssetPathList(type: RequestType.image); print('获取到的相册数量:${albums.length}'); - 通过日志明确是权限问题还是无可用媒体文件,进一步定位异常根源。
内容的提问来源于stack exchange,提问作者MooNChilD Song
相关产品推荐
相关产品推荐

