Android——权限机制
权限机制
Android申请权限需要在AndroidManifest.xml中添加权限申请,在系统低于6.0的设备上安装的软件只要在AndroidManifest.xml中声明了的权限就可以拥有那些权限。
在系统6.0之后加入了运行时权限功能,将所有权限分为了两类:普通权限和危险权限:
- 普通权限是指那些不会直接威胁到用户安全和隐私的权限,对于这部分权限申请,只要在AndroidManifest.xml中添加权限申请,系统会自动帮我们进行授权。
- 危险权限则表示那些可能会触及用户隐私或者对设备安全性造成影响的权限,如获取设备联系人信息、定位设备的地理位置等,对于这部分权限申请采取运行时权限功能,除了需要在AndroidManifest.xml中添加权限申请,还需要由用户手动点击授权才可以。
在加入运行时权限后,安装时只会赋予安装的软件申请的普通权限,危险权限需要用户在要用到的时候同意对这项权限进行授权才会赋予该权限,不同意则无法使用该权限。
下表列出了Android中的危险权限,一共9组24个权限:
权限组名 |
权限名 |
作用 |
CALENDAR |
READ_CALENDAR |
读取用户的日历数据 |
WRITE_CALENDAR |
写入用户的日历数据 |
|
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 |
使用SIP服务 |
|
PROCESS_OUTGOING_CALLS |
查看向外呼叫期间所拨打的号码(在API 29废弃) |
|
SENSORS |
BOOY_SENSORS |
从传感器中访问数据 |
SMS |
SEND_SMS |
发送SMS消息 |
RECEIVE_SMS |
接收SMS消息 |
|
READ_SMS |
读取SMS消息 |
|
RECEIVE_WAP_PUSH |
接收WAP推送消息 |
|
RECEIVE_MMS |
监视传入的MMS消息 |
|
STORAGE |
READ_EXTERNAL_STORAGE |
读取外部存储 |
WRITE_EXTERNAL_STORAGE |
写到外部存储器 |
查看Android系统中完整的权限列表:https://developer.android.google.cn/reference/android/Manifest.permission.html
运行时权限申请代码(申请用户联系人):
if (ContextCompat.checkSelfPermission(this,Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED){ ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_CONTACTS},1); }
- checkSelfPermission(Context context, String permission)方法用于确定您是否已被授予特定权限,接收两个参数,第一个是Context,第二个是权限名称,返回值有两个,PackageManager.PERMISSION_GRANTED表示已授予,PackageManager.PERMISSION_DENIED表示未授予。
- requestPermissions(Activity activity, Array<String!> permissions, Int requestCode)方法用于请求要授予此应用程序的权限,接收三个参数,第一个参数为Activity的实例,第二个参数是一个String数组,里面存放要申请的权限名,第三个参数是请求码,只要是唯一值就可以。
调用完requestPermissions()方法后,系统会弹出一个权限申请的对话框,然后用户可以选择同意或拒绝该权限申请,不论是哪种结果,都会回调到onRequestPermissionsResult()方法中->
- onRequestPermissionsResult (int requestCode, String[] permissions, int[] grantResults)方法从请求权限中回调结果,有三个参数,前两个参数前面有讲,第三个参数保存的是授权结果,可以在这个方法中写授权操作之后需要的操作代码。