Android 6.0运行时权限管理
2017-08-18 16:12
405 查看
运行时权限管理 定义:
之前我们的App需要权限,只需在
但是
需要使用运行时权限的条件:
设备运行的是 Android 6.0(API 级别 23),并且应用的
Normal Permissions :
android.permission.ACCESS_LOCATION_EXTRA_COMMANDS 允许应用程序访问额外的位置提供命令
android.permission.ACCESS_NETWORK_STATE 获取网络信息状态,如当前的网络连接是否有效
android.permission.ACCESS_NOTIFICATION_POLICY
android.permission.ACCESS_WIFI_STATE 允许程序访问Wi-Fi网络状态信息
android.permission.BLUETOOTH 允许程序连接到已配对的蓝牙设备
android.permission.BLUETOOTH_ADMIN 允许程序发现和配对蓝牙设备
android.permission.BROADCAST_STICKY 允许一个程序广播常用intents
android.permission.CHANGE_NETWORK_STATE 改变网络状态如是否能联网
android.permission.CHANGE_WIFI_MULTICAST_STATE 改变WiFi多播状态
android.permission.CHANGE_WIFI_STATE 允许程序改变Wi-Fi连接状态
android.permission.DISABLE_KEYGUARD 允许程序禁用键盘锁
android.permission.EXPAND_STATUS_BAR 允许一个程序扩展收缩在状态栏,Android开发网提示应该是一个类似Windows Mobile中的托盘程序
android.permission.GET_PACKAGE_SIZE 允许一个程序获取任何package占用空间容量
android.permission.INTERNET 访问网络连接,可能产生GPRS流量
android.permission.KILL_BACKGROUND_PROCESSES 允许程序调用killBackgroundProcesses(String).方法结束后台进程
android.permission.MODIFY_AUDIO_SETTINGS 修改声音设置信息
android.permission.NFC 允许程序执行NFC近距离通讯操作,用于移动支持
android.permission.READ_SYNC_SETTINGS 读取同步设置,读取Google在线同步设置
android.permission.READ_SYNC_STATS 读取同步状态,获得Google在线同步状态
android.permission.RECEIVE_BOOT_COMPLETED 允许程序开机自动运行
android.permission.REORDER_TASKS 允许程序改变Z轴排列任务
com.android.alarm.permission.SET_ALARM 设置闹铃提醒
android.permission.SET_TIME_ZONE 设置系统时区
android.permission.SET_WALLPAPER 允许程序设置壁纸
android.permission.SET_WALLPAPER_HINTS 允许程序设置壁纸hits
android.permission.VIBRATE 允许振动
android.permission.WAKE_LOCK 允许程序
4000
在手机屏幕关闭后后台进程仍然运行
android.permission.WRITE_SYNC_SETTINGS 允许程序写入同步设置
Dangerous Permission:
group:android.permission-group.CONTACTS
permission : android.permission.WRITE_CONTACTS 写入联系人,但不可读取
permission : android.permission.GET_ACCOUNTS 访问GMail账户列表
permission : android.permission.READ_CONTACTS 允许应用访问联系人通讯录信息
group:android.permission-group.PHONE
permission : android.permission.READ_CALL_LOG
permission : android.permission.READ_PHONE_STATE 访问电话状态
permission : android.permission.CALL_PHONE 允许一个程序初始化一个电话拨号不需通过拨号 用户界面需要用户确认
permission : android.permission.WRITE_CALL_LOG
permission : android.permission.USE_SIP 允许程序使用SIP视频服务
permission : android.permission.PROCESS_OUTGOING_CALLS 允许程序监视,修改或放弃播出电话
permission:com.android.voicemail.permission.ADD_VOICEMAIL
group:android.permission-group.CALENDAR
permission : android.permission.READ_CALENDAR 允许程序读取用户的日程信息
permission : android.permission.WRITE_CALENDAR 写入日程,但不可读取
group:android.permission-group.CAMERA
permission : android.permission.CAMERA 请求访问使用照相设备
group:android.permission-group.SENSORS
permission : android.permission.BODY_SENSORS
group:android.permission-group.LOCATION
permission : android.permission.ACCESS_FINE_LOCATION 通过GPS芯片接收卫星的定位信息,定位精度达10米以内
permission : android.permission.ACCESS_COARSE_LOCATION 通过WiFi或移动基站的方式获取用户错略的经纬度信息,定位精度大概误差在30~1500米
group:android.permission-group.STORAGE
permission : android.permission.READ_EXTERNAL_STORAGE
permission : android.permission.WRITE_EXTERNAL_STORAGE 允许程序写入外部存储,如SD卡上写文件
group:android.permission-group.MICROPHONE
permission : android.permission.RECORD_AUDIO 录制声音通过手机或耳机的麦克
group:android.permission-group.SMS
permission : android.permission.READ_SMS 允许程序读取短信息
permission : android.permission.RECEIVE_WAP_PUSH 接收WAP PUSH信息
permission : android.permission.RECEIVE_MMS 接收彩信
permission : android.permission.RECEIVE_SMS 接收短信
permission : android.permission.SEND_SMS 发送短信
总结:分组对权限机制的影响
如果app运行在android 6.0的机器上,如果你申请某个危险的权限,假设你的app早已被用户授权了同一组的某个危险权限,那么系统会立即授权,而不需要用户去点击授权。
demo:假如app对READ_CONTACTS已经授权了,当申请WRITE_CONTACTS权限时,系统会直接授权通过。
权限列表
Android 权限列表,可参照以下资料参考一,参考二,参考三
申请运行权限步骤:
在
在使用时,判断是否为Android 6.0以上,返回false则不需要申请,返回true,则需要申请权限
检查权限
ContextCompat.checkSelfPermission,主要用于检测某个权限是否已经被授予,方法返回值为PackageManager.PERMISSION_DENIED或者PackageManager.PERMISSION_GRANTED(代表此权限已允许)。
申请权限
另外,在申请权限的时候,还需要注意一个函数:
如果应用之前请求过此权限但用户拒绝了请求,此方法将返回 true。
如果用户在过去拒绝了权限请求,并在权限请求系统对话框中选择了 Don’t ask again 选项,此方法将返回 false
处理权限申请回调
总结:网上也有很多已经封装好的关于申请权限的,可以参照以下网址内容
http://jcodecraeer.com/plus/list.php?tid=31&keyword=%C8%A8%CF%DE
之前我们的App需要权限,只需在
manifest中申明,用户安装后,一切申明的权限都可使用。
但是
Android 6.0以后
Android M把权限管理做了加强处理,除了需要在
manifest申明,在使用到相关功能时,有些权限还需重新授权方可使用,所以就把这些需要重新授权方可使用的权限称之为运行时权限(
Dangerous Permission)。而在
manifest里申请后,可直接使用的权限为普通权限(
Normal Permissions)
需要使用运行时权限的条件:
设备运行的是 Android 6.0(API 级别 23),并且应用的
targetSdkVersion是 23 或更高版本,就会使用运行时权限规则
Normal Permissions :
android.permission.ACCESS_LOCATION_EXTRA_COMMANDS 允许应用程序访问额外的位置提供命令
android.permission.ACCESS_NETWORK_STATE 获取网络信息状态,如当前的网络连接是否有效
android.permission.ACCESS_NOTIFICATION_POLICY
android.permission.ACCESS_WIFI_STATE 允许程序访问Wi-Fi网络状态信息
android.permission.BLUETOOTH 允许程序连接到已配对的蓝牙设备
android.permission.BLUETOOTH_ADMIN 允许程序发现和配对蓝牙设备
android.permission.BROADCAST_STICKY 允许一个程序广播常用intents
android.permission.CHANGE_NETWORK_STATE 改变网络状态如是否能联网
android.permission.CHANGE_WIFI_MULTICAST_STATE 改变WiFi多播状态
android.permission.CHANGE_WIFI_STATE 允许程序改变Wi-Fi连接状态
android.permission.DISABLE_KEYGUARD 允许程序禁用键盘锁
android.permission.EXPAND_STATUS_BAR 允许一个程序扩展收缩在状态栏,Android开发网提示应该是一个类似Windows Mobile中的托盘程序
android.permission.GET_PACKAGE_SIZE 允许一个程序获取任何package占用空间容量
android.permission.INTERNET 访问网络连接,可能产生GPRS流量
android.permission.KILL_BACKGROUND_PROCESSES 允许程序调用killBackgroundProcesses(String).方法结束后台进程
android.permission.MODIFY_AUDIO_SETTINGS 修改声音设置信息
android.permission.NFC 允许程序执行NFC近距离通讯操作,用于移动支持
android.permission.READ_SYNC_SETTINGS 读取同步设置,读取Google在线同步设置
android.permission.READ_SYNC_STATS 读取同步状态,获得Google在线同步状态
android.permission.RECEIVE_BOOT_COMPLETED 允许程序开机自动运行
android.permission.REORDER_TASKS 允许程序改变Z轴排列任务
com.android.alarm.permission.SET_ALARM 设置闹铃提醒
android.permission.SET_TIME_ZONE 设置系统时区
android.permission.SET_WALLPAPER 允许程序设置壁纸
android.permission.SET_WALLPAPER_HINTS 允许程序设置壁纸hits
android.permission.VIBRATE 允许振动
android.permission.WAKE_LOCK 允许程序
4000
在手机屏幕关闭后后台进程仍然运行
android.permission.WRITE_SYNC_SETTINGS 允许程序写入同步设置
Dangerous Permission:
group:android.permission-group.CONTACTS
permission : android.permission.WRITE_CONTACTS 写入联系人,但不可读取
permission : android.permission.GET_ACCOUNTS 访问GMail账户列表
permission : android.permission.READ_CONTACTS 允许应用访问联系人通讯录信息
group:android.permission-group.PHONE
permission : android.permission.READ_CALL_LOG
permission : android.permission.READ_PHONE_STATE 访问电话状态
permission : android.permission.CALL_PHONE 允许一个程序初始化一个电话拨号不需通过拨号 用户界面需要用户确认
permission : android.permission.WRITE_CALL_LOG
permission : android.permission.USE_SIP 允许程序使用SIP视频服务
permission : android.permission.PROCESS_OUTGOING_CALLS 允许程序监视,修改或放弃播出电话
permission:com.android.voicemail.permission.ADD_VOICEMAIL
group:android.permission-group.CALENDAR
permission : android.permission.READ_CALENDAR 允许程序读取用户的日程信息
permission : android.permission.WRITE_CALENDAR 写入日程,但不可读取
group:android.permission-group.CAMERA
permission : android.permission.CAMERA 请求访问使用照相设备
group:android.permission-group.SENSORS
permission : android.permission.BODY_SENSORS
group:android.permission-group.LOCATION
permission : android.permission.ACCESS_FINE_LOCATION 通过GPS芯片接收卫星的定位信息,定位精度达10米以内
permission : android.permission.ACCESS_COARSE_LOCATION 通过WiFi或移动基站的方式获取用户错略的经纬度信息,定位精度大概误差在30~1500米
group:android.permission-group.STORAGE
permission : android.permission.READ_EXTERNAL_STORAGE
permission : android.permission.WRITE_EXTERNAL_STORAGE 允许程序写入外部存储,如SD卡上写文件
group:android.permission-group.MICROPHONE
permission : android.permission.RECORD_AUDIO 录制声音通过手机或耳机的麦克
group:android.permission-group.SMS
permission : android.permission.READ_SMS 允许程序读取短信息
permission : android.permission.RECEIVE_WAP_PUSH 接收WAP PUSH信息
permission : android.permission.RECEIVE_MMS 接收彩信
permission : android.permission.RECEIVE_SMS 接收短信
permission : android.permission.SEND_SMS 发送短信
总结:分组对权限机制的影响
如果app运行在android 6.0的机器上,如果你申请某个危险的权限,假设你的app早已被用户授权了同一组的某个危险权限,那么系统会立即授权,而不需要用户去点击授权。
demo:假如app对READ_CONTACTS已经授权了,当申请WRITE_CONTACTS权限时,系统会直接授权通过。
权限列表
Android 权限列表,可参照以下资料参考一,参考二,参考三
申请运行权限步骤:
在
AndroidManifest声明使用权限
<uses-permission android:name="android.permission.CALL_PHONE"/>
在使用时,判断是否为Android 6.0以上,返回false则不需要申请,返回true,则需要申请权限
private boolean isMarshmallow() { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M; }
检查权限
String permission = Manifest.permission.CALL_PHONE; if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) { //TODO 未授权 } else { //TODO 已授权 }
ContextCompat.checkSelfPermission,主要用于检测某个权限是否已经被授予,方法返回值为PackageManager.PERMISSION_DENIED或者PackageManager.PERMISSION_GRANTED(代表此权限已允许)。
申请权限
String permission = Manifest.permission.CALL_PHONE; int requestCode = 1; if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) { //申请授权 ActivityCompat.requestPermissions(this, new String[]{permission}, requestCode); } else { //直接执行操作 }
另外,在申请权限的时候,还需要注意一个函数:
if (ActivityCompat.shouldShowRequestPermissionRationale(this, permission)) { } else { ActivityCompat.requestPermissions(this, new String[]{permission}, requestCode); }
shouldShowRequestPermissionRationale:
如果应用之前请求过此权限但用户拒绝了请求,此方法将返回 true。
如果用户在过去拒绝了权限请求,并在权限请求系统对话框中选择了 Don’t ask again 选项,此方法将返回 false
处理权限申请回调
@Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { if (requestCode == this.requestCode) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 权限申请成功,执行操作 } else { // 权限申请失败 Toast.makeText(MainActivity.this, "您没有授权该权限,请在设置中打开授权", Toast.LENGTH_SHORT).show(); } return; } super.onRequestPermissionsResult(requestCode, permissions, grantResults); }
总结:网上也有很多已经封装好的关于申请权限的,可以参照以下网址内容
http://jcodecraeer.com/plus/list.php?tid=31&keyword=%C8%A8%CF%DE
相关文章推荐
- Android 6.0 运行时权限管理最佳实践
- Android 6.0 运行时权限管理最佳实践
- Android 6.0 运行时权限管理
- Android权限管理之Android 6.0运行时权限及解决办法
- Android权限管理之Android 6.0运行时权限及解决办法
- Android 6.0 运行时权限管理(转载)
- Android 6.0 运行时权限管理最佳实践
- Android 6.0 运行时权限管理最佳实践
- Android 6.0 运行时权限管理最佳实践
- Android 6.0 运行时权限管理最佳实践
- 详解Android权限管理之Android 6.0运行时权限及解决办法
- Android 6.0 运行时权限管理最佳实践
- Android 6.0 运行时权限管理最佳实践
- Android 6.0 运行时权限管理
- Android 6.0 运行时权限管理最佳实践
- Android权限管理之Android 6.0运行时权限及解决办法
- Android 6.0 运行时权限管理最佳实践
- 聊一聊Android 6.0的运行时权限
- Android 6.0 运行时权限封装
- 谈谈Android 6.0 的动态权限管理