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

如何请求手机存储权限?相册选择器代码跳转应用信息页的解决方法

相册选择器权限请求直接跳转到应用信息页的问题排查与修复

问题描述

我参考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;
}

}

问题原因

  1. 权限判断逻辑错误:requestPermissionExtend()方法返回的不是布尔值true,而是PermissionState枚举类型(包含authorized已授权、denied临时拒绝、permanentlyDenied永久拒绝等状态)。直接用permission == true判断,这个条件永远不成立,导致代码直接执行PhotoManager.openSetting()跳转到应用信息页。
  2. 未区分权限拒绝类型:没有区分用户是临时拒绝还是永久拒绝权限,只要权限未通过就直接跳转设置页,不符合交互逻辑。

修复方案

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 03:55:37