Android:权限permission申请示例代码

news/2025/2/22 13:51:15

Android应用项目每次最开始都要进行权限申请,贴一下权限申请的示例代码,方便后续Ctrl C+V使用

1.AndroidManifest.xml 配置要申请的权限

<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

2.示例代码:

可以封装成一个权限类供其他地方调用,懒得写了,代码先散装着贴吧。

    private static final int REQUEST_PERMISSION_CODE = 101010;  //默认请求权限的requestCode为1

    //需要申请的权限数组
    private String[] requestPermissionArray = new String[]{
            Manifest.permission.READ_CONTACTS,
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE
    };

    public void checkPermission(Context context, String[] permissions) {
        //存放permissions中当前未被授予的权限
        List<String> permissionList = new ArrayList<>();

        //遍历权限数组,检测所需权限是否已被授予,若该权限尚未授予,添加到permissionList中
        for (String permission : permissions) {
            if (ContextCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
                Log.e(TAG, "checkSelfPermission:" + permission);

                if (!permissionList.contains(permission)) {
                    permissionList.add(permission);
                    Log.e(TAG, "permissionList add " + permission);
                }
            }
        }

        if (!permissionList.isEmpty()) {
            //有权限尚未授予,去授予权限
            ActivityCompat.requestPermissions((Activity) context,
                    permissionList.toArray(new String[permissionList.size()]),
                    REQUEST_PERMISSION_CODE);
        } else {
            //权限都被授予了
            Log.d(TAG, "权限都授予了");

            //doSomething();
        }
    }

    /**
     * 申请权限结果返回
     *
     * 通常checkPermission()权限都能申请下来,返回结果不处理也没问题
     *
     * @param requestCode  请求码
     * @param permissions  所有申请的权限集合
     * @param grantResults 权限申请的结果
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        Log.i(TAG, "onRequestPermissionsResult");

        switch (requestCode) {
            case REQUEST_PERMISSION_CODE:
                if (grantResults.length > 0) { //有权限申请
                    //存储被用户拒绝的权限
                    List<String> deniedPermissionList = new ArrayList<>();
                    //有权限被拒绝,分类出被拒绝的权限
                    for (int i = 0; i < grantResults.length; i++) {
                        String permission = permissions[i];
                        int grantResult = grantResults[i];
                        if (grantResult != PackageManager.PERMISSION_GRANTED) {
                            if (!deniedPermissionList.contains(permission)) {
                                deniedPermissionList.add(permission);
                            }
                        }
                    }

                    if (deniedPermissionList.isEmpty()) {
                        //没有被拒绝的权限
                        Log.d(TAG, "权限都授予了");
                        //doSomething();
                    } else {
                        //有被拒绝的权限
                        Log.e(TAG, "有权限被拒绝了");
                        //继续申请
                    }
                }
                break;
        }
    }


http://www.niftyadmin.cn/n/5862348.html

相关文章

BUUCTF-Web方向16-20wp

目录 [极客大挑战 2019]PHP[ACTF2020 新生赛]BackupFile[RoarCTF 2019]Easy Calc[极客大挑战 2019]BuyFlag[BJDCTF2020]Easy MD5 [极客大挑战 2019]PHP 由内容提示应该存在源码备份&#xff0c;常见的如下&#xff0c;一个个尝试 后缀&#xff1a;tar tar.gz zip rar 名字&am…

第30篇 基于ARM A9处理器用C语言实现中断<六>

Q&#xff1a;怎样设计基于ARM A9处理器的C语言程序在数码管上滚动显示字符&#xff1f; A&#xff1a;使用A9 Private Timer中断源&#xff0c;控制字符滚动的速度&#xff1b;按键产生中断可以控制字符暂停/继续滚动。 本实验在DE1-SoC开发板的6个七段数码管*HEX5~HEX0*上…

【文件夹合并——树链剖分,树状数组】

题目 复杂度 代码 #pragma GCC optimize(3)#include <bits/stdc.h> using namespace std; using ll long long;const int N 5e5 10; const int M 1e6 10;int n, m; vector<int> sub[N]; // 子文件夹 ll d[N]; …

IO模型与NIO基础--NIO网络传输选择器--字符编码

放进NIO体系进行网络编程的工作流程&#xff1a; Selector的创建 通过调用Selector.open()方法创建一个Selector&#xff0c;如下&#xff1a; Selector selector Selector.open(); 向Selector注册通道 通过Channel.register()方法来实现&#xff0c; 注意&#xff1a;Chan…

Canvas进阶-4、边界检测(流光,鼠标拖尾)

1. 什么是边界检测&#xff1f; 在之前的开发中&#xff0c;物体在运动过程中一旦超出画布&#xff0c;就会消失&#xff0c;今天学习如何去检测是否碰到了边界&#xff0c;碰到边界后又会有哪些处理的办法。 边界检测&#xff0c;就是物体运动的限制范围。边界检测的范围&…

[实现Rpc] Dispatcher类的实现 | 开闭原则 | 测试 | 传gitee

目录 程序设计原则 说明 Dispatcher Callback 类 CallbackT 类 Dispatcher 类 测试 client server Debug ⭕参数传递错误 排查方法&#xff1a; 运行 记录&#xff1a; &#xff08;1&#xff09;Dispatcher类的功能&#xff1a; 注册消息的类型。回调函数映射关…

二叉树层序遍历的三种情况(总结)

这道题就是一个比较简单的层序遍历&#xff0c;只需要利用队列存放二叉树结点&#xff0c;队列的size代表每层的节点数也就是平均值的除数&#xff0c;利用一个结果数组记录每层平均值&#xff0c;最后返回。 需要注意的是&#xff0c;平均值定义成double类型。 代码如下&…

通信系统中物理层与网络层联系与区别

在通信系统中&#xff0c;物理层和网络层是OSI&#xff08;开放系统互连&#xff09;模型中的两个重要层次&#xff0c;分别位于协议栈的最底层和第三层。它们在功能、职责和实现方式上有显著的区别&#xff0c;但同时也在某些方面存在联系。以下是物理层与网络层的联系与区别的…