首頁 > 軟體

Flutter開發之動態許可權的使用

2021-09-27 13:00:56

眾所周知,Android在6.0版本後將許可權修改成了動態許可權,而iOS則一直使用的是動態許可權,所以在Flutter應用開發中如果涉及到一些危險許可權,就需要進行動態申請,動態申請許可權可以使用Flutter的permission_handler

基本使用

1,設定許可權

首先,開啟Android工程下的AndroidManifest.xml檔案,具體路徑如下:在androidappsrcmainAndroidManifest.xml中設定,然後新增如下所示的許可權。

<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>

動態許可權申請

目前,這個外掛已經升級了好幾版,而不同版本處理方法也不一樣,特別是最新的5.0.0版本和之前的版本,用法差別比較大。

4.3.0

例如,下面是4.3.0版本的用法:

  • 許可權列表:PermissionGroup中的欄位
  • 許可權狀態列表:PermissionStatus中欄位
  • 開啟許可權設定頁面:await PermissionHandler().openAppSettings();
  • 申請許可權

範例如下:

await Map<PermissionGroup, PermissionStatus> map= PermissionHandler().requestPermissions([ 許可權列表])

然後,是獲取申請許可權的狀態,如下:

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

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(),
          ));
    }

  }

參考: permission_handler

到此這篇關於Flutter開發之動態許可權的使用的文章就介紹到這了,更多相關Flutter 動態許可權內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com