Android运行时权限

本文详细介绍了Android 6.0及以上版本的运行时权限管理,包括原生API、EasyPermission库和PermissionsDispatcher框架的使用方法,以及针对小米手机的特殊适配。内容涵盖权限分类、检查、申请及回调处理,旨在帮助开发者更好地理解和处理Android运行时权限问题。
摘要由CSDN通过智能技术生成

Android运行时权限

简介:Android 6.0 以后,对于一些用户隐私权限总会在第一次提示用户是否授予权限。

优点:

  • 更好的保护了用户的隐私。
  • 给了程序向用户说明权限的作用。
  • 可以防止一些恶意程序盗取用户后者手机信息,增强了Android系统的安全性。

Android 6.0 将权限分为两类:

  • 普通权限:不需要单独申请,直接在Manifest里注册即可。
  • 危险权限&危险权限组:危险权限都是分组出现的,用户只要授权组内的一个权限,组内的其他权限就会立即授权。

危险权限列表:


申请方式一: 原生API

新增API:

  • ContextCompat.checkSelfPermission:检查危险权限&危险权限组是否授权。
  • ActivityCompat.requestPermissions:申请权限。
  • onRequestPermissionsResult:申请权限的回调(用户授权或拒绝授权)。
  • ActivityCompat.shouldShowRequestPermissionRationale:给用户解释,申请权限用户干什么。用户拒绝过权限后出现。

使用步骤:

  1. 在Manifest中添加需要的权限(不可省,因为要适配android 6.0 以下机型);
  2. 检查危险权限;
  3. 申请授权;
  4. 处理申请授权回调。

1.1 简单使用

示例:需要申请一个权限的功能(摄像头),需要申请多个(示例为2个:摄像头和手机状态)权限的功能。

public class PermissionActivity extends AppCompatActivity {

    private Context mContext = this;

    private final int PERMISSION_CAMERA = 100;//摄像头权限
    private final int PERMISSION_PHONE = 101;//摄像头和手机状态权限

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_permission);
        ButterKnife.bind(this);
    }


    @OnClick({R.id.per_btn_cc_cp, R.id.per_btn_cc_camera})
    public void onViewClicked(View view) {
        switch (view.getId()) {
            case R.id.per_btn_cc_camera:
                openCCCamera();//原生运行时权限--摄像头
                break;
            case R.id.per_btn_cc_cp:
                openCCCP();//原生运行时权限--摄像头和手机状态
                break;
            }
    }


    /** 原生申请权限--摄像头 */
    private void openCCCamera() {
        //2.检查权限
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
        != PackageManager.PERMISSION_GRANTED) {
            //进入到这里代表没有权限

            if (ActivityCompat.shouldShowRequestPermissionRationale(this,   Manifest.permission.CAMERA)) {
                //如果用户拒绝过该权限
                new AlertDialog.Builder(this).setTitle("权限提示")
                    .setMessage("之前拒绝授权,使用摄像头需要该权限")
                    .setPositiveButton("知道了", new   DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            ActivityCompat.requestPermissions((Activity) mContext, new String[]{Manifest.permission.CAMERA}, PERMISSION_CAMERA);
                        }
                    }).show();
            } else {
                //3. 申请权限
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, PERMISSION_CAMERA);
            }

        } else {
            Toast.makeText(this, "之前已经授权,现在可以使用摄像头了", Toast.LENGTH_SHORT).show();
        }

    }


    /** 原生申请权限--摄像头 和 手机状态 */
    private void openCCCP() {

        //2.检查权限
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)
        != PackageManager.PERMISSION_GRANTED ||
            ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
            != PackageManager.PERMISSION_GRANTED) {
            //3. 申请权限
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA, Manifest.permission.READ_PHONE_STATE}, PERMISSION_PHONE);
        } else {
            Toast.makeText(this, "之前已经授权,现在可以使用摄像头、读取手机状态了"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值