当前位置: 首页 > article >正文

Android:权限permission申请示例代码

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.kler.cn/a/557581.html

相关文章:

  • C++ 设计模式-模板方法模式
  • 【Python】Python顺序语句经典题合集
  • java开发——为什么要使用动态代理?
  • hot100_74. 搜索二维矩阵
  • Unity FBXExport导出的FBX无法在Blender打开
  • ZT7 小红的排列构造
  • 【Python爬虫(46)】解锁分布式爬虫:实时数据处理的奥秘
  • 在Django中安装、配置、使用CKEditor5,并将CKEditor5录入的文章展现出来,实现一个简单博客网站的功能
  • 人工智能三剑客:符号主义、连接主义与行为主义的较量与融合
  • RocketMQ事务消息原理
  • 爬虫小案例豆瓣电影top250(json格式)
  • C++如何获取windows系统通知消息列表
  • RoCBert:具有多模态对比预训练的健壮中文BERT
  • 【Qt】可爱的窗口关闭确认弹窗实现
  • Svelte 最新中文文档教程(16)—— Context(上下文)
  • 微信小程序数据绑定与事件处理:打造动态交互体验
  • Ubuntu 22.04 Install deepseek
  • MongoDB应用设计调优
  • My Metronome for Mac v1.4.2 我的节拍器 支持M、Intel芯片
  • 微软CEO-纳德拉访谈-AGI计划