android 6.0权限 郭霖,Permission——郭霖认为最优的运行时权限方案

article/2025/9/17 8:21:42

Android6.0发布这么久,对运行时权限也看了很多资料,对比过几个流行的库。但是个人还是喜欢在项目里用自己动手封装的东西,哪怕照抄也好。。。不知道是什么原因。

前天无意听郭神的直播。讲解的是运行时权限的封装,收益颇多。依样画葫芦,记录下来,没看直播的同学也可以看看(郭神的第二行代码已经当工具书了,每次翻开看到郭神的签名,都觉得真的是字如其人。。。)

前阵子封装个基类库,快捷开发可以直接用,运行时权限正好整合进去。开始:

Permission,运行时权限

授权权限

*如果设备运行的是Android 6(API Level 23)或更高,和应用程序的targetSdkVersion是23或更高,应用程序要求的权限由用户在运行时。用户可以在任何时间撤销权限,所以在每次运行时应用程序需要检查是否有权限。

如果设备运行的是Android 5.1(API Level 22)或更低,或应用程序targetSdkVersion等于或低于22时,当用户安装的应用程序,系统会要求用户授予权限。用户的应用程序更新,如果你添加一个新的权限的应用程序的更新版本,系统会要求用户授予权限时。一旦用户安装该应用程序,他们可以撤销许可的唯一途径是通过卸载应用程序。

拒绝权限

*每当一个权限被拒绝应向用户解释使用该权限的具体用途,保证功能要求的权限总是行为为目的,应用程序应该说是需要许可,允许它提供了一种方法。而权限被拒绝的途径以下两种:

由用户拒绝权限请求

用户选择过“不要再问”,用户权限是默默的否认,没有警告

封装

申请权限后腰毁掉给当前activity,所以先定义一个回掉接口PermissionListener

public interface PermissionListener { //授权成功 void onGranted(); //授权部分 void onGranted(List grantedPermission); //拒绝授权 void onDenied(List deniedPermission); }

在BaseActivity里写授权申请,首先检查申请的权限是不是被授权了,如果不是就加入待授权数组里,去申请权限。如果全部已授权,就直接回掉授权成功。

/** 权限申请

* @param permissions

* @param listener

*/

protected void requestRunTimePermission(String[] permissions, PermissionListener listener) {

//todo 获取栈顶activity,如果null。return;

this.mPermissionListener = listener;

List permissionList = new ArrayList<>();

for (String permission : permissions) {

if(ContextCompat.checkSelfPermission(this,permission)!= PackageManager.PERMISSION_GRANTED){

permissionList.add(permission);

}

}

if(!permissionList.isEmpty()){

ActivityCompat.requestPermissions(this,permissionList.toArray(new String[permissionList.size()]),1);

}else{

listener.onGranted();

}

}

然后重写授权返回方法。系统会返回2个数组, String[] permissions是你申请的权限,int[] grantResults是授权结果。拿出授权结果比对,如果授权,加入授权数组,如果拒绝,加入拒绝数组。回掉给注册PermissionListener的activity

/** 申请结果

* @param requestCode

* @param permissions

* @param grantResults

*/

@Override

public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

super.onRequestPermissionsResult(requestCode, permissions, grantResults);

switch (requestCode){

case 1:

if (grantResults.length>0){

List deniedPermissions = new ArrayList<>();

List grantedPermissions = new ArrayList<>();

for (int i = 0; i < grantResults.length; i++) {

int grantResult = grantResults[i];

if (grantResult != PackageManager.PERMISSION_GRANTED){

String permission = permissions[i];

deniedPermissions.add(permission);

}else{

String permission = permissions[i];

grantedPermissions.add(permission);

}

}

if (deniedPermissions.isEmpty()){

mPermissionListener.onGranted();

}else{

mPermissionListener.onDenied(deniedPermissions);

mPermissionListener.onGranted(grantedPermissions);

}

}

break;

}

}

然后你的实现了BaseActivity的activity实现PermissionListener,需要申请权限的地方调用requestRunTimePermission(permissions,this);在回掉方法里根据结果实现逻辑。

附:

权限可以分为危险权限和正常权限,还有特殊权限、自定义权限。

正常权限(PROTECTION_NORMAL)对用户的隐私或安全没有大的风险的权限在AndroidManifest.xml声明里,如果应用需要一个正常的权限,在安装的时候系统自动授予该权限。在使用的时候系统不提示用户,用户也不能撤销这些权限。

危险权限,需要使用时要检查有没有授权。如果没有就弹个对话框询问用户授权。这类权限被分组了,同一组的任何一个权限被授权了,其他权限也自动被授权。如下表:

c6cb758cbb43

比如你需要android.permission.READ_CONTACTS ,去读联系人。这个权限被用户授权,然后你用到写入通讯录权限permission:android.permission.WRITE_CONTACTS和permission:android.permission.GET_ACCOUNTS 时,就是授权过的,去申请就不会弹框。

don't worry be happy


http://chatgpt.dhexx.cn/article/TJWpr9V3.shtml

相关文章

郭霖LitePal

由于项目需要开始学习sqlite 一开始先学习使用的是 android ormlite 操作 从最基本的建表增删改查一路走来 磕磕碰碰很多 都是在内存中操作sqlite 只能通过sqlitestudio工具进行查看 不能导出 并且应用卸载数据表就丢失 最终考虑在sd卡中操作sqlite 但是ormlite 并没有这方面…

android郭霖博客,Runtime Permissions(郭霖CSDN公开课)

运行时权限 Api23开始&#xff0c;Android权限机制更改&#xff0c;有一部分权限不再是简单的在AndroidManifest.xml中声明即可。而是需要在运行时让用户去选择是否允许该项权限的操作。 那么哪些权限需要在运行时申请呢&#xff1f;危险权限需要这么做&#xff0c;而普通权限仍…

看一看Facebook工程师是怎么评价《第一行代码》的

本文同步发表于我的微信公众号&#xff0c;扫一扫文章底部的二维码或在微信搜索 郭霖 即可关注&#xff0c;每个工作日都有文章更新。 大家好&#xff0c;我是一名Facebook的工程师&#xff0c;同时也是《第一行代码——Android》的忠实读者。 虽然我最近几年是在国外读书和工…

郭霖:手把手教你实现 App 360 度旋转看车效果

这是郭神号前阵子的推送&#xff0c;应该有不少人还没有看过&#xff0c;现在分享给大家&#xff0c;希望对大家的Android工作和学习有所帮助。 / 作者简介 / 本篇文章来自Youth Lee的投稿&#xff0c;分享了他自己结合Glide写的一个控件&#xff0c;希望对大家有所帮助&#…

第一行代码-第二版(郭霖著)笔记(初识Android)

系列文章目录 第一章 第一行代码-第二版&#xff08;郭霖著&#xff09;笔记&#xff08;初识Android&#xff09; 目录 一、Android简介 1.android系统架构 2.Android应用开发特色 二、工具准备 Tips:新建项目的时候是否勾选use legacy android.support libraries 三、…

专访郭霖:成长无止境

留意文末赠书活动 嘉宾 | 郭霖 文 | 张霞 郭霖&#xff0c;Android开发工程师&#xff0c;Android GDE&#xff08;Google认证开发者专家&#xff09;。从事Android开发工作9年&#xff0c;有着丰富的项目实战经验&#xff0c;负责及参与开发过多款移动应用与游戏&#xff0c;开…

解决http响应状态为canceled

最近写登录的页面&#xff0c;发现通过ajax请求后台的时候&#xff0c;监控台返回该请求的状态是canceled。 原因 仅仅是由于之前为了在输入账号时让浏览器进行自动补全&#xff0c;而将原先的div更换为了form,而不巧的是之前的登录事件源使用的是button。 而至于为什么stat…

ajax请求导致status为canceled的原因

在使用layui的form表单提交以后&#xff0c;请求状态总是canceled。后来在form表单的后面添加了一行代码&#xff1a; return false; 就可以了。 文档&#xff1a;https://www.layui.com/doc/modules/form.html#onsubmit 错误&#xff1a; 解决方法&#xff1a; 总结一下&…

ajax请求文件状态为 canceled 的解决办法

ajax请求文件状态为 canceled 的解决办法 场景还原原因分析解决 场景还原 最近做一个表单提交的需求时&#xff0c;遇到了这种情况&#xff0c;输完账号密码后回车提交&#xff0c;报错&#xff0c;f12打开看到是请求的status为canceled了&#xff0c;震惊一秒钟。。。如下图&…

chrome同步或登录报错:Request Canceled

原因 因为某个接口连接失败造成&#xff0c;可以摁快捷键F12或者点击开发者工具。 然后选择network&#xff0c;这里面是该页面所有的收发请求 开始登录&#xff0c;登录的时候要注意network中pending或者报错的接口&#xff0c;然后把域名记录下来 解决方式 安装chrome插…

http发送请求,status显示canceled的原因

原因&#xff1a;onSubmit和submit属性比较陈旧&#xff0c;在提交了数据以后会自动刷新页面&#xff0c;导致信息丢失以及请求中止 解决&#xff1a;在 handler里面写入e.preventDefault();阻止onsubmit执行默认的刷新页面行为。

使用 npm create vue@3 报错 npm ERR! canceled

问题 之前运行都可以成功创建&#xff0c;但今天运行 npm create vue3 的时候报错了&#xff0c;错误信息如下&#xff1a; 解决方法 在网上找了一堆方法都无效。 npm 版本问题&#xff0c;升级到最新版本 npm i -g npm&#xff0c;然后重试 npm create vue3 【x】npm cac…

Go:read一个已经被canceled的http.Request的应答

Go&#xff1a;read一个已经被canceled的http.Request的应答 1.复现 最近发现项目在处理chunk类型的http应答时&#xff0c;出现读数据异常报错&#xff0c;代码示例如下&#xff1a; server package mainimport ("bytes""net/http" )func main() {http…

Idea通过git拉取代码的时候出现Update canceled问题

当在IDEA中通过Git更新代码时&#xff0c;拉取失败&#xff0c;报如下错误 12:31 Update failedInvocation failed Server returned invalid Response.java.lang.RuntimeException: Invocation failed Server returned invalid Response.at git4idea.GitAppUtil.sendXmlRequest…

Xmodem operation was canceled by remote peer问题已解决

1.Xmodem operation was canceled by remote peer. 传输的时候就会出现注意的问题 2.使用df -h命令查看内存状况&#xff0c;可以发现root已经满了。 3.进入根目录&#xff0c;ls显示&#xff0c;使用rm命名将其中的文件删除 4.显示&#xff0c;可以看见内存占用变少。 5.…

vue proxy发出的post请求出现超时导致的canceled

0 问题 vue的proxy代理好了之后&#xff0c;get请求没问题&#xff0c;post请求出现canceled&#xff0c;如下图所示&#xff1a; 解决方案 参考 https://github.com/chimurai/http-proxy-middleware/issues/40 devServer: {host: 0.0.0.0,port: 8085,proxy: {/api: {targ…

IDEA中git拉取代码的时出现Update canceled问题

IDEA中git拉取代码的时出现Update canceled问题 当在IDEA中通过Git更新代码时&#xff0c;拉取失败&#xff0c;报如下错误 解决办法&#xff1a; 勾选上以后&#xff0c;点击 OK 后拉取代码&#xff1b; 然后就成功了

解决Canceled future for execute_request message before replies were done

报错&#xff1a;Canceled future for execute_request message before replies were done The Kernel crashed while execut 解决办法&#xff0c;在代码中添加 import os os.environ["KMP_DUPLICATE_LIB_OK"]"TRUE"就完美解决了

ajax请求取消状态,Ajax请求响应状态status为canceled

需求:业务数据提交成功之后,根据表单 ‘项目阶段’ 字段的值发送邮件; 我的实现逻辑是这样的:在业务数据提交成功后的回掉函数中发起发送邮件的请求,然后关闭表单页面。 $.ajax({url: url, type: post, data: {...}, dataType: json, success: function (result) {$.ajax(…

前端axios请求form-data,status显示canceled

前端axios请求form-data,status显示canceled 起因改进&报错发现&解决问题 PS&#xff1a;前排提示本文略微啰嗦&#xff0c;解决办法在 “发现&解决问题” 部分。 起因 最近在网上跟着学习axios在vue中的使用&#xff0c;包含axios的基本数据请求&#xff0c;实例…