安卓权限获取

  • 安卓权限的出现
  • 权限的类别
  • 常用的危险权限
  • 在程序运行时申请权限
  • 在Manifest清单文件中进行声明
  • 判断权限是否已经授权
  • 申请权限
  • 返回结果


安卓权限的出现

  1. 为了防止应用过多的获取应用不需要的权限。
  2. 让用户清楚的知道手机所申请的权限,因为对于危险权限的获取需要弹窗通知用户进行授权处理。

在安卓6.0之后加入了运行时权限功能(在程序运行到某个功能时进行进行权限申请,当然如果用户拒绝将使用不到完整的功能)

权限的类别

安卓对于应用权限一般分为两种:一种是普通权限;一种是危险权限;

  1. 这两种权限都需要在Manifest清单文件中进行声明。
  2. 普通权限因为不涉及到隐私或者设备安全性的问题,所以系统会自动进行授权。
  3. 危险权限一般通过弹窗形式进行申请授权,用户授权后在之后的使用中一般不需要再次申请。

常用的危险权限

PHONE(手机状态相关的权限)

  1. READ_PHONE_STATE
  2. READ_PHONE_NUMBERS
  3. CALL_PHONE
  4. ANSER_PHONE_CALLS

STORAGE(对手机内存相关的权限)

  1. READ_EXTERNAL_STORAGE
  2. WRITE_EXTERNAL_STORAGE
  3. ACCESS_MEDIA_LOCATION

LOCATION(获取设备地理位置的权限)

  1. ACCESS_FINE_LOCATION
  2. ACCESS_COARSE_LOCATION
  3. ACCESS_BACKGROUND_LOCATION

CAMERA(获取像机的使用)

  1. CAMERA

在程序运行时申请权限

在Manifest清单文件中进行声明

无论是何种权限,都需要在清单文件中进行声明
<uses-permission android:name="android.permission.XXXXX "
如果是普通的权限,比如使用手机的网络,声明之后系统会自动授权,也就是权限会自动获得。
而对于危险权限,需要在程序运行时进行获取。
流程如下:

  1. 判断权限是否已经获取到。
  2. 如果没有获取到,进行权限获取。

判断权限是否已经授权

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表示授权。