動態權限permission_handler
dependencies:
permission_handler: ^5.0.0+hotfix.6
使用
1.配置權限
Android
在android\app\src\main\AndroidManifest.xml
中配置,uses-permission
就是一個個權限
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.kill_attendance">
<!-- 申請Android權限-->
<!--網絡訪問-->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- Permissions options for the `contacts` group -->
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<!-- Permissions options for the `storage` group -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- Permissions options for the `camera` group -->
<uses-permission android:name="android.permission.CAMERA" />
<!-- Permissions options for the `location` group -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
<!-- Permissions options for the `microphone` or `speech` group -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!-- app名稱,圖標 -->
<application
android:name="io.flutter.app.FlutterApplication"
android:label="沙雕考勤"
android:icon="@mipmap/icon">
<activity
android:name=".MainActivity"
android:launchMode="singleTop"
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize">
<!-- This keeps the window background of the activity showing
until Flutter renders its first frame. It can be removed if
there is no splash screen (such as the default splash screen
defined in @style/LaunchTheme). -->
<meta-data
android:name="io.flutter.app.android.SplashScreenUntilFirstFrame"
android:value="true" />
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
2.動態申請權限
目前這個插件改版了好幾次,不同版本處理方法也不一樣
引入
import 'package:permission_handler/permission_handler.dart';
4.3.0
4.4.x就不一樣了,注意自己lock的版本
- 權限列表:
PermissionGroup
中的字段 - 權限狀態列表:
PermissionStatus
中字段 - 打開權限設置頁面:
await PermissionHandler().openAppSettings();
- 申請權限
await Map<PermissionGroup, PermissionStatus> map= PermissionHandler().requestPermissions([ 權限列表])
//可以使用then,用權限獲取狀態
- 獲取權限狀態
PermissionStatus contactsPermStatus = await PermissionHandler().checkPermissionStatus(PermissionGroup.contacts);
案例:
///請求權限
void _requestPermission() async {
debugPrint("進入閃屏頁面");
// 申請權限
// PermissionStatus storageStatus ;
PermissionStatus cameraStatus;
await PermissionHandler().requestPermissions(
[ PermissionGroup.camera]).then((value) {
debugPrint("返回:$value");
// storageStatus=value[PermissionGroup.storage];
cameraStatus=value[PermissionGroup.camera];
});
debugPrint("請求權限,並獲取權限:$cameraStatus");
//校驗權限
if (cameraStatus == PermissionStatus.granted) {
debugPrint("校驗權限:用戶都同意了");
//用戶都同意了(用&&)
///權限都申請成功初始化閃屏
_initSplash();
} else if ( cameraStatus == PermissionStatus.denied) {
debugPrint("校驗權限:有任何一組權限被用戶拒絕");
//用戶拒絕了(用||)
///有任何一組權限被用戶拒絕
//拼接提示權限文本
StringBuffer sb = new StringBuffer();
sb.write(cameraStatus == PermissionStatus.denied ? "相機," : "");
String tip = Utils.removePostfix(sb.toString(), ",");
Utils.showCustomDialog(
context,
ConfirmDialog(
"您拒絕了應用的必要權限:\n[$tip],是否重新申請?",
canBackDismiss: false,
confirmCallback: () => _requestPermission(),
cancelCallback: () => SystemNavigator.pop(),
));
} else if ( cameraStatus == PermissionStatus.neverAskAgain) {
debugPrint("校驗權限:有權限永久拒絕");
//有權限永久拒絕(用||)
///有任何一組權限選了不再提示
//拼接提示權限文本
StringBuffer sb = new StringBuffer();
sb.write(cameraStatus == PermissionStatus.neverAskAgain ? "相機," : "");
String tip = Utils.removePostfix(sb.toString(), ",");
Utils.showCustomDialog(
context,
ConfirmDialog(
"您禁用了應用的必要權限:\n[$tip],請到設置里允許?",
canBackDismiss: false,
confirmText: "去設置",
confirmCallback: () async {
await PermissionHandler().openAppSettings(); //打開設置頁面
SystemNavigator.pop();
},
cancelCallback: () => SystemNavigator.pop(),
));
}
}
5.0.0
- 權限列表:
Permission
中的字段 - 權限狀態列表:
PermissionStatus
中字段 - 打開權限設置頁面:
openAppSettings();
- 申請權限
await [權限列表].request();
//可以使用then,用權限獲取狀態
- 獲取權限狀態
await Permission.camera.status
- 判斷權限狀態:
await Permission.camera.isDenied|isGranted
等
案例
///請求權限
void _requestPermission() async {
debugPrint("進入閃屏頁面");
// 申請權限
// PermissionStatus cameraStatus;
await [Permission.camera].request();
// .then((value){
//設置申請后的結果
// cameraStatus=value[Permission.camera];
// });
//或者直接調用:
debugPrint("請求權限,並獲取權限");
if(await Permission.camera.isDenied){
}
//校驗權限
if (await Permission.camera.isGranted) {
debugPrint("校驗權限:用戶都同意了");
//用戶都同意了(用&&)
///權限都申請成功初始化閃屏
_initSplash();
} else if ( await Permission.camera.isDenied) {
debugPrint("校驗權限:有任何一組權限被用戶拒絕");
//用戶拒絕了(用||)
///有任何一組權限被用戶拒絕
//拼接提示權限文本
StringBuffer sb = new StringBuffer();
sb.write(await Permission.camera.isDenied? "相機," : "");
String tip = Utils.removePostfix(sb.toString(), ",");
Utils.showCustomDialog(
context,
ConfirmDialog(
"您拒絕了應用的必要權限:\n[$tip],是否重新申請?",
canBackDismiss: false,
confirmCallback: () => _requestPermission(),
cancelCallback: () => SystemNavigator.pop(),
));
} else if ( await Permission.camera.isPermanentlyDenied) {
debugPrint("校驗權限:有權限永久拒絕");
//有權限永久拒絕(用||)
///有任何一組權限選了不再提示
//拼接提示權限文本
StringBuffer sb = new StringBuffer();
sb.write( await Permission.camera.isPermanentlyDenied ? "相機," : "");
String tip = Utils.removePostfix(sb.toString(), ",");
Utils.showCustomDialog(
context,
ConfirmDialog(
"您禁用了應用的必要權限:\n[$tip],請到設置里允許?",
canBackDismiss: false,
confirmText: "去設置",
confirmCallback: () async {
await openAppSettings(); //打開設置頁面
SystemNavigator.pop();
},
cancelCallback: () => SystemNavigator.pop(),
));
}
}