一、权限处理分类
由上图可以看出,主要分为四类。下表逐一介绍各类对应的一些情况。
二、动态权限申请
虽然总的来说分为四类,但是只需要处理一种情况,即动态申请权限。其他三种情况,要么默认实现,要么系统定制,无法从代码角度进行调整。那么下面先来看下那些权限需要动态申请。
(1)权限列表
Android6.0以上把权限分为普通权限和危险权限,所以危险权限是需要动态申请,给予用户提示的,而危险权限就是上表展示的内容。
看到上面的 permissions,会发现一个问题,危险权限都是一组一组的。
分组对权限机制的申请是有一定影响的。例如app运行在android 6.x的机器上,对于授权机制是这样的。如果你申请某个危险的权限,假设你的app早已被用户授权了同一组的某个危险权限,那么系统会立即授权,而不需要用户去点击授权。比如你的app对READ_CONTACTS已经授权了,当你的app申请WRITE_CONTACTS时,系统会直接授权通过。
此外,对于申请时的弹窗上面的文本说明也是对整个权限组的说明,而不是单个权限。
下面介绍下Android 6.0以上 动态申请权限所设计到的一些方法。
(2)权限申请方法
在申请权限先,首先要保证在AndroidManifest中写明需要的权限。
例如:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
具体权限方法详解:
权限申请示例
以获取定位权限为例。
1.点击按钮,检查并申请权限
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (Build.VERSION.SDK_INT >23) {
if (ContextCompat.checkSelfPermission(MainActivity.this,
Manifest.permission.ACCESS_COARSE_LOCATION)
== PackageManager.PERMISSION_GRANTED) {
//授予权限
getLoation();
}else{
//未获得权限
requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}
,REQUEST_CODE_LOCATION);
}
}
}
});
如果有权限,执行获取位置逻辑,如果没权限,则进行请求权限。
2.权限申请结果回调
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == REQUEST_CODE_LOCATION)
{
if (grantResults[0] == PackageManager.PERMISSION_GRANTED)
{
getLoation();
} else
{
if (shouldShowRequestPermissionRationale( Manifest.permission.ACCESS_COARSE_LOCATION)){
new AlertDialog.Builder(this)
.setMessage("申请定位权限,才能为你推送更准确的信息")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//申请定位权限
requestPermissions(MainActivity.this,
new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_CODE_LOCATION);
}
}).show();
}
}
return;
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
如果同意,执行获取位置逻辑,如果拒绝,重写shouldShowRequestPermissionRationale方法,返回true,向用户弹窗给出一个获取权限的提示,点击后再次申请权限。
public boolean shouldShowRequestPermissionRationale(@NonNull String permission) {
if (permission.equals(Manifest.permission.ACCESS_COARSE_LOCATION) ) {
return true;
} else {
return super.shouldShowRequestPermissionRationale(permission);
}
}
重写shouldShowRequestPermissionRationale,在申请位置权限时,返回true,给用户解释。
以上就是动态申请权限的逻辑,大概流程如下:
注意:
shouldShowRequestPermissionRationale :默认情况下,不重写该方法,在Android原生系统中,如果第二次弹出权限申请的对话框,会出现“以后不再弹出”的提示框,如果用户勾选了,你再申请权限,则shouldShowRequestPermissionRationale返回true,意思是说要给用户一个 解释,告诉用户为什么要这个权限。
三、开源项目
- PermissionsDispatcher
使用注解的方式,动态生成类处理运行时权限. - Grant
简化运行时权限的处理,比较灵活 - android-RuntimePermissions
Google官方的例子
最后
按照国际惯例,给大家分享一套十分好用的Android进阶资料:《全网最全Android开发笔记》。
整个笔记一共8大模块、729个知识点,3382页,66万字,可以说覆盖了当下Android开发最前沿的技术点,和阿里、腾讯、字节等等大厂面试看重的技术。
因为所包含的内容足够多,所以,这份笔记不仅仅可以用来当学习资料,还可以当工具书用。
如果你需要了解某个知识点,不管是Shift+F 搜索,还是按目录进行检索,都能用最快的速度找到你要的内容。
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照整个知识体系编排的。
详细文档可以点我下载,记得点赞哦~
(一)架构师必备Java基础
1、深入理解Java泛型
2、注解深入浅出
3、并发编程
4、数据传输与序列化
5、Java虚拟机原理
6、高效IO
……
(二)设计思想解读开源框架
1、热修复设计
2、插件化框架设计
3、组件化框架设计
4、图片加载框架
5、网络访问框架设计
6、RXJava响应式编程框架设计
……
(三)360°全方位性能优化
1、设计思想与代码质量优化
2、程序性能优化
- 启动速度与执行效率优化
- 布局检测与优化
- 内存优化
- 耗电优化
- 网络传输与数据储存优化
- APK大小优化
3、开发效率优化
- 分布式版本控制系统Git
- 自动化构建系统Gradle
……
(四)Android框架体系架构
1、高级UI晋升
2、Android内核组件
3、大型项目必备IPC
4、数据持久与序列化
5、Framework内核解析
……
(五)NDK模块开发
1、NDK开发之C/C++入门
2、JNI模块开发
3、Linux编程
4、底层图片处理
5、音视频开发
6、机器学习
……
(六)Flutter学习进阶
1、Flutter跨平台开发概述
2、Windows中Flutter开发环境搭建
3、编写你的第一个Flutter APP
4、Flutter Dart语言系统入门
……
(七)微信小程序开发
1、小程序概述及入门
2、小程序UI开发
3、API操作
4、购物商场项目实战
……
(八)kotlin从入门到精通
1、准备开始
2、基础
3、类和对象
4、函数和lambda表达式
5、其他
……
好啦,这份资料就给大家介绍到这了,*有需要详细文档的小伙伴可以点我下载~~~~*
API操作
4、购物商场项目实战
……
[外链图片转存中…(img-LyJ3vVp2-1624370210793)]
(八)kotlin从入门到精通
1、准备开始
2、基础
3、类和对象
4、函数和lambda表达式
5、其他
……
[外链图片转存中…(img-cpecehK4-1624370210812)]
好啦,这份资料就给大家介绍到这了,*有需要详细文档的小伙伴可以点我下载~~~~*