说来也巧了,今天碰到了一个特别奇怪的问题。上午写了一个小demo其中有一个功能是获取通讯的,大家肯定知道这时候肯定要添加一个权限:
<!-- 读联系人权限 -->
<uses-permission android:name="android.permission.READ_CONTACTS" />
添加完后就开始运行了,竟然报错了,
Caused by: java.lang.SecurityException: Permission Denial: opening provider com.android.providers.contacts.ContactsProvider2
from ProcessRecord{7ed1706 32137:com.fighting.together.oomtest/u0a166} (pid=32137, uid=10166) requires android.permission.READ_CONTACTS
or android.permission.WRITE_CONTACTS
这种获取联系人简单的东西,以前不知道做了多少遍,而且权限的申明确实已经在manifest里面,但是还是报了这种错误,真是让我很尴尬啊~
之后就开始找问题,这种奇怪的问题百度肯定是不会有结果的,我就开始想想这个项目是哪里和以前不一样了。没错,昨天刚更新了Android Studio,更新到了2.0版本了;然后!!重点来了,在build.gradle中的一个属性他也帮我改了:
targetSdkVersion 23
没错,之前都是22的,现在变成了API23,后来查阅发现,google在API23以及之后的版本对危险权限的申请要求变的很严格了,需要多一步操作了,下文会详解。
但是你以为仅仅是这个原因导致的crash吗??no!还有一个非常重要的原因是因为我是真机调试,并且我用的nexus6,并且在前段时间刚刚通过OTA升级到了Android6.0的系统。也就说如果你的手机或者模拟器的版本是android6.0的系统,才会导致这个错误;
总结一下,如果你同时满足这三个条件你就会出现上述的crash:
1.targetSdkVersion设置为23或者更高
2.手机的操作系统为6.0或者以上
3.请求的是google定义的dangerous permissions
OK,现在是重点了,我们来分析下为什么会出现这种情况,有兴趣的同学可以去阅读google的文档