andoridM

android每次更新真是让程序员又爱又恨啊

解决6.0权限应该是Android的基础知识了

方法1

修改target版本号

这种方法适用于爱偷懒的同学和和部分不重要的项目建议还是使用官方的

1
2
3
4
5
6
defaultConfig {
...
//修改至23(android6.0)之前的版本号
targetSdkVersion 22
...
}

这样应用的目标 SDK 为 22 或更低,就不会需要在运行时请求权限了

方法2

google大哥说了算的官方解决办法,推荐

  1. 危险权限
权限组 权限
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
  1. 检查权限

    1
    2
    3
    4
    5
    6
    7
    8
    //在需要权限的activity下
    int checkSelfPermission = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS);
    if (checkSelfPermission == PackageManager.PERMISSION_GRANTED) {
    //已经获得了权限,可以进行操作
    }
    if (checkSelfPermission == PackageManager.PERMISSION_DENIED) {
    //不具有权限,应该申请权限
    }
  2. 请求权限

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    // 需要权限的activity
    if (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);
    }
    }
  3. 处理权限请求响应

    当用户响应时,系统将调用应用的 onRequestPermissionsResult() 方法

    注意权限都是按组分类的,申请和获取也是一组的(对于用户来说)

    例如,假设您在应用清单中列出了 READ_CONTACTSWRITE_CONTACTS。如果您请求 READ_CONTACTS 且用户授予了此权限,那么,当您请求 WRITE_CONTACTS 时,系统将立即授予您该权限,不会与用户交互。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    @Override
    public 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;
    }
    //其它权限的情况....
    }
    }

    结语

    其实权限的申请和处理很简单,但是流程太长了,个人觉得有必要封装一下.

    封装好的代码:

    https://github.com/songsongtao/study_code