事情是这样的:
这天我正在写Virgo的位置支持,可是她(adroid stdio)突然给我报了错,关于GPS权限获取错误的
原来,在Android7.0之后,危险权限(例如位置获取,摄像头调用)都需要在程序中动态申请,变得超级麻烦。
于是我引进了Google提供的一个模块:EasyPermission,将其封装后作为Virgo的权限获取模块。
新的权限获取模块位于Virgo.android.APP.permission下,下面介绍一下基础功能
【壹】权限模块常用函数或类
permission.py:
class PermissionManager类 --内部定义了约200个类变量,代表着200多个权限变量class PermissionStatus类 --内部封装两种状态:PERMISSION_GRANTED(权限获取成功)、PERMISSION_DENIED(权限获取失败)func check_permission(which_permission, activity) -> bool --用于检测是否拥有此权限,参数1:权限名,可通过PermissionManager获取。参数2:Activity对象func ask_for_permission(activity, ask_info, request_code, which_permission) --请求权限,参数1:Activity对象,参数2:提示信息字符串(当第二次请求权限时,会出现一个对话框显示你的提示信息,例如“请求位置权限是为了更好地确定您周围的朋友,请允许”之类的信息),参数3:请求码,只需要保证是一个唯一整数即可,用于区分获取不同权限时对应调用的函数,参数4:权限名,可通过PermissionManager获取。func check_activity_permission(which_permission, activity) -> bool --用于检测是否拥有此权限,参数1:权限名,可通过PermissionManager获取。参数2:Activity对象.注:功能与上面的check_permission相同,但更推荐使用这个,因为这个函数的底层基于高级API,更加稳定
【贰】在Activity中使用:
1.引入对应模块
from Virgo.android.APP.permission import check_permission, PermissionManager, ask_for_permission, check_activity_permission
2.定义自己的Activity,不过此时需继承PermissionControlActivity(需要权限的Activity)
class LocationActivity(PermissionControlActivity):
3.重写4个新增加的类方法
方法名 | 参数 | 描述 |
onPermissionsGranted | requestCode(请求码), permissions(权限列表) | 当权限被允许时执行的操作 |
onPermissionsDenied | requestCode, permissions | 当权限被拒绝是执行的操作 |
onRationaleAccepted | requestCode | 当提示框被点击“确定”时执行的操作 |
onRationaleDenied | requestCode | 当提示框被点击“取消”时执行的操作 |
【叁】在实际情况中,举例
假如我们需要开发一款需要用到位置/GPS定位的APP,此时需要用到位置权限
涉及到的权限:
PermissionManager.ACCESS_COARSE_LOCATION
PermissionManager.ACCESS_FINE_LOCATION
1.在Activity的onCreate方法重写中添加 ask_for_permission函数调用
先加个逻辑判断:如果没有此权限,就获取,如果有了权限就直接跳过即可
if check_activity_permission(
[PermissionManager.ACCESS_COARSE_LOCATION, PermissionManager.ACCESS_FINE_LOCATION],
self):
如果没有此权限,即check函数返回False:
ask_for_permission(self, "请同意请求", 666, [PermissionManager.ACCESS_COARSE_LOCATION,PermissionManager.ACCESS_FINE_LOCATION])
2. 重写“四个方法”
允许权限时:
def onPermissionsGranted(self, requestCode, permissions):
toast(self, "权限获取成功!")
# 此处省略操作,可以接着往下写
拒绝权限时:
def onPermissionsDenied(self, requestCode, permissions):
toast(self, "权限获取失败..")
# 自己写去.......
关于对话框的:
def onRationaleAccepted(self, requestCode):
toast(self, "点击了确定按钮......")
def onRationaleDenied(self, requestCode):
toast(self, "点击了取消按钮")
因为懒,所以不录屏了




注意:如果用户连续点击“拒绝”两次后,那么之后程序无法继续跳出申请窗口,只能在手机设置中为程序赋予权限了。