一、android6.0以后的危险权限介绍
(注意:Android O 8.0对于权限更加严格,下面会说一下8.0)
android6.0以后有些危险权限需要手动去授权,就有了运行时权限的处理。下面的表格就是危险权限组:
权限组名 | 权限名 |
CALENDAR 日历 | READ_CALENDAR WRITE_CALENDER |
CAMERA 相机 | CAMERA |
CONTACTS 联系人 | READ_CONTACTS WRITE_CONTACTS GET_ACCOUNTS |
LOCATION 定位 | ACCESS_FINE_LOCATION ACCESS_COARSE_LOCATION |
MICROPHONE 麦克风 | RECORD_AUDIO |
PHONE 电话 | READ_PHONE_STATE CALL_PHONE READ_CALL_LOG WRITE_CALL_LOG ADD_VOICEMAIL USE_SIP PROCESS_OUTGOING_CALLS |
SENSORS 传感器 | BODY_SENSORS |
SMS 短信 | Short Message Service SEND_SMS RECEIVE_SMS READ_SMS RECEIVE_WAP_PUSH RECEIVE_MMS |
STORAGE 数据存储 | READ_EXTRAL_STRORAGE WRITE_EXTERNAL_STORAGE |
二、传统的权限申请过程:
1、在AndroidManifest文件中添加需要的权限。
2、检查权限是否授权
3、申请权限
4、处理授权的结果
以定位权限为例:
1.首先在请单文件中声明
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
2.检查权限是否授权
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
//没有授权,编写申请权限代码
}else{
//已经授权,执行操作代码
}
基本上调用checkSelfPermission()函数传入权限参数,返回的结果又两个:
如果是已授权的权限,该方法返回结果是 PackageManager.PERMISSION_GRANTED 常量为 0,
如果是未授权的权限,该方法返回结果是 PackageManager.PERMISSION_DENIED 常量为 -1。
这样就可以判断是否已经授权,来进行下一步的操作。
3.如果没有授权,需要申请权限
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
0);
这是一个异步的方法,第一个参数是Context;第二个参数是需要申请的权限的字符串数组(这个是支持同时申请多个权限,系统会逐个询问是否授权);第三个参数为请求码requestCode,主要用于回调的时候检测。