Android6.0动态权限申请

最近在android手机打开UC浏览器时,经常冒出是否允许XX权限:android 6.0之前没有看到这种权限管理,本文就研究下下android最新的权限管理。

1.概述

官方API:
https://developer.android.com/training/permissions/requesting.html
官方示例:
https://github.com/googlesamples/android-RuntimePermissions

在android6.0版本后(API:23),当APP运行时,用户授予权限,而不再像旧版本中在安装时给予所有请求权限。这种方法简化了APP的安装过程,因为它们不需要在安装或更新时授予权限。这也给用户更多的控制APP。

系统权限分为两个权限类别,普通权限(normal)和敏感权限(dangerous):
(1)普通权限不直接对用的隐私有风险。如果你在manifest中列出普通权限,系统将自动授予这些权限。
(2)敏感权限可以给app进入用户的私密数据。如果你列出敏感权限在manifest
中,用户必须明确的给予授权同意。

敏感权限权限总共9组,每组只要有一个权限申请成功,则默认整组权限可以使用:

(1)group:android.permission-group.CALENDAR(日历权限)

permission:android.permission.READ_CALENDAR
permission:android.permission.WRITE_CALENDAR

(2) group:android.permission-group.CAMERA(相机权限)

permission:android.permission.CAMERA

(3) group:android.permission-group.CONTACTS(联系人权限)

permission:android.permission.WRITE_CONTACTS
permission:android.permission.GET_ACCOUNTS    
permission:android.permission.READ_CONTACTS

(4) 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

(5) group:android.permission-group.SENSORS(传感器权限)

permission:android.permission.BODY_SENSORS

(6)group:android.permission-group.LOCATION(位置权限)

permission:android.permission.ACCESS_FINE_LOCATION
permission:android.permission.ACCESS_COARSE_LOCATION

(7)group:android.permission-group.STORAGE(存储权限)

permission:android.permission.READ_EXTERNAL_STORAGE
permission:android.permission.WRITE_EXTERNAL_STORAGE

(8) group:android.permission-group.MICROPHONE(麦克风权限)

permission:android.permission.RECORD_AUDIO

(9) 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

普通权限在AndroidManifest.xml中列出就可以,普通具体查看:
官方链接

2.实战

(1)首先对android版本进行判断

public void showCamera(View view) {
       //首先判断android版本
       if (Build.VERSION.SDK_INT >= 23) {
        // 检查相机权限是否已经获取
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
                != PackageManager.PERMISSION_GRANTED) {
            // 相机权限没有被授权,请求权限
            requestCameraPermission();
        } else {
            // 相机权限已经授权直接使用
            showCameraPreview();
        }
    }
    }

(2)请求相机权限

 private void requestCameraPermission() {
        if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                Manifest.permission.CAMERA)) {
            Snackbar.make(mLayout, R.string.permission_camera_rationale,
                    Snackbar.LENGTH_INDEFINITE)
                    .setAction(R.string.ok, new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            ActivityCompat.requestPermissions(MainActivity.this,
                                    new String[]{Manifest.permission.CAMERA},
                                    REQUEST_CAMERA);
                        }
                    })
                    .show();
        } else {

            // 相机权限没有授权,请求回调
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA},
                    REQUEST_CAMERA);
        }
        // END_INCLUDE(camera_permission_request)
    }

(3)拒绝权限后请求回调函数onRequestPermissionsResult

 @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {
            case REQUEST_CODE_ASK_CALL_PHONE:
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // Permission Granted
                    callDirectly(mobile);
                } else {
                    // Permission Denied
                    Toast.makeText(MainActivity.this, "CALL_PHONE Denied", Toast.LENGTH_SHORT)
                            .show();
                }
                break;
            default:
                super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }

这里会对提供了一个对用户点击做判断的入口,开发者可以根据 grantResults[0] 的类型,来判断用户点击的是允许还是拒绝,接着就可以执行相应的逻辑了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值