Android 6.0 运行时权限简洁封装

【快应用】权限弹框理由描述如何自定义 name目前支持的权限配置包括:WRITE_CALENDAR、ACCESS_FINE_LOCATION、CAMERA、RECORD_AUDIO、WRITE_EXTERNAL_STORAGE(1075+)、STORAGE_READ(1078+)、READ_PHONE_STATE(1078+)、NOTIFYCATION(1078+)、SILENT_NOTIFYCATION(1078+)、READ_CONTACT(1078+)、CAR_INFO。欲了解更多更全技术文章,欢迎访问。 阅读详情

Android 6.0 运行时权限简洁封装

本文原创,转载请注明出处。
欢迎关注我的 简书 ,关注我的专题 Android Class 我会长期坚持为大家收录简书上高质量的 Android 相关博文。

写在前面:

Android M 中有一个比较重要的知识点就是运行时权限了,关于运行时权限的文章和封装库目前也出现了不少,在开发的过程中始终觉得运行时权限这块的代码可以进一步封装一下,让其使用起来能再简洁一点,并且还不容易出错。关于 Android 运行时权限的知识就不多讲解了,可以参考下面的一些资料:

Android Runtime Permissions

Android 6.0 运行时权限处理完全解析

知识点比较简单,大致了解和使用过后,就来开始我的这次封装之旅吧。

现在直观的看看封装之后的使用,是不是清爽很多?

    @OnClick(R.id.tv_toolbar_right)
    public void onClick() {
        performRequestPermissions(getString(R.string.permission_desc), new String[]{Manifest.permission.READ_PHONE_STATE, Manifest.permission.ACCESS_COARSE_LOCATION}
                , PER_REQUEST_CODE, new PermissionsResultListener() {
                    @Override
                    public void onPermissionGranted() {
                        Toast.makeText(MainActivity.this, "已申请权限", Toast.LENGTH_LONG).show();
                    }

                    @Override
                    public void onPermissionDenied() {
                        Toast.makeText(MainActivity.this, "拒绝申请权限", Toast.LENGTH_LONG).show();
                    }
                });
    }

我将运行时权限封装到 BaseActivity 中,MainActivty 继承BaseActivity,调用 performRequestPermissions 方法,此时我不用再去做一些判断,只需要穿入四个参数即可。当然你为了在 6.0 以下保证应用正常运行,你依然需要像以前一样,在清单文件中申明要使用的权限。

首先我需要一个接口做通信:

public interface PermissionsResultListener {

    void onPermissionGranted();

    void onPermissionDenied();

}

然后把逻辑代码封装在 BaseActivity 里面:

public class BaseActivity extends AppCompatActivity {

    private PermissionsResultListener mListener;

    private int mRequestCode;

    /**
     * 其他 Activity 继承 BaseActivity 调用 performRequestPermissions 方法
     *
     * @param desc        首次申请权限被拒绝后再次申请给用户的描述提示
     * @param permissions 要申请的权限数组
     * @param requestCode 申请标记值
     * @param listener    实现的接口
     */
    protected void performRequestPermissions(String desc, String[] permissions, int requestCode, PermissionsResultListener listener) {
        if (permissions == null || permissions.length == 0) {
            return;
        }
        mRequestCode = requestCode;
        mListener = listener;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (checkEachSelfPermission(permissions)) {// 检查是否声明了权限
                requestEachPermissions(desc, permissions, requestCode);
            } else {// 已经申请权限
                if (mListener != null) {
                    mListener.onPermissionGranted();
                }
            }
        } else {
            if (mListener != null) {
                mListener.onPermissionGranted();
            }
        }
    }

    /**
     * 申请权限前判断是否需要声明
     *
     * @param desc
     * @param permissions
     * @param requestCode
     */
    private void requestEachPermissions(String desc, String[] permissions, int requestCode) {
        if (shouldShowRequestPermissionRationale(permissions)) {// 需要再次声明
            showRationaleDialog(desc, permissions, requestCode);
        } else {
            ActivityCompat.requestPermissions(BaseActivity.this, permissions, requestCode);
        }
    }

    /**
     * 弹出声明的 Dialog
     *
     * @param desc
     * @param permissions
     * @param requestCode
     */
    private void showRationaleDialog(String desc, final String[] permissions, final int requestCode) {
        final AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle(getString(R.string.tips))
                .setMessage(desc)
                .setPositiveButton(getResources().getString(R.string.confrim), new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        ActivityCompat.requestPermissions(BaseActivity.this, permissions, requestCode);
                    }
                })
                .setNegativeButton(getResources().getString(R.string.cancle), new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        dialogInterface.dismiss();
                    }
                })
                .setCancelable(false)
                .show();
    }


    /**
     * 再次申请权限时,是否需要声明
     *
     * @param permissions
     * @return
     */
    private boolean shouldShowRequestPermissionRationale(String[] permissions) {
        for (String permission : permissions) {
            if (ActivityCompat.shouldShowRequestPermissionRationale(this, permission)) {
                return true;
            }
        }
        return false;
    }


    /**
     * 检察每个权限是否申请
     *
     * @param permissions
     * @return true 需要申请权限,false 已申请权限
     */
    private boolean checkEachSelfPermission(String[] permissions) {
        for (String permission : permissions) {
            if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
                return true;
            }
        }
        return false;
    }

    /**
     * 申请权限结果的回调
     *
     * @param requestCode
     * @param permissions
     * @param grantResults
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == mRequestCode) {
            if (checkEachPermissionsGranted(grantResults)) {
                if (mListener != null) {
                    mListener.onPermissionGranted();
                }
            } else {// 用户拒绝申请权限
                if (mListener != null) {
                    mListener.onPermissionDenied();
                }
            }
        }
    }

    /**
     * 检查回调结果
     *
     * @param grantResults
     * @return
     */
    private boolean checkEachPermissionsGranted(int[] grantResults) {
        for (int result : grantResults) {
            if (result != PackageManager.PERMISSION_GRANTED) {
                return false;
            }
        }
        return true;
    }
}

每一个方法都有注释,逻辑也相对简单,就是我会遍历每个数组中申请的权限,如果需要申请就去申请,然后再处理一下回调的结果,其中还有对用户拒绝,然后再次申请弹出 Dialog 的处理。

如果在 Fragment 中使用,只是改变了一下参数封到 BaseFragment 中,这里就不贴代码了,都已经上传 github

BaseActivity:

BuzzerBeater BaseActivity

BaseFragment:

BuzzerBeater BaseFragment

如有问题,继续交流~

Android6.0运行权限封装,一句代码实现 Android6.0运行权限封装,轻轻松松一句代码实现,并添加了同意及拒绝授权时的监听回调,方便添加操作 立即下载

相关推荐

android 动态申请权限封装

Android动态权限申请封装总结。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

亲测有效:Android权限申请简易封装带结果回调

Android权限申请封装,带结果回调

weixin_40420578的博客 3948

Android-SchPermission一个自己封装的Android动态申请权限库

SchPermission一个自己封装的Android动态申请权限库

Android权限申请封装

(这里解释一下为啥要使用对象去实例化,为啥不直接用getInstance(),如果直接用getInstance(),会导致如果权限已经申请过了,但是没有设置相应的回调,那么下面的回调接口就会导致空指针异常,所以这里用实例化对象调用。在Activity中定义好需要申请的权限,通过封装类去自动申请权限,以及回调。Android6.0以后使用手机权限需要向用户申请,用户同意后才能使用权限。五、RepPermissionResult权限申请结果回调。一、checkSelPermission校验权限是否授权。

qq_41872338的博客 587

android6.0权限管理封装demo

android6.0权限处理的封装demo,使用简单,6.0权限介绍看博客https://mp.csdn.net/postedit/80140934

权限申请封装

andpermisson的二次封装,支持andpermission功能,代码简化

Android组件化开发实战:封装权限管理请求框架

3、填写项目名称,包名,保存路径,Language语言选择“java” → Finish。

2501_90404640的博客 851

PayPal支付集成完全指南:开源库实践

本文介绍了如何从零开始集成PayPal支付功能。首先概述了PayPal提供的多语言SDK和开源库,包括PHP、Python、Node.js等版本。然后详细说明了准备工作,包括注册开发者账号、获取API凭证和使用沙盒环境测试。文章以Node.js为例,演示了安装SDK、基础配置和实现支付流程的完整代码,包括创建订单和捕获支付两个核心功能。最后提及了订阅支付等高级功能,为开发者提供了完整的支付集成方案。通过清晰的代码示例和步骤说明,帮助开发者快速实现PayPal支付功能集成。

2501_93501927的博客 1258

android 6.0权限封装,Android 6.0 运行时权限简洁封装

Android 6.0 运行时权限简洁封装本文原创,转载请注明出处。欢迎关注我的 简书 ,关注我的专题 Android Class 我会长期坚持为大家收录简书上高质量的 Android 相关博文。写在前面:Android M 中有一个比较重要的知识点就是运行时权限了,关于运行时权限的文章和封装库目前也出现了不少,在开发的过程中始终觉得运行时权限这块的代码可以进一步封装一下,让其使用起来能再简洁一点...

weixin_39934257的博客 121

系统动力学仿真软件Vensim下载

Vensim是由美国Ventana Systems, Inc.所开发,是采用图示化编程的方式构建系统动力学模型,上手简单。Vensim有很多系列产品,其中Vensim PLE (Personal Learning Edition)是面向个人学习者的,完全免费,可直接官网下载,截止于2022/04/10,最新的Vensim PLE版本是9.2.3。

PMIIᶜᶜ的博客 1万+

腾讯文档API逆向分析:不用Selenium也能批量导出的黑科技

本文揭秘了如何通过Python逆向分析腾讯文档的隐藏API,实现无需Selenium即可批量导出在线表格的高效方法。详细解析了API调用流程、Cookie维护及异常处理技巧,相比传统方案性能提升显著,适用于大量文档导出的自动化场景。

h9j8k7l6m5n的博客 1201

优雅的解决Android6.0运行时权限问题

如何优雅的解决Android6.0运行时权限问题 文章目录代码收录 之前遇到6.0运行时权限问题的时候每次都要写一次requestPermissions和checkPermission或者shouldShowRequestPermissionRationale,然后在Activity的onRequestPermissionsResult的回调里的处理结果,每次都好烦。 看了第三方的请求权限的封装,...

大帅在唱歌 1901

28、数字电路测试与半导体内存测试全解析

本文全面解析了数字电路中的顺序电路测试生成方法与半导体内存测试技术。内容涵盖顺序电路中的故障检测、多重观察测试、可驱动性分析、伪组合电路测试及初始化问题,并深入探讨了内存技术发展、故障模型、测试流程与未来趋势。重点介绍了DRAM、SRAM等主流内存类型的特点,以及制造和使用过程中面临的永久性与非永久性故障挑战,提出了基于故障模型的高效测试策略与优化方案。

go5gopher的博客 122

Android6.0运行权限框架封装

1.概述   上篇文章文章介绍了Android 6.0 运行时权限处理解析,只是写了运行时申请权限处理,但是并未对其做代码封装,这一次我们做一个彻底的封装处理,供以后项目中使用。 2.框架封装   2.1.简单事例: public class TextActivity extends AppCompatActivity { // 打电话权限申请的请求码 ...

weixin_45468727的博客 339

告别调参难!YOLO超参数优化指南(网格搜索+贝叶斯优化实战)

YOLO超参数优化的本质,不是“试遍所有参数”,而是“用工具化方法,在场景约束内找到最优平衡”——网格搜索稳、贝叶斯优化快,两者结合(先粗搜再精调)是工业场景的最优解。先定范围:基于工业场景(小目标/边缘设备/多类别)缩小参数搜索范围,避免无效探索。先调核心:优先优化数据增强、学习率、输入尺寸,这些参数对精度影响最大。工具赋能:用网格搜索+贝叶斯优化替代人工试错,再用TensorBoard监控,让调参“有据可依”。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 698

PyTorch生成式人工智能(25)——基于Transformer实现机器翻译

不同于循环神经网络 (RNN) 按顺序处理数据,Transformer 以并行的方式处理输入数据(例如句子)。这种并行处理提高了效率,但并未使其能够识别输入的顺序。为了解决这个问题,Transformer 向输入的词嵌入中添加了位置编码。这些位置编码是分配给输入序列中每个位置的独特向量,其维度与输入词嵌入对齐。本节将以英语到法语的翻译为例,通过介绍如何训练 Transformer 模型将英语句子转换为法语,深入理解 Transformer 的架构及自注意力机制的运作方式。

盼小辉丶的博客 2722

Android 6.0 运行时权限封装框架

1.概述  视频讲解都已经录了好几天,但是最近实在抽不开身一直在忙Unity3D,就连光棍节都在写,上次我们只是写了Android 6.0 运行时权限处理解析,但是并未对其做代码封装,这一次我们做一个彻底的处理。   附视频讲解地址:http://pan.baidu.com/s/1bpqqkGn    2.运行时权限的检测   2.1. 简单例子public class Main

z240336124的专栏 1万+

撸毛笔记-电信营业厅 v5.03

电信营业厅 v5.03签到和完成部分金豆任务, 喂宠物7天,15天,28天连签抽奖, 宠物等级权益兑换自己设置电信的服务密码, 把 手机号#服务密码 填到变量里:每天运行一两次const $ = new Env("电信营业厅");

xiaoshun007的专栏 4494

android 6.0权限封装,android6.0运行时权限完美封装方法

前几天看了郭大神的运行时权限的专讲,深受启发,由于现在基于目前项目中的运行时权限封装的还不是那么完美,趁着郭神建议的还是历历在目。于是把它完整的敲了下来。并在此基础上添加上自己的一些见解,封装成一个完整的demo,希望与大家进行交流与。在这里我进行了简单的在activity中简单进行获取权限和工具类封:某一个权限被禁止或者是所有的权限被禁止,这里我做了去到烯烃界面去设置的处理:如果要开启多个权限的...

weixin_34552961的博客 261

STM32F4 Flash数据的保存和读取。

STM32F4 Flash数据的保存和读取。

张一西的博客 9216

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Android 6 0 运行时权限封装框架

###1.概述 视频讲解都已经录了好几天,但是最近实在抽不开身一直在忙Unity3D,就连光棍节都在写,上次我们只是写了Android 6.0 运行时权限处理解析,但是并未对其做代码封装,这一次我们做一个彻底的处理。   附视频讲解地址:http://pan.baidu.com/s/1bpqqkGn    ###2.框架封装 2.1. 简单例子 public class MainActivi...

weixin_33701617的博客 112

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Android适配-自己封装几行代码解决Android6.0的权限申请

权限适配前言开工哪些权限需要申请普通权限通用的危险权限组:申请步骤封装库 前言 Android6.0推出来的运行时权限申请想必大家都了解了,但是有些刚入行的兄弟们时而问起我,说明对这块知识点的适配工作还是有点不太熟,比如到底哪些权限需要申请?是否我配置的权限要一个一个申请呢?而且申请代码不难但是如果每次申请都这么写就有点繁杂了,能不能有点简单快捷的写法?假如用户拒绝了怎么提醒用户并引导用户去主动开...

Mango先生的博客 1039

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Android 6.0 运行时权限处理完全解析

转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/50709663; 本文出自:【张鸿洋的博客】 一.概述随着Android 6.0发布以及普及,我们开发者所要应对的主要就是新版本SDK带来的一些变化,首先关注的就是权限机制的变化。对于6.0的几个主要的变化,查看查看官网的这篇文章http://developer.a

粪乧的野蛮成长记录 4101

Android RxPermissions 安卓权限适配

RxPermissions项目地址:https://github.com/tbruyelle/RxPermissions 1.简介 RxPermissions是基于RxJava开发的用于帮助在Android 6.0中处理运行时权限检测的框架。在Android 6.0中,系统新增了部分权限的运行时动态获取。而不再是在以前的版本中安装的时候授予权限。 对于运行时的权限获取

bat1992的博客 1916

安卓6.0权限适配 ----RxPermissions

原文地址  http://blog.csdn.net/windboy2014/article/details/52502259 RxPermissions项目地址:https://github.com/tbruyelle/RxPermissions 1.简介 RxPermissions是基于RxJava开发的用于帮助在Android 6.0中处理运行时权限检测的框

Stephen2Wong的博客 1823
上一篇: 死磕 Fragment 的生命周期
下一篇: Melo作为程序员的2016年
MeloDev
博客等级 码龄11年 93粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值