Android危险权限的动态申请,6.0和8.0的区别

一、Android6.0系统运行时权限

Android 6.0版本(Api 23)将权限分为普通权限和危险权限,危险权限需要在使用时让用户手动允许。

  • 对于普通权限,只需要在manifest.xml文件中声明,即可以代码中直接使用。
  • 对于危险,不仅仅需要在manifest.xml文件中声明,还需要在java代码调用requestPermissions来动态申请。注意如果不在manifest中声明,而是直接requestPermissions申请同样会抛出运行时异常。

危险权限一共9组24个权限,表格如下:

权限组名权限名
CALENDARREAD_CALENDAR,WRITE_CALENDAR
CAMERACAMERA
CONTACTSREAD_CONTACTS,WRITE_CONTACTS,GET_ACCOUNTS
LOCATIONACCESS_FINE_LOCATION,ACCESS_COARSE_LOCATION
MICROPHONERECORD_AUDIO
PHONEREAD_PHONE_STATE,CALL_PHONE, READ_CALL_LOG,WRITE_CALL_LOG,ADD_VOICEMAIL,USE_SIP,PROCESS_OUTGOING_CALLS
SENSORSBODY_SENSORS
SMSSEND_SMS,RECEIVE_SMS,READ_SMS,RECEIVE_WAP_PUSH,RECEIVE_MMS
STORAGEREAD_EXTERNAL_STORAGE,WRITE_EXTERNAL_STORAGE


二、Android8.0系统运行时权限行为变更

        Android 8.0 之前,如果应用在运行时请求权限并且被授予该权限,系统会错误地将属于同一权限组并且在清单中注册的其他权限也一起授予应用。
        对于针对 Android 8.0 的应用,此行为已被纠正。系统只会授予应用明确请求的权限。然而,一旦用户为应用授予某个权限,则所有后续对该权限组中权限的请求都将被自动批准。

例如,假设某个应用在其清单中列出 READ_EXTERNAL_STORAGE 和WRITE_EXTERNAL_STORAGE。应用请求 READ_EXTERNAL_STORAGE,并且用户授予了该权限。如果该应用针对的是 API 级别 24 或更低级别,系统还会同时授予 WRITE_EXTERNAL_STORAGE,因为该权限也属于同一 STORAGE 权限组并且也在清单中注册过。如果该应用针对的是 Android 8.0,则系统此时仅会授予 READ_EXTERNAL_STORAGE;不过,如果该应用后来又请求 WRITE_EXTERNAL_STORAGE,则系统会立即授予该权限,而不会提示用户。

注意:

  • 在6.0-7.1的系统中,如果之前申请过READ_EXTERNAL_STORAGE并且通过申请,则后续的的java代码可以直接使用同一组内的其它权限,比如WRITE_EXTERNAL_STORAGE权限,而不需要再调用requestPermissions(WRITE_EXTERNAL_STORAGE);如果之前的申请没有通过,则后续使用同一组的其它权限时仍然需要申请

  • 在8.0及后续系统中,如果应用之前申请过READ_EXTERNAL_STORAGE并且通过申请,则后续的的java代码在使用同一组内的其它权限如WRITE_EXTERNAL_STORAGE之前,必须调用requestPermissions(WRITE_EXTERNAL_STORAGE),而此次调用系统将会立即回调onPermissionResult(),而不会弹出权限申请框。但如果不调用的话,将会崩溃。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值