Android6.0新特性 运行时权限

在做项目时,遇到问题:进入过音乐应用之前,在文件管理器打开音频文件,弹出“Unfortunately,Music has Stopped.”
通过抓取分析log,定位到问题:

报错说明是程序没有获取访问存储的权限,这个权限应该是需要在Music应用中申请的,通过查看Music的Manefist文件,确认这个权限是申请了的。
后来通过分析,确认问题是Android6.0新特性:运行时权限申请。


运行时权限介绍
在Android6.0 以下(API<23)的系统上面安装程序时,在安装程序的时候就需要将一些权限赋予给app,导致app获取了一些不必要的权限。而在6.0上,app可以直接安装,当app申请一些不必要的权限时,我们可以拒绝他们的流氓行为(比如,单机游戏申请联网权限)。也可以在设置界面进行授权管理。新的权限机制更好的保护了用户的隐私,Google将权限分为两类,一类是Normal Permissions,这类权限一般不涉及用户隐私,是不需要用户进行授权的,比如手机震动、访问网络等;另一类是Dangerous Permission,一般是涉及到用户隐私的,需要用户进行授权,比如身体传感器、日历、摄像头、通讯录、地理位置、麦克风、电话、短信、存储空间等。

运行时权限使用
Android6.0 的运行时权限处理,除了需要在AndroidManefist.xml文件中声明权限,还需要在java代码中申请权限,比如我们Music播放时,需要访问存储的权限。
@Step1, 首先需要在AndroidManefist.xml添加声明语句。

@Step2, 然后在AudioPreviewStarter.java代码中,动态申请权限。
@Step2.1, 首先在onCreate()函数中添加判断,当前是否已经申请成功存储权限。
@Step2.2, 如果申请成功,则直接执行音乐播放函数processDrm(),如果没有申请成功,则执行requestMusciPermissions(),进行权限申请。
@Step2.3, requestMusciPermissions()函数执行之后,会自动回调onRequestPermissionsResult(),在这个函数里面,会弹窗让用户选择,是否同意访问存储权限,如果申请成功,则执行音乐播放函数,如果用户拒绝,则弹Toast将拒绝的结果反馈给用户。



需要注意的几点:
1、一旦用户同意了某项权限(访问存储),那么系统会记录用户的选择,下次进入app时,不再向用户索要当前app的访问存储权限,直接赋予其权限。
2、如果在java代码中动态申请的权限,没有在AndroidManefist.xml中没有声明,程序会报错。

同时,我们可以修改framework层的代码,直接对app进行授权,比如Music访问存储的权限,可以在/*frameworks/base/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java*/下,直接对Music授权,在synchronized (mService.mPackages)函数里面,添加:

这是流氓行为,但是也可以解决访问权限的问题。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值