新版微信在android 6.0上也实现了运行时请求权限。新版微信安装在4.0的机器上时的安装提示界面和6.0上的界面是完全不同。详情请看本文底部。

运行时权限的申请

第一.判断系统版本

Build.VERSION.SDK_INT >= Build.VERSION_CODES.M

第二.如果是android6.0以上的系统,则检查是否获取授权

int permissionAllow = ContextCompat.checkSelfPermission(this,        Manifest.permission.WRITE_CALENDAR);

如果返回值为PackageManager.PERMISSION_GRANTED,则可以继续之后的操作,如果返回值为PERMISSION_DENIED,则代表没有授权该权限。

第三.shouldShowRequestPermissionRationale()可以得到是否需要弹出一个解释申请该权限的提示给用户

如果为true,则可以弹。

第四.请求该权限

示例如下:

if (ContextCompat.checkSelfPermission(this,                Manifest.permission.READ_CONTACTS)        != PackageManager.PERMISSION_GRANTED) {    if (ActivityCompat.shouldShowRequestPermissionRationale(this,            Manifest.permission.READ_CONTACTS)) {        // 向用户显示解释 * 异步 * — — 不阻止        //此线程等待用户的响应 !之后的用户        //看到的解释,再试一次请求的权限。    } else {        // 请求选线弹出系统的权限允许窗口        ActivityCompat.requestPermissions(this,                new String[]{Manifest.permission.READ_CONTACTS},                MY_PERMISSIONS_REQUEST_READ_CONTACTS);    }} else {    执行获取权限后的操作}

第五.请求权限之后

在onRequestPermissionsResult()返回值中可以得到用户是否授权,如果授权,就可以操作该运行时权限对应的方法

@Overridepublic 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;        }    }}

运行时权限的特点是,实时性,用户可以随时取消授权,所以每次调用运行时权限的方法都需要判断或者请求一次运行时权限。

在执行运行时权限申请的同时想一下是否真的有必要,想一下使用Intent的方式启动其他应用是否可以达到需求,比如ACTION_IMAGE_CAPTURE,是直接申明CAMERA的权限自己做一个照相机还是发送ACTION_IMAGE_CAPTURE请求让别的应用处理并在onActivityResult()返回值更方便

如果设备运行在5.1或者以下的设备,或者targetSdkVersion在22或以下,系统会在安装app的时候让用户授权权限。

重要的事情,需要再说一遍,系统只会提示用户app需要的权限组,而不会提示某一个特定的权限。如图:

而更改tagetversion 为23之后在android 6.0的机器上会发生如下效果:

这种安装界面的时候如果app没有在运行时去跟手机申请权限的话,可能会的导致崩溃。

PS:本文已经明确说明是android 6.0,当然很多人在低于6.0的机器版本上也遇到这种情况,大多是国产机,不要追问我低版本那个权限怎么处理,这种定制rom做的傻逼事情,我管不了。

另外我要吐槽CSDN这么大的平台,我的chromium浏览器无法使用CSDN的markdown编辑器。 你特么在逗我linux用户。

更多相关文章

  1. Android(安卓)Manifest内容解析
  2. Android系统下的动态Dex加载
  3. Android(安卓)Studio使用smack进行ejabberd创建用户
  4. Android四大组件 - Activity的生命周期和启动模式
  5. Android(安卓)BLE程序在Android(安卓)10手机搜不到设备问题分析
  6. Android入门进阶教程(1)-android扫盲
  7. Android系统深度游
  8. AndroidO audio系统之框架简介(一)
  9. android下root权限的获取

随机推荐

  1. 人体运维:人和机器没什么区别
  2. mall-tiny:基于SpringBoot+MyBatis的单应
  3. HTTP就是这么简单(修订版)
  4. Hystrix Dashboard:断路器执行监控
  5. 带你搭一个SpringBoot+SpringData JPA的D
  6. Spring Cloud Consul:服务治理与配置中心
  7. IDEA中创建和启动SpringBoot应用的正确姿
  8. 使用Logic App进行Azure安全中心工作流自
  9. Spring Cloud OpenFeign:基于 Ribbon 和 H
  10. Python查询迪斯尼\环球公园\海洋世界的