如何请求手机存储权限?相册选择器代码跳转应用信息页的解决方法
相册选择器权限请求直接跳转到应用信息页的问题排查与修复
问题描述
我参考YouTube教程编写相册选择器功能,需要向用户请求存储权限,但运行代码时会直接跳转到应用信息页面。请问出现该问题的原因是什么,以及如何修复?

原代码
import 'package:photo_manager/photo_manager.dart'; class MediaServices { Future loadAlbum(RequestType requestType) async { var permission = await PhotoManager.requestPermissionExtend(); List<AssetPathEntity> albumList = []; if (permission == true) { albumList = await PhotoManager.getAssetPathList( type: requestType, ); } else { PhotoManager.openSetting(); } return albumList; } Future loadAssets(AssetPathEntity selectedAlbum) async { // ignore: deprecated_member_use List<AssetEntity> assetList = await selectedAlbum.getAssetListRange( // ignore: deprecated_member_use start: 0, end: selectedAlbum.assetCount); return assetList; } }
问题原因
- 权限判断逻辑错误:
requestPermissionExtend()方法返回的不是布尔值true,而是PermissionState枚举类型(包含authorized已授权、denied临时拒绝、permanentlyDenied永久拒绝等状态)。直接用permission == true判断,这个条件永远不成立,导致代码直接执行PhotoManager.openSetting()跳转到应用信息页。 - 未区分权限拒绝类型:没有区分用户是临时拒绝还是永久拒绝权限,只要权限未通过就直接跳转设置页,不符合交互逻辑。
修复方案
1. 修正权限判断逻辑
根据PermissionState枚举值判断权限状态,替换原有的布尔值比较逻辑。
2. 区分权限拒绝场景
临时拒绝时可再次发起权限请求,仅当用户永久拒绝时才引导至设置页。
修复后的代码
import 'package:photo_manager/photo_manager.dart'; class MediaServices { Future<List<AssetPathEntity>> loadAlbum(RequestType requestType) async { final PermissionState permissionState = await PhotoManager.requestPermissionExtend(); List<AssetPathEntity> albumList = []; if (permissionState == PermissionState.authorized) { // 权限已授权,加载相册列表 albumList = await PhotoManager.getAssetPathList(type: requestType); } else if (permissionState == PermissionState.denied) { // 临时拒绝,再次发起权限请求 final PermissionState retryState = await PhotoManager.requestPermissionExtend(); if (retryState == PermissionState.authorized) { albumList = await PhotoManager.getAssetPathList(type: requestType); } } else if (permissionState == PermissionState.permanentlyDenied) { // 永久拒绝,引导用户前往设置页开启权限 PhotoManager.openSetting(); } return albumList; } Future<List<AssetEntity>> loadAssets(AssetPathEntity selectedAlbum) async { // 替换废弃方法,使用getAssetListPaged替代getAssetListRange List<AssetEntity> assetList = await selectedAlbum.getAssetListPaged(page: 0, size: selectedAlbum.assetCount); return assetList; } }
额外说明
- 注意
requestPermissionExtend()的返回值类型为PermissionState,需确保正确导入该枚举。 - 原代码中
getAssetListRange方法已废弃,建议使用getAssetListPaged替代,避免后续版本兼容性问题。
内容的提问来源于stack exchange,提问作者Eain Hmun Khin
相关产品推荐
相关产品推荐

