Android 6.0之后敏感权限默认是关闭的,必须显式的去请求这个权限。而在6.0之前,只要你在manifest里面声明过所需要的权限,安装之后默认是开启的,下面我们来分析一下遇到的问题。
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
项目中需要写系统设置的权限,该权限可以设置音量,调节明暗,测试手机系统是Android 6.0的,当在gradle中设置targetsdkversion版本为22时,安装默认这个权限是开启的,设置为23(Android 6.0)时,这个权限则是关闭的,这是为什么呢?
首先,我们要分析一下gradle配置中的
targetSdkVersion这个配置
。
Android开发的应该都见过
compileSdkVersion、minSdkVersion 以及 targetSdkVersion。compileSdkVersion和minSdkVersion比较好理解,前者表示编译的SDK版本,后者是最低适配的SDK版本。对于targetSdkVersion,字面的意思是目标SDK版本,但是它不仅仅是目标SDK字面意思这么简单。很难一句话说清楚。原文中用了『interesting』这个单词来描述targetSdkVersion。原文中是这样讲的:targetSdkVersion is the main way Android provides forward compatibility。意思是targetSdkVersion 是 Android 系统提供向前兼容的主要手段。随着 Android 系统的升级,某个系统的 API 或者模块的行为可能会发生改变,但是,只要 APK 的 targetSdkVersion 不变,即使这个 APK 安装在新 Android 系统上,其行为还是保持老的系统上的行为,这样就保证了系统对老应用的向前兼容性。
所以targetSdkVersion设置要慎之又慎,在你没有完全了解新版本特性的情况下,设置为新版本兼容将会给你造成莫名其妙的错误。
以下权限只要targetSdkVersion 设置低于23,在AndroidManifest.xml中声明即可使用:
android.permission.ACCESS_LOCATION_EXTRA_COMMANDS
android.permission.ACCESS_NETWORK_STATE
android.permission.ACCESS_NOTIFICATION_POLICY
android.permission.ACCESS_WIFI_STATE
android.permission.ACCESS_WIMAX_STATE
android.permission.BLUETOOTH
android.permission.