当权限被永久拒绝时,Flutter permission_handler 包未打开应用程序设置

Posted

技术标签:

【中文标题】当权限被永久拒绝时,Flutter permission_handler 包未打开应用程序设置【英文标题】:Flutter permission_handler package not opening app settings when permission is permanently denied 【发布时间】:2021-12-03 06:42:03 【问题描述】:

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

我的应用首先需要访问媒体库和相机。如果可能,请有经验的 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 不会打开应用程序设置页面,而是打开“设置”页面。

【问题讨论】:

【参考方案1】:

替换 !galleryAccessStatus.isGrantedgalleryAccessStatus != PermissionStatus.grantedstatus.isPermanentlyDeniedstatus != 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();
      
    
  

【讨论】:

问题是 openAppSettings() 没有打开应用程序设置,而是打开了 ios 设置页面。我在原始帖子中添加了更多上下文。

以上是关于当权限被永久拒绝时,Flutter permission_handler 包未打开应用程序设置的主要内容,如果未能解决你的问题,请参考以下文章

当“颤振升级”时,我得到“权限被拒绝”错误

如何检测权限对话框被用户拒绝

尝试使用 FileLock、Python 写入文件时权限被拒绝

关于linux权限问题Permission denied.

关于linux权限问题Permission denied.

如何在 Android 11 中检测权限的永久拒绝?