首页 > 解决方案 > 当权限被永久拒绝时,Flutter permission_handler 包不打开应用程序设置

问题描述

一段时间以来一直在研究 permission_handler 包。当用户永久拒绝访问应用程序时,试图找出 ios 或 android 上的应用程序设置页面。

我的应用程序首先需要访问媒体库和相机。如果可能,请有经验的 Flutter 开发人员详细说明。我是 Flutter 开发的新手,也是整个移动应用程序开发的新手。

这是ios上的podfile

post_install do |installer|
  installer.pods_project.targets.each do |target|
    flutter_additional_ios_build_settings(target)
    target.build_configurations.each do |config|
            config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [
               '$(inherited)',

               ## dart: PermissionGroup.calendar
               'PERMISSION_EVENTS=0',

               ## dart: PermissionGroup.reminders
               'PERMISSION_REMINDERS=0',

               ## dart: PermissionGroup.contacts
               # 'PERMISSION_CONTACTS=0',

               ## dart: PermissionGroup.camera
               # 'PERMISSION_CAMERA=1',

               ## dart: PermissionGroup.microphone
               # 'PERMISSION_MICROPHONE=0',

               ## dart: PermissionGroup.speech
               'PERMISSION_SPEECH_RECOGNIZER=0',

               ## dart: PermissionGroup.photos
               # 'PERMISSION_PHOTOS=1',

               ## dart: [PermissionGroup.location, PermissionGroup.locationAlways, PermissionGroup.locationWhenInUse]
               'PERMISSION_LOCATION=0',

               ## dart: PermissionGroup.notification
               # 'PERMISSION_NOTIFICATIONS=0',

               ## dart: PermissionGroup.mediaLibrary
               # 'PERMISSION_MEDIA_LIBRARY=1',

               ## dart: PermissionGroup.sensors
                'PERMISSION_SENSORS=0'
             ]
    end
  end
end

这是info.plist-

<key>NSPhotoLibraryUsageDescription</key>
    <string>This app requires access to your photo gallery to view or save images</string>
    <key>NSPhotoLibraryAddUsageDescription</key>
    <string></string>

这是我的实际代码,按下按钮时我正在检查是否有打开画廊的权限

TextButton.icon(
    icon: const Icon(
       Icons.photo_library_rounded,
          size: 50,
        ),
   label: const Text('Pick from gallery',
      style: TextStyle(fontSize: 20)),
    onPressed: () {
      PermissionService().openPhotoGallery();
     },
),

这是我的权限类。该应用程序不会打开应用程序设置,而只是在 ios 上加载设置。

import 'package:permission_handler/permission_handler.dart';

class PermissionService {

  openPhotoGallery() async {
    var galleryAccessStatus = await Permission.mediaLibrary.status;
    if(!galleryAccessStatus.isGranted) {
      var status = await Permission.mediaLibrary.request();
      if(status.isPermanentlyDenied) {
        await openAppSettings();
      }
    }
  }
}

查看 Zeeyans 的答案后添加此片段。openAppSettings 不会打开应用程序设置页面,而是打开“设置”页面。 在此处输入图像描述

标签: flutterdartandroid-permissionsios-permissions

解决方案


!galleryAccessStatus.isGranted替换为galleryAccessStatus != PermissionStatus.granted 并将 status.isPermanentlyDenied 替换status != PermissionStatus.granted

openPhotoGallery() async {
    var galleryAccessStatus = await Permission.mediaLibrary.status;

    if(galleryAccessStatus != PermissionStatus.granted) { //here
      var status = await Permission.mediaLibrary.request();

      if(status != PermissionStatus.granted) {  //here
        await openAppSettings();
      }
    }
  }

推荐阅读