溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Flutter開發中如何使用動態權限

發布時間:2021-09-27 13:36:23 來源:億速云 閱讀:190 作者:小新 欄目:開發技術

小編給大家分享一下Flutter開發中如何使用動態權限,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

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

基本使用

1,配置權限

首先,打開Android工程下的AndroidManifest.xml文件,具體路徑如下:在android\app\src\main\AndroidManifest.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(),
          ));
    }

  }

以上是“Flutter開發中如何使用動態權限”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女