美文网首页
Android动态申请权限

Android动态申请权限

作者: 书虫大王X | 来源:发表于2021-02-08 11:57 被阅读0次

1、在Android 6.0之后,APP获取手机的权限不再仅仅只是在清单文件中声明就行了,它将手机的权限分为了两类:正常权限和危险权限:

  • 正常权限:不会直接给用户隐私权带来风险。在清单文件中声明就能获取的权限。
  • 危险权限:会授予应用访问用户机密数据的权限。在清单文件中声明危险权限,还需要在在代码中动态申请权限,让用户自己选择是否允许APP拥有该权限。

2、动态申请权限涉及到的方法:

  • ContextCompat.checkSelfPermission方法:
    检查应用是否具有某个危险权限。如果应用具有此权限,方法将返回 PackageManager.PERMISSION_GRANTED,并且应用可以继续操作。如果应用不具有此权限,方法将返回 PackageManager.PERMISSION_DENIED,且应用必须明确向用户要求权限。
  • ActivityCompat.shouldShowRequestPermissionRationale方法:
    在上一个方法判断用户没有权限后,调用此方法。如果应用之前请求过此权限但用户拒绝了请求,此方法将返回 true。如果用户在过去拒绝了权限请求,并在权限请求系统对话框中选择了 Don't ask again 选项,此方法将返回 false。如果设备规范禁止应用具有该权限,此方法也会返回 false。
  • ActivityCompat.requestPermissions方法:
    这个方法动态申请权限,调用后会弹出一个对话框提示用户授权所申请的权限。
  • onRequestPermissionsResult
    当应用请求权限时,系统将向用户显示一个对话框。当用户响应时,系统将调用应用的 onRequestPermissionsResult() 方法,向其传递用户响应,处理对应的场景。

3、例子:申请获取用户位置信息(危险权限)

第一步:在清单文件中申请权限
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

第二步:在代码中动态申请权限
//   java写法:
    private void requestPermission() {
        if (ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED) {
            Log.i(TAG,"用户没用此权限");
            if (ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.ACCESS_FINE_LOCATION)) {
                Log.i(TAG,"用户申请过权限,但是被拒绝了(不是彻底决绝)");
//               申请权限
                ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION},1);

            } else {
                Log.i(TAG,"申请过权限,但是被用户彻底决绝了或是手机不允许有此权限(依然可以在此再申请权限)");
                ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION},1);

            }
        }
    }
//   kotlin写法:
    private fun requestPermission() {
        if (ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            Log.i("yk", "没有权限,去申请")
            if (ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.ACCESS_FINE_LOCATION)) {
//               申请权限
                ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),1)

            } else {
//              申请过权限,但是用户彻底决绝了或是手机不允许拥有此权限,执行相应的操作:
                ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),1)
            }
        }
    }

//  第三步:根据用户的选项做出相应
    @Override
    public 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) {
                    Log.i(TAG,"用户授予了权限");
                    // 执行相应的操作:

                } else {
                    Log.i(TAG,"用户没有给予权限");
                    showWaringDialog();
                }
                return;
            }
        }
    }

    private void showWaringDialog() {
        AlertDialog dialog = new AlertDialog.Builder(this)
                .setTitle("警告!")
                .setMessage("请前往设置->应用->PermissionDemo->权限中打开相关权限,否则功能无法正常运行!")
                .setPositiveButton("确定", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                // 一般情况下如果用户不授权的话,功能是无法运行的,做退出处理
                finish();
            }
        }).show();
    }

4、权限清单:

相关文章

网友评论

      本文标题:Android动态申请权限

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