• Android权限申请完全解析(一):Android自带的权限申请


    1.为什么要权限申请

    6.0以上就需要了,别问为什么。(不是重点,自行搜索)

    2.如何进行权限申请

    1. Android自带的权限申请
    2. EasyPermission权限申请

    Ps:EasyPermission还没开始玩,下次玩透了写博客。

    3.权限申请的具体写法

    3.1 假设有一个需要权限才能运行的方法

        /**
         * 假设这是一个需要权限才能运行的方法
         */
        private void PermissionTest() {
            Toast.makeText(this, "这是一个需要权限才能运行的方法!", Toast.LENGTH_SHORT).show();
        }
    

    3.2 申请单个权限,比如说:打电话

            button1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(MainActivity.this, "You clicked Button1", Toast.LENGTH_SHORT).show();
                    if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
                        // 不相等 请求授权
                        ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE}, 1);
                    } else {
                        PermissionTest();
                    }
                }
            });
    

    权限申请的时候,需要判断是否已经有权限了,如果有,则直接运行,没有的话在进入权限申请。单个权限比较简单。Activity.requestPermissions的方法需要三个参数,第一个:Context,第二个:传入需要申请的权限(可多个),第三个:请求代码(用于回调处理)

    3.2 申请多个权限

            button2.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(MainActivity.this, "You clicked Button2", Toast.LENGTH_SHORT).show();
                    //一次申请两个权限的写法,当然判断的时候有一个权限没有申请的时候无法执行当前方法
                    if(ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.RECORD_AUDIO)!= PackageManager.PERMISSION_GRANTED  ||
                            ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
                        ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.RECORD_AUDIO,Manifest.permission.WRITE_EXTERNAL_STORAGE},2);
                    }
                    else{
                        PermissionTest();
                    }
                }
            });
            
    

    一次申请两个权限的写法(多个权限类似,多加几个恍恍惚惚),当然,判断的时候有一个权限没有申请的时候无法执行当前方法。

    ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.RECORD_AUDIO,Manifest.permission.WRITE_EXTERNAL_STORAGE},2);
    

    传入需要申请的权限,这里申请录音和写存储卡的方法。请求代码传入2

    3.3 回调处理

        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            switch (requestCode) {
                case 1:
                    if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                        Log.d(TAG, "onRequestPermissionsResult: " +
                                "电话权限申请成功");
                        for (int i : grantResults) {
                            Log.d(TAG, "onRequestPermissionsResult: " + i);
                        }
                        PermissionTest();
                    }
                    else {
                        Toast.makeText(this, "You denied the permission", Toast.LENGTH_SHORT).show();
                    }
                    break;
                case 2:
                    if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED){
                        Log.d(TAG, "onRequestPermissionsResult: " +
                                "权限申请成功");
                        PermissionTest();
                    }
                    else{
                        Toast.makeText(this, "You denied the permission", Toast.LENGTH_SHORT).show();
                    }
                    break;
                default:
                    break;
            }
        }
    

    说明:请求代码的窗口跳出,用户点击之后,每个权限就能够判断是否申请成功了。

    分支语句switch(requestCode),每一个case就是之前传入的请求码

    case1 说明:
    单个权限已经被申请,判断方法,grantResult数组长度大于0,grantResult数组的第一项的值等于PackageManager.PERMISSION_GRANTED (其实就是0,没有被授权的话值等于-1)。然后执行PermissionTest方法。

    case2 说明:
    和case1一样,先判断grantResult数组长度大于0,grantResult数组的第一二两项是否等于PackageManager.PERMISSION_GRANTED(因为只有两个选项所以我就直接写了),权限申请之完毕之后就能够运行PermissionTest()方法了。

    case2的判断语句可改进:定一个isAllGranted,扫一遍grantRsult,就好了

        Boolean isAllGranted = true;
        for (int permission : grantResults) {
             if (permission != PackageManager.PERMISSION_GRANTED){
                isAllGranted = false;
             }
        }
    

    Ps:测试了一下,grantResults.length > 0 好像可以不用写。。。汗。。

    结束语

    权限申请之前一直懵逼,看了书之后还是不怎么会写,真到要用的时候心里一直怕怕的。今天刚好放假,所以花了一些时间来写这篇博客。这应该是我第一篇真正的Android博客了吧。下次更新Easy的使用。

    欢迎大家观看,需要帮助可以留言。相遇就是缘分!

  • 相关阅读:
    【python-opencv】opencv基础操作之一
    【胎教】做AI的基础,开始学习。
    【实习】博士生找实习的囧事之其一
    【经验】CS
    【keras】用tensorboard监视CNN每一层的输出
    【算法】背包九讲
    【计算机网络】大数据 云计算 人工智能
    【算法】shortest distance
    【git】git hello world
    【算法】深度优先 马走日 Hamilton routes
  • 原文地址:https://www.cnblogs.com/kumaxiong/p/8146339.html
Copyright © 2020-2023  润新知