Android 6.0 Permission - litonghui/TechBlog GitHub Wiki
Android系统的安全问题开始被Google小组同学所注意,特别是新发布的Android6.0,也称棉花糖,权限问题被重新定义,如果在使用响应的权限时候,会弹框询问,如下:

图一
#####图二
弹窗分为两种情况,分别为初次弹框和再次弹框(出现永久消失提示),当用户点击不再询问后,获取该权限的系统弹窗就不再提示了。下面仔细说明一下权限影响,获取,注意问题:
###1, 权限影响: 背景:在Android 6.0之前,用户在安装软件时会一次获取所用权限,使用某一功能时候直接使用(ps:如果是小米,华为机可能会提示需要调用某一功能,提示用户是否授权),这样对开发者很方便,但是对用户的隐私造成伤害。所以Google小组开始对权限作出调整。 影响:开发者可能会郁闷,如果以前发布的软件在6.0上运行,是不是就crash那?Google小组同学针对这种问题作出的处理是,在_targetSdkVersion 小于23是,安装时默认获取了Android manifest权限声明的权限,这是不是意味着就不会crash了,哈哈,那是你没遇到敏感的用户,他如果在设置-应用-某个应用打开它的权限设置,取消授权,那可能就真真sb了,因为未获取授权,返回的对象结果是null或者0_,不做处理使用会直接crash。建议开发者针对权限问题作出适配,在调用使用先做判断,未授权就拒绝操作。 ###2, 获取权限 Android api 23 上提供了三个方法: #####(1),询问是否已授权checkSelfPermission(); public abstract int checkSelfPermission(@NonNull String permission); #####(2),检测是否有勾选不再提示 public boolean shouldShowRequestPermissionRationale(@NonNull String permission) #####(3),授权结果回调 public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) ####关于兼容性问题: 权限授予是在api 23以及以后,方法调用需要作出判断: #####1, 方案一: If(Build.VERSION.SDK_INT>=23){} else{} #####2, 方案二: 使用兼容v4包,包含了如下方法: ContextCompat.checkSelfPermission() 返回PERMISSION_GRANTED,否则返回PERMISSION_DENIED ActivityCompat.requestPermissions() 方法在M之前版本调用,OnRequestPermissionsResultCallback 直接被调用,带着正确的 PERMISSION_GRANTED或者 PERMISSION_DENIED 。 ActivityCompat.shouldShowRequestPermissionRationale() 在M之前版本调用,永远返回false。 ###3, 代码演示:Permission ###4, 建议 #####1, 如果软件运行,被撤销权限,会造成crash,及时做好权限兼容问题 #####2, 在为适配权限之前targetSdkVersion 不要设置为23 #####3, 设计方案,MainActivity extend CheckPermissionsActivity extend BaseActivity在 CheckPermissionsActivity onResum()检查权限