android6.0:动态权限申请

前言

Android 6.0 虽然相对于上一个版本 更新幅度较小,但也带来了一写全新的特性,这里就主要谈一谈 android 6.0--权限管理,开发过程中,就需要开发者去动态的权限申请。

动态权限申请

Google从一开始就把权限分为两类,一种是不涉及用户隐私的权限:Normal Permission (普通权限),不需要用户去主动授权,在AndroidManifest.xml文件中声明即可,另一种就是需要用户授权才能使用的权限:Dangerous Permission(高危权限),同样需要在AndroidManifest.xml中声明。

何时需要动态权限申请

targetSdkVersion >=23 ,只有当我们把targetSdkVersion设置为大于等于23的时候,才会需要主动的申请权限,如果不想启用该方式,只要把targetSdkVersion 设置为 22或更小版本即可。

有哪些权限需要动态申请
group:android.permission-group.CONTACTS
  permission:android.permission.WRITE_CONTACTS
  permission:android.permission.GET_ACCOUNTS
  permission:android.permission.READ_CONTACTS

group:android.permission-group.PHONE
  permission:android.permission.READ_CALL_LOG
  permission:android.permission.READ_PHONE_STATE
  permission:android.permission.CALL_PHONE
  permission:android.permission.WRITE_CALL_LOG
  permission:android.permission.USE_SIP
  permission:android.permission.PROCESS_OUTGOING_CALLS
  permission:com.android.voicemail.permission.ADD_VOICEMAIL

group:android.permission-group.CALENDAR
  permission:android.permission.READ_CALENDAR
  permission:android.permission.WRITE_CALENDAR

group:android.permission-group.CAMERA
  permission:android.permission.CAMERA

group:android.permission-group.SENSORS
  permission:android.permission.BODY_SENSORS

group:android.permission-group.LOCATION
  permission:android.permission.ACCESS_FINE_LOCATION
  permission:android.permission.ACCESS_COARSE_LOCATION

group:android.permission-group.STORAGE
  permission:android.permission.READ_EXTERNAL_STORAGE
  permission:android.permission.WRITE_EXTERNAL_STORAGE

group:android.permission-group.MICROPHONE
  permission:android.permission.RECORD_AUDIO

group:android.permission-group.SMS
  permission:android.permission.READ_SMS
  permission:android.permission.RECEIVE_WAP_PUSH
  permission:android.permission.RECEIVE_MMS
  permission:android.permission.RECEIVE_SMS
  permission:android.permission.SEND_SMS
  permission:android.permission.READ_CELL_BROADCASTS

以上就是需要主动申请的权限了也是前面提到的 Dangerous Permission(高危权限),可以发现以上权限是一组一组出现的,android提供了这样的分组,当该组中任意一个权限授权成功,默认整组权限获得授权。当然,在开发过程中,最好还是只对用到的权限做申请,毕竟后面的版本权限组也是会发生改变的。

申请流程

谷歌提供的官方demo
https://github.com/googlesamples/android-RuntimePermissions

这里我总结了一下流程:
  1. 在AndroidManifest文件中添加需要的权限。这个步骤和我们之前的开发并没有什么变化,试图去申请一个没有声明的权限可能会导致程序崩溃。

  2. 检查权限是否已授权,如果已经授权,则直接进行想要的操作即可。

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
                != PackageManager.PERMISSION_GRANTED) {
        //未授权,提起权限申请
        } else {
        //权限已授权,功能操作
        }

这里用到了一个方法,ActivityCompat.checkSelfPermission,用于判断app是否已经对某个权限授权,该方法只有两个返回值

PackageManager.PERMISSION_DENIED //表示尚未授权
PackageManager.PERMISSION_GRANTED //表示已授权
  1. 如果尚未授权,这里根据demo的流程 用到了
    ActivityCompat.shouldShowRequestPermissionRationale 方法检查,用户是否曾经拒绝过授权,如果拒绝过,则开发者可以自定义内容去提醒用户该权限的用途,引导用户授权。
if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                Manifest.permission.CAMERA)) {
          //用于开发者提示用户权限的用途
        } else {
        //申请权限
        }
  1. 如果是首次,则发起申请。
 ActivityCompat.requestPermissions(MainActivity.this,
                                    new String[]{Manifest.permission.CAMERA},
                                    REQUEST_CAMERA);

ActivityCompat.requestPermissions,权限申请,这里出入的权限是一个数组集合,可以同时申请多个权限。

  1. 权限申请的回调处理。
    首先需要实现接口ActivityCompat.OnRequestPermissionsResultCallback,注意一点,该接口必须由 Activity 或者其子类来实现,如果该实现类是FragmentActivity 的子类则不需要再去实现,因为FragmentActivity已经实现了该接口,接下来重写回调方法onRequestPermissionsResult。
@Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
            @NonNull int[] grantResults) {
        //判断请求码,确定当前申请的权限
        if (requestCode == REQUEST_CAMERA) {
            //判断权限是否申请通过
            if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                //授权成功
            } else {
                //授权失败
            }
        } else {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }

回调方法的返回结果:

  • requestCode :请求码,在提交申请权限时,传入的请求码一致。
  • permissions:申请的权限数组。
  • grantResults:权限申请结果,与permissions 一一对用,表示各个权限的授权情况。

总结

关于android 6.0 的权限动态申请,虽然对于开发者来说,比较麻烦,但从用户角度来看,还是相当好的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容