安卓权限获取
- 安卓权限的出现
- 权限的类别
- 常用的危险权限
- 在程序运行时申请权限
- 在Manifest清单文件中进行声明
- 判断权限是否已经授权
- 申请权限
- 返回结果
安卓权限的出现
- 为了防止应用过多的获取应用不需要的权限。
- 让用户清楚的知道手机所申请的权限,因为对于危险权限的获取需要弹窗通知用户进行授权处理。
在安卓6.0之后加入了运行时权限功能(在程序运行到某个功能时进行进行权限申请,当然如果用户拒绝将使用不到完整的功能)。
权限的类别
安卓对于应用权限一般分为两种:一种是普通权限;一种是危险权限;
- 这两种权限都需要在Manifest清单文件中进行声明。
- 普通权限因为不涉及到隐私或者设备安全性的问题,所以系统会自动进行授权。
- 危险权限一般通过弹窗形式进行申请授权,用户授权后在之后的使用中一般不需要再次申请。
常用的危险权限
PHONE(手机状态相关的权限)
- READ_PHONE_STATE
- READ_PHONE_NUMBERS
- CALL_PHONE
- ANSER_PHONE_CALLS
STORAGE(对手机内存相关的权限)
- READ_EXTERNAL_STORAGE
- WRITE_EXTERNAL_STORAGE
- ACCESS_MEDIA_LOCATION
LOCATION(获取设备地理位置的权限)
- ACCESS_FINE_LOCATION
- ACCESS_COARSE_LOCATION
- ACCESS_BACKGROUND_LOCATION
CAMERA(获取像机的使用)
- CAMERA
在程序运行时申请权限
在Manifest清单文件中进行声明
无论是何种权限,都需要在清单文件中进行声明
<uses-permission android:name="android.permission.XXXXX "
如果是普通的权限,比如使用手机的网络,声明之后系统会自动授权,也就是权限会自动获得。
而对于危险权限,需要在程序运行时进行获取。
流程如下:
- 判断权限是否已经获取到。
- 如果没有获取到,进行权限获取。
判断权限是否已经授权
ContextCompat.checkSelfPermission(context,permission)
传入参数:1.Context类型的context(一般Activity)。2.String类型的permission(具体的权限名)
执行: context .checkPermission(permission, Process.myPid(), Process.myUid())
返回:PackageManager.PERMISSION_DENIED==-1(拒绝)或PackageManager.PERMISSION_GRANTED==0(已授权)
申请权限
ActivityCompat.requestPermissions(activity,permissions,requestCode)
传入参数:1.Activity(Activity实例)。2.String[]字符串数组。3.int类型的Code(唯一值)
执行: activity.requestPermissions(permissions, requestCode)
注:在执行requestPermissions()方法时,弹出系统设定的权限请求弹框,需要用户进行选择,用户可以同意或拒绝或不再提醒。
返回结果
onRequestPermissionsResult(int requestCode,
String[] permissions,
int[] grantResults)
用户同意或拒绝之后都会将该权限的授权结果返回,并回调Activity的onRequestPermissionsResult()方。
返回参数:1.int类型的requestCode。2.String[]数组的permissions。3.返回的授权结果
注意 :两个数组之间一一对应,返回的grantResults中-1表示未授权。0表示授权。