android每次更新真是让程序员又爱又恨啊
解决6.0权限应该是Android的基础知识了
方法1
修改target版本号
这种方法适用于爱偷懒的同学和和部分不重要的项目建议还是使用官方的
|
|
这样应用的目标 SDK 为 22 或更低,就不会需要在运行时请求权限了
方法2
google大哥说了算的官方解决办法,推荐
- 危险权限
权限组 | 权限 |
---|---|
CALENDAR | READ_CALENDAR, WRITE_CALENDAR |
CAMERA | CAMERA |
CONTACTS | READ_CONTACTS, WRITE_CONTACTS, GET_ACCOUNTS |
LOCATION | ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION |
MICROPHONE | RECORD_AUDIO |
PHONE | READ_PHONE_STATE, CALL_PHONE, READ_CALL_LOG, WRITE_CALL_LOG, ADD_VOICEMAIL, USE_SIP, PROCESS_OUTGOING_CALLS |
SENSORS | BODY_SENSORS |
SMS | SEND_SMS, RECEIVE_SMS, READ_SMS, RECEIVE_WAP_PUSH, RECEIVE_MMS |
STORAGE | READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE |
检查权限
12345678//在需要权限的activity下int checkSelfPermission = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS);if (checkSelfPermission == PackageManager.PERMISSION_GRANTED) {//已经获得了权限,可以进行操作}if (checkSelfPermission == PackageManager.PERMISSION_DENIED) {//不具有权限,应该申请权限}请求权限
123456789101112131415161718192021// 需要权限的activityif (ContextCompat.checkSelfPermission(thisActivity,Manifest.permission.READ_CONTACTS)!= PackageManager.PERMISSION_GRANTED) {// 解释为什么需要权限if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,Manifest.permission.READ_CONTACTS)) {//如果应用之前请求过此权限但用户拒绝了请求,此方法将返回 true。//如果用户在过去拒绝了权限请求,并在权限请求系统对话框中选择了 Don't ask again 选项,此 方法将返回 false//如果设备规范禁止应用具有该权限,此方法也会返回 false。} else {//不需要解析开始申请权限//系统将向用户显示一个标准对话框。您的应用无法配置或更改此对话框。ActivityCompat.requestPermissions(thisActivity,new String[]{Manifest.permission.READ_CONTACTS},MY_PERMISSIONS_REQUEST_READ_CONTACTS);}}处理权限请求响应
当用户响应时,系统将调用应用的
onRequestPermissionsResult()
方法注意权限都是按组分类的,申请和获取也是一组的(对于用户来说)
例如,假设您在应用清单中列出了
READ_CONTACTS
和WRITE_CONTACTS
。如果您请求READ_CONTACTS
且用户授予了此权限,那么,当您请求WRITE_CONTACTS
时,系统将立即授予您该权限,不会与用户交互。123456789101112131415161718192021public void onRequestPermissionsResult(int requestCode,String permissions[], int[] grantResults) {switch (requestCode) {case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {// 如果数组为空,说明请求被取消if (grantResults.length > 0&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {//获取权限成功,可以进行相应操作} else {//取消被取消或拒绝,无法进行操作//可以进行提示}return;}//其它权限的情况....}}结语
其实权限的申请和处理很简单,但是流程太长了,个人觉得有必要封装一下.
封装好的代码: