Flutter開發(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)用開發(fā)中如果涉及到一些危險(xiǎn)權(quán)限,就需要進(jìn)行動(dòng)態(tài)申請,動(dòng)態(tài)申請權(quán)限可以使用Flutter的permission_handler。
基本使用
1,配置權(quán)限
首先,打開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">
<!-- 申請Android權(quán)限-->
<!--網(wǎng)絡(luò)訪問-->
<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)限申請
目前,這個(gè)插件已經(jīng)升級(jí)了好幾版,而不同版本處理方法也不一樣,特別是最新的5.0.0版本和之前的版本,用法差別比較大。
4.3.0
例如,下面是4.3.0版本的用法:
- 權(quán)限列表:PermissionGroup中的字段
- 權(quán)限狀態(tài)列表:PermissionStatus中字段
- 打開權(quán)限設(shè)置頁面:await PermissionHandler().openAppSettings();
- 申請權(quán)限
示例如下:
await Map<PermissionGroup, PermissionStatus> map= PermissionHandler().requestPermissions([ 權(quán)限列表])
然后,是獲取申請權(quán)限的狀態(tài),如下:
PermissionStatus contactsPermStatus = await PermissionHandler().checkPermissionStatus(PermissionGroup.contacts);
下面是一個(gè)完整的示例:
///請求權(quán)限
void _requestPermission() async {
debugPrint("進(jìn)入閃屏頁面");
// 申請權(quán)限
// PermissionStatus storageStatus ;
PermissionStatus cameraStatus;
await PermissionHandler().requestPermissions(
[ PermissionGroup.camera]).then((value) {
debugPrint("返回:$value");
// storageStatus=value[PermissionGroup.storage];
cameraStatus=value[PermissionGroup.camera];
});
debugPrint("請求權(quán)限,并獲取權(quán)限:$cameraStatus");
//校驗(yàn)權(quán)限
if (cameraStatus == PermissionStatus.granted) {
debugPrint("校驗(yàn)權(quán)限:用戶都同意了");
//用戶都同意了(用&&)
///權(quán)限都申請成功初始化閃屏
_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],是否重新申請?",
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],請到設(shè)置里允許?",
canBackDismiss: false,
confirmText: "去設(shè)置",
confirmCallback: () async {
await PermissionHandler().openAppSettings(); //打開設(shè)置頁面
SystemNavigator.pop();
},
cancelCallback: () => SystemNavigator.pop(),
));
}
}
5.0.0
5.0.0版本和之前的寫法大體類似,只是方法和參數(shù)字段發(fā)生了改變,如下所示。
- 權(quán)限列表:Permission中的字段
- 權(quán)限狀態(tài)列表:PermissionStatus中字段
- 打開權(quán)限設(shè)置頁面:openAppSettings();
- 申請權(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ì)的使用示例:
///請求權(quán)限
void _requestPermission() async {
debugPrint("進(jìn)入閃屏頁面");
// 申請權(quán)限
// PermissionStatus cameraStatus;
await [Permission.camera].request();
// .then((value){
//設(shè)置申請后的結(jié)果
// cameraStatus=value[Permission.camera];
// });
//或者直接調(diào)用:
debugPrint("請求權(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)限都申請成功初始化閃屏
_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],是否重新申請?",
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],請到設(shè)置里允許?",
canBackDismiss: false,
confirmText: "去設(shè)置",
confirmCallback: () async {
await openAppSettings(); //打開設(shè)置頁面
SystemNavigator.pop();
},
cancelCallback: () => SystemNavigator.pop(),
));
}
}
到此這篇關(guān)于Flutter開發(fā)之動(dòng)態(tài)權(quán)限的使用的文章就介紹到這了,更多相關(guān)Flutter 動(dòng)態(tài)權(quán)限內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android ScrollView的頂部下拉和底部上拉回彈效果
本篇文章主要介紹了Android ScrollView的頂部下拉和底部上拉回彈效果,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-05-05
Android使用ViewPager實(shí)現(xiàn)翻頁效果
這篇文章主要為大家詳細(xì)介紹了Android使用ViewPager實(shí)現(xiàn)翻頁效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
Android編程使用android-support-design實(shí)現(xiàn)MD風(fēng)格對話框功能示例
這篇文章主要介紹了Android編程使用android-support-design實(shí)現(xiàn)MD風(fēng)格對話框功能,涉及Android對話框、視圖、布局相關(guān)操作技巧,需要的朋友可以參考下2017-01-01
Android自定義AvatarImageView實(shí)現(xiàn)頭像顯示效果
這篇文章主要為大家詳細(xì)介紹了Android自定義AvatarImageView實(shí)現(xiàn)頭像顯示效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09
Android基于wheelView實(shí)現(xiàn)自定義日期選擇器
這篇文章主要為大家詳細(xì)介紹了Android基于wheelView實(shí)現(xiàn)自定義日期選擇器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07
淺析Android手機(jī)衛(wèi)士關(guān)閉自動(dòng)更新
保存數(shù)據(jù)的四種方式,網(wǎng)絡(luò),廣播提供者,SharedPreferences,數(shù)據(jù)庫。接下來通過本文給大家介紹android手機(jī)衛(wèi)士關(guān)閉自動(dòng)更新的相關(guān)知識(shí),感興趣的朋友一起學(xué)習(xí)吧2016-04-04
Kotlin協(xié)程低級(jí)api startCoroutine與ContinuationInterceptor
這篇文章主要為大家介紹了Kotlin協(xié)程低級(jí)api startCoroutine與ContinuationInterceptor示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01

