在我们Android和IOS开发中,都会涉及到权限问题,而Flutter是需要将IOS和Android权限柔和起来的,分别需要适配Android和IOS,推荐使用permission_handler插件完成手机权限的检查以及开启
在pubspec.yaml中添加依赖,并flutter pub get更新依赖
dependencies:
flutter:
sdk: flutter
# 权限
permission_handler: ^8.3.0
在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>
在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.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();
}
}