Flutter动态权限方案之permission_handler
- 发表于
- flutter
Flutter权限管理
权限管理是APP中较常用的功能,在Flutter中有比较好的包可用:permission_handler。
要特别注意的是permission_handler 5
与之前的版本有较大更新优化,最重要的是Api结构更简洁直观了,在permission_handler 3
中一个简单的权限请求与验证需要写大概7行代码,比如:
var handler = PermissionHandler();
var permission = await handler.checkPermissionStatus(PermissionGroup.storage);
if (permission != PermissionStatus.granted) {
var permissions = await handler.requestPermissions([PermissionGroup.storage]);
if (permissions[PermissionGroup.storage] != PermissionStatus.granted) {
// Do stuff.
}
}
而在permission_handler 5
中你只需要这样写:
if (await Permission.storage.requestIfDenied().isGranted) {
// Do stuff.
}
是不是很赞。网上搜到的99%用法全是基于老版本的,写法在最新版中都失效了,在这里我也入坑了。然后去看Api结构才发现,本文也是对那些搜索出来的失效内容的更新。
优化版动态权限
注意,这是网上一个permission_handler 3
版本的方法,如果你使用的是最新版permission_handler 5
,你需要修改更新一下API结构。
//动态申请权限
Future applyPermission(
String atcUrl, String atcName, BuildContext context) async {
//只有当用户同时点选了拒绝开启权限和不再提醒后才会true
bool isSHow = await PermissionHandler()
.shouldShowRequestPermissionRationale(PermissionGroup.storage);
// 申请结果权限检测
PermissionStatus permission = await PermissionHandler()
.checkPermissionStatus(PermissionGroup.storage);
if (permission != PermissionStatus.granted) {
//权限没允许
//如果弹框不在出现了,那就跳转到设置页。
//如果弹框还能出现,那就不用管了,申请权限就行了
if (!isSHow) {
await PermissionHandler().openAppSettings();
} else {
await PermissionHandler().requestPermissions([PermissionGroup.storage]);
//此时要在检测一遍,如果允许了就下载。
//没允许就就提示。
PermissionStatus pp = await PermissionHandler()
.checkPermissionStatus(PermissionGroup.storage);
if (pp == PermissionStatus.granted) {
//去下载吧
downloadFile(atcUrl, atcName);
} else {
// 参数1:提示消息// 参数2:提示消息多久后自动隐藏// 参数3:位置
Toast.show("请允许存储权限,并重试!", context,
duration: Toast.LENGTH_SHORT, gravity: Toast.CENTER);
}
}
} else {
//权限允许了,那就下载吧、
downloadFile(atcUrl, atcName);
}
}
补充:Android6以上系统权限申请注意
android 6.0之上的系统除了添加权限还要在你报错的代码前面添加请求权限的代码,否则你可能会出现即使在Flutter中已经授权的权限,但依然提示android.system.ErrnoException: chmod failed: EACCES (Permission denied)
错误。
我在stackoverflow中得知,在 android 6以上系统虽然已经授权了,但在使用权限时还得需要再次请求权限。
解决方法,上面stackoverflow中已经给出了解决方案。
原文连接:Flutter动态权限方案之permission_handler
所有媒体,可在保留署名、
原文连接
的情况下转载,若非则不得使用我方内容。