<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
眾所周知,Android在6.0版本後將許可權修改成了動態許可權,而iOS則一直使用的是動態許可權,所以在Flutter應用開發中如果涉及到一些危險許可權,就需要進行動態申請,動態申請許可權可以使用Flutter的permission_handler。
首先,開啟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版本的用法:
範例如下:
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版本和之前的寫法大體類似,只是方法和引數欄位發生了改變,如下所示。
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開發之動態許可權的使用的文章就介紹到這了,更多相關Flutter 動態許可權內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45