Flutter 权限管理 Permission_handler 动态申请定位权限

左丘昊天
2023-12-01

在我们Android和IOS开发中,都会涉及到权限问题,而Flutter是需要将IOS和Android权限柔和起来的,分别需要适配Android和IOS,推荐使用permission_handler插件完成手机权限的检查以及开启

1、配置

1.1 添加依赖

在pubspec.yaml中添加依赖,并flutter pub get更新依赖

dependencies:
  flutter:
    sdk: flutter

  # 权限
  permission_handler: ^8.3.0  

1.2 Android项目

在AndroidManifest.xml中添加:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.xibaoda.xbd_phone" xmlns:tools="http://schemas.android.com/tools">

    <!-- 通过网络得到粗略位置 -->
    <uses-permission xmlns:android="http://schemas.android.com/apk/res/android"
        android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <!-- Android Q新增权限,允许应用在后台发起定位,如应用target为Q,请添加此权限 -->
    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
    <!--如果设置了target >= 28 如果需要启动后台定位则必须声明这个权限-->
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <!-- 检查网络可用性 -->
    <!-- 访问网络状态, 检测网络的可用性. 需要网络运营商相关信息用于网络定位 -->
    <uses-permission xmlns:android="http://schemas.android.com/apk/res/android"
        android:name="android.permission.ACCESS_NETWORK_STATE" />
    <!-- 访问网络的变化, 需要某些信息用于网络定位 -->
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <!-- 通过GPS得到精确位置 -->
    <uses-permission xmlns:android="http://schemas.android.com/apk/res/android"
        android:name="android.permission.ACCESS_FINE_LOCATION" />

</manifest>

1.3 iOS项目

在info.plist中添加权限:

	<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
	<string>需要使用您的定位,地图附近显示停车、车辆信息</string>
	<key>NSLocationAlwaysUsageDescription</key>
	<string>需要使用您的定位,地图附近显示停车、车辆信息</string>
	<key>NSLocationUsageDescription</key>
	<string>需要使用您的定位,地图附近显示停车、车辆信息</string>
	<key>NSLocationWhenInUseUsageDescription</key>
	<string>需要使用您的定位,地图附近显示停车、车辆信息</string>

在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.location, PermissionGroup.locationAlways, PermissionGroup.locationWhenInUse]
            'PERMISSION_LOCATION=1',
          ]
      end
  end
end

2、使用,代码示例

2.1 在要检查权限的文件中,导入插件

import 'package:permission_handler/permission_handler.dart';

2.2 检查权限

//判断是否有权限
void checkPermission() async {
    Permission permission = Permission.locationAlways;
    PermissionStatus status = await permission.status;
    print('检测权限$status');
    if (status.isGranted) {
      //权限通过
    } else if (status.isDenied) {
      //权限拒绝, 需要区分IOS和Android,二者不一样
      requestPermission(permission);
    } else if (status.isPermanentlyDenied) {
      //权限永久拒绝,且不在提示,需要进入设置界面
      openAppSettings();
    } else if (status.isRestricted) {
      //活动限制(例如,设置了家长///控件,仅在iOS以上受支持。
      openAppSettings();
    } else {
      //第一次申请
      requestPermission(permission);
    }
  }

3、申请权限

//申请权限
void requestPermission(Permission permission) async {
    PermissionStatus status = await permission.request();
    print('权限状态$status');
    if (!status.isGranted) {
       openAppSettings();
    }
  }

 类似资料: