android6.0:动态权限申请

作者: Liuuuuuuzi | 来源:发表于2016-11-29 16:46 被阅读1909次

    前言

    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 的权限动态申请,虽然对于开发者来说,比较麻烦,但从用户角度来看,还是相当好的。

    相关文章

      网友评论

        本文标题:android6.0:动态权限申请

        本文链接:https://www.haomeiwen.com/subject/cemipttx.html