Flutter開(kāi)發(fā)之動(dòng)態(tài)權(quán)限的使用
眾所周知,Android在6.0版本后將權(quán)限修改成了動(dòng)態(tài)權(quán)限,而iOS則一直使用的是動(dòng)態(tài)權(quán)限,所以在Flutter應(yīng)用開(kāi)發(fā)中如果涉及到一些危險(xiǎn)權(quán)限,就需要進(jìn)行動(dòng)態(tài)申請(qǐng),動(dòng)態(tài)申請(qǐng)權(quán)限可以使用Flutter的permission_handler。
基本使用
1,配置權(quán)限
首先,打開(kāi)Android工程下的AndroidManifest.xml文件,具體路徑如下:在android\app\src\main\AndroidManifest.xml中配置,然后添加如下所示的權(quán)限。
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.kill_attendance"> <!-- 申請(qǐng)Android權(quán)限--> <!--網(wǎng)絡(luò)訪問(wèn)--> <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名稱,圖標(biāo) --> <application android:name="io.flutter.app.FlutterApplication" android:label="應(yīng)用名稱" 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>
動(dòng)態(tài)權(quán)限申請(qǐng)
目前,這個(gè)插件已經(jīng)升級(jí)了好幾版,而不同版本處理方法也不一樣,特別是最新的5.0.0版本和之前的版本,用法差別比較大。
4.3.0
例如,下面是4.3.0版本的用法:
- 權(quán)限列表:PermissionGroup中的字段
- 權(quán)限狀態(tài)列表:PermissionStatus中字段
- 打開(kāi)權(quán)限設(shè)置頁(yè)面:await PermissionHandler().openAppSettings();
- 申請(qǐng)權(quán)限
示例如下:
await Map<PermissionGroup, PermissionStatus> map= PermissionHandler().requestPermissions([ 權(quán)限列表])
然后,是獲取申請(qǐng)權(quán)限的狀態(tài),如下:
PermissionStatus contactsPermStatus = await PermissionHandler().checkPermissionStatus(PermissionGroup.contacts);
下面是一個(gè)完整的示例:
///請(qǐng)求權(quán)限 void _requestPermission() async { debugPrint("進(jìn)入閃屏頁(yè)面"); // 申請(qǐng)權(quán)限 // PermissionStatus storageStatus ; PermissionStatus cameraStatus; await PermissionHandler().requestPermissions( [ PermissionGroup.camera]).then((value) { debugPrint("返回:$value"); // storageStatus=value[PermissionGroup.storage]; cameraStatus=value[PermissionGroup.camera]; }); debugPrint("請(qǐng)求權(quán)限,并獲取權(quán)限:$cameraStatus"); //校驗(yàn)權(quán)限 if (cameraStatus == PermissionStatus.granted) { debugPrint("校驗(yàn)權(quán)限:用戶都同意了"); //用戶都同意了(用&&) ///權(quán)限都申請(qǐng)成功初始化閃屏 _initSplash(); } else if ( cameraStatus == PermissionStatus.denied) { debugPrint("校驗(yàn)權(quán)限:有任何一組權(quán)限被用戶拒絕"); //用戶拒絕了(用||) ///有任何一組權(quán)限被用戶拒絕 //拼接提示權(quán)限文本 StringBuffer sb = new StringBuffer(); sb.write(cameraStatus == PermissionStatus.denied ? "相機(jī)," : ""); String tip = Utils.removePostfix(sb.toString(), ","); Utils.showCustomDialog( context, ConfirmDialog( "您拒絕了應(yīng)用的必要權(quán)限:\n[$tip],是否重新申請(qǐng)?", canBackDismiss: false, confirmCallback: () => _requestPermission(), cancelCallback: () => SystemNavigator.pop(), )); } else if ( cameraStatus == PermissionStatus.neverAskAgain) { debugPrint("校驗(yàn)權(quán)限:有權(quán)限永久拒絕"); //有權(quán)限永久拒絕(用||) ///有任何一組權(quán)限選了不再提示 //拼接提示權(quán)限文本 StringBuffer sb = new StringBuffer(); sb.write(cameraStatus == PermissionStatus.neverAskAgain ? "相機(jī)," : ""); String tip = Utils.removePostfix(sb.toString(), ","); Utils.showCustomDialog( context, ConfirmDialog( "您禁用了應(yīng)用的必要權(quán)限:\n[$tip],請(qǐng)到設(shè)置里允許?", canBackDismiss: false, confirmText: "去設(shè)置", confirmCallback: () async { await PermissionHandler().openAppSettings(); //打開(kāi)設(shè)置頁(yè)面 SystemNavigator.pop(); }, cancelCallback: () => SystemNavigator.pop(), )); } }
5.0.0
5.0.0版本和之前的寫法大體類似,只是方法和參數(shù)字段發(fā)生了改變,如下所示。
- 權(quán)限列表:Permission中的字段
- 權(quán)限狀態(tài)列表:PermissionStatus中字段
- 打開(kāi)權(quán)限設(shè)置頁(yè)面:openAppSettings();
- 申請(qǐng)權(quán)限
await [權(quán)限列表].request(); //可以使用then,用權(quán)限獲取狀態(tài)
獲取權(quán)限狀態(tài)await Permission.camera.status
判斷權(quán)限狀態(tài):await Permission.camera.isDenied|isGranted等
下面是詳細(xì)的使用示例:
///請(qǐng)求權(quán)限 void _requestPermission() async { debugPrint("進(jìn)入閃屏頁(yè)面"); // 申請(qǐng)權(quán)限 // PermissionStatus cameraStatus; await [Permission.camera].request(); // .then((value){ //設(shè)置申請(qǐng)后的結(jié)果 // cameraStatus=value[Permission.camera]; // }); //或者直接調(diào)用: debugPrint("請(qǐng)求權(quán)限,并獲取權(quán)限"); if(await Permission.camera.isDenied){ } //校驗(yàn)權(quán)限 if (await Permission.camera.isGranted) { debugPrint("校驗(yàn)權(quán)限:用戶都同意了"); //用戶都同意了(用&&) ///權(quán)限都申請(qǐng)成功初始化閃屏 _initSplash(); } else if ( await Permission.camera.isDenied) { debugPrint("校驗(yàn)權(quán)限:有任何一組權(quán)限被用戶拒絕"); //用戶拒絕了(用||) ///有任何一組權(quán)限被用戶拒絕 //拼接提示權(quán)限文本 StringBuffer sb = new StringBuffer(); sb.write(await Permission.camera.isDenied? "相機(jī)," : ""); String tip = Utils.removePostfix(sb.toString(), ","); Utils.showCustomDialog( context, ConfirmDialog( "您拒絕了應(yīng)用的必要權(quán)限:\n[$tip],是否重新申請(qǐng)?", canBackDismiss: false, confirmCallback: () => _requestPermission(), cancelCallback: () => SystemNavigator.pop(), )); } else if ( await Permission.camera.isPermanentlyDenied) { debugPrint("校驗(yàn)權(quán)限:有權(quán)限永久拒絕"); //有權(quán)限永久拒絕(用||) ///有任何一組權(quán)限選了不再提示 //拼接提示權(quán)限文本 StringBuffer sb = new StringBuffer(); sb.write( await Permission.camera.isPermanentlyDenied ? "相機(jī)," : ""); String tip = Utils.removePostfix(sb.toString(), ","); Utils.showCustomDialog( context, ConfirmDialog( "您禁用了應(yīng)用的必要權(quán)限:\n[$tip],請(qǐng)到設(shè)置里允許?", canBackDismiss: false, confirmText: "去設(shè)置", confirmCallback: () async { await openAppSettings(); //打開(kāi)設(shè)置頁(yè)面 SystemNavigator.pop(); }, cancelCallback: () => SystemNavigator.pop(), )); } }
到此這篇關(guān)于Flutter開(kāi)發(fā)之動(dòng)態(tài)權(quán)限的使用的文章就介紹到這了,更多相關(guān)Flutter 動(dòng)態(tài)權(quán)限內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android 繪制多級(jí)樹(shù)形選擇列表實(shí)例代碼
這篇文章主要介紹了Android 繪制多級(jí)樹(shù)形選擇列表的相關(guān)知識(shí),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2018-02-02Android和iOS 測(cè)試五個(gè)最好的開(kāi)源自動(dòng)化工具
本文主要介紹Android和iOS 五個(gè)最好的開(kāi)源自動(dòng)化工具,這里整理了相關(guān)資料,希望能幫助測(cè)試軟件的朋友,有需要的看下2016-09-09解決Could not find com.android.tools.build:gradle:3.0.0
這篇文章主要介紹了在Android Studio升級(jí)時(shí)碰到Could not find com.android.tools.build:gradle:3.0.0問(wèn)題的解決方法,需要的朋友跟隨小編一起看看吧2021-08-08Android自定義View實(shí)現(xiàn)垂直時(shí)間軸布局
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)垂直時(shí)間軸布局的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03Android開(kāi)發(fā)實(shí)現(xiàn)的標(biāo)準(zhǔn)體重計(jì)算器功能示例
這篇文章主要介紹了Android開(kāi)發(fā)實(shí)現(xiàn)的標(biāo)準(zhǔn)體重計(jì)算器功能,結(jié)合實(shí)例形式分析了Android體重計(jì)算器的界面布局與功能實(shí)現(xiàn)相關(guān)操作技巧,需要的朋友可以參考下2017-12-12Android 用HttpURLConnection訪問(wèn)網(wǎng)絡(luò)的方法
下面小編就為大家分享一篇Android 用HttpURLConnection訪問(wèn)網(wǎng)絡(luò)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01Android開(kāi)發(fā)實(shí)現(xiàn)讀取assets目錄下db文件的方法示例
這篇文章主要介紹了Android開(kāi)發(fā)實(shí)現(xiàn)讀取assets目錄下db文件的方法,結(jié)合實(shí)例形式分析了Android針對(duì)assets目錄下SQLite數(shù)據(jù)庫(kù)文件的相關(guān)操作技巧,需要的朋友可以參考下2017-10-10Android 中通過(guò)ViewDragHelper實(shí)現(xiàn)ListView的Item的側(cè)拉劃出效果
這篇文章主要介紹了 Android 中通過(guò)ViewDragHelper實(shí)現(xiàn)ListView的Item的側(cè)拉劃出效果,需要的朋友可以參考下2017-08-08Android用MVP實(shí)現(xiàn)一個(gè)簡(jiǎn)單的類淘寶訂單頁(yè)面的示例
本篇文章主要介紹了Android用MVP實(shí)現(xiàn)一個(gè)簡(jiǎn)單的類淘寶訂單頁(yè)面的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-11-11Android編程添加快捷方式(Short)到手機(jī)桌面的方法(含添加,刪除及查詢)
這篇文章主要介紹了Android編程添加快捷方式(Short)到手機(jī)桌面的方法,含有針對(duì)桌面快捷方式的添加,刪除及查詢的操作實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-01-01