313插件:動態權限permission_handler_flutter


TOC

動態權限permission_handler

鏡像地址:https://pub.flutter-io.cn/packages/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(),
          ));
    }

  }





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM