Letv+Android 6.0+Exception: Neither user 10120 nor current process has android.permission.READ_PHONE_STATE
场景:
线上日志出现crash信息,仅涉及单台设备Letv+Android 6.0
出错日志信息为
Fatal Exception: java.lang.SecurityException: getImei: Neither user 10120 nor current process has android.permission.READ_PHONE_STATE. at android.os.Parcel.readException(Parcel.java:1620) at android.os.Parcel.readException(Parcel.java:1573)
RD排查问题,了解情况,学习
排查相关:
1. 根据报错日志,明确和权限相关,堆栈日志定位到代码中调用 getImei
自android 6.0(sdk 23)起, 运行时权限变更,详见:Android 6.0变更
简单来说可以理解为有2个变化:
1.权限申请时机从安装时变为运行时;
2.权限申请由原来捆绑式一站式处理,变成可支持单个权限的控制
READ_PHONE_STATE属于危险权限,危险权限涵盖应用需要涉及用户隐私信息的数据或资源,或者可能对用户存储的数据或其他应用的操作产生影响的区域。例如,能够读取用户的联系人属于危险权限。如果应用声明其需要危险权限,则用户必须明确向应用授予该权限。
参考:http://www.jianshu.com/p/a37f4827079a
https://developer.android.com/guide/topics/security/permissions.html?hl=zh-cn#normal-dangerous
但是,应用内设置如下:
minSdkVersion=14
targetSdkVersion=18
targetSdkVersion < 23, 在Android 6.0 +系统上应启用兼容性行为,不启用新特性,仍在安装时统一申请权限。
2. 仅涉及单台设备,其他机型6.0+系统未出现
Android 6.0 提供了管理界面让用户可取消某项特殊权限(参考:聊一聊Android6.0运行时权限)
不同的手机厂商都在原生Android系统上做了一层封装,兼容性行为的实际处理各有区别,这也是各种兼容性问题出现的原因。(参考:what is a custom rom)
处理:加固代码,try-catch