Android 6.0运行时权限管理
来源:互联网 发布:4g网络优化工程师分期 编辑:程序博客网 时间:2024/06/07 19:32
运行时权限管理 定义:
之前我们的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 允许程序在手机屏幕关闭后后台进程仍然运行
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 6.0 运行时权限管理(转载)
- Android 6.0 运行时权限管理最佳实践
- Android 6.0 运行时权限管理最佳实践
- Android 6.0 运行时权限管理最佳实践
- Android 6.0 运行时权限管理最佳实践
- Android 6.0 运行时权限管理最佳实践
- Android 6.0 运行时权限管理最佳实践
- Android 6.0 运行时权限管理最佳实践 (详解)
- Android 6.0 运行时权限管理最佳实践
- Android 6.0 运行时权限管理最佳实践
- Android M 运行时权限管理
- android运行时权限的管理
- Android权限管理之Android 6.0运行时权限及解决办法
- Android权限管理之Android 6.0运行时权限及解决办法
- 运行时权限管理
- VBA相关知识点
- Java,Android String 占位符
- 文件中转站
- [LintCode]532.逆序对
- linux系统编程之进程(八):守护进程详解及创建,daemon()使用
- Android 6.0运行时权限管理
- 【kong系列二】之 kong安装
- SASS 笔记
- zcmu--1570: Palindromic Numbers
- 滑动窗口的大小
- 快速幂模版
- 线段树
- Xshell怎样才能实现快速粘贴复制
- 2017-08-18学习随笔之java