博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android权限处理分类
阅读量:6814 次
发布时间:2019-06-26

本文共 3269 字,大约阅读时间需要 10 分钟。

一、权限处理分类

img

由上图可以看出,主要分为四类。下表逐一介绍各类对应的一些情况。

img

二、动态权限申请

虽然总的来说分为四类,但是只需要处理一种情况,即动态申请权限。其他三种情况,要么默认实现,要么系统定制,无法从代码角度进行调整。那么下面先来看下那些权限需要动态申请。

(1)权限列表

img

Android6.0以上把权限分为普通权限和危险权限,所以危险权限是需要动态申请,给予用户提示的,而危险权限就是上表展示的内容。

看到上面的 permissions,会发现一个问题,危险权限都是一组一组的。

分组对权限机制的申请是有一定影响的。例如app运行在android 6.x的机器上,对于授权机制是这样的。如果你申请某个危险的权限,假设你的app早已被用户授权了同一组的某个危险权限,那么系统会立即授权,而不需要用户去点击授权。比如你的app对READ_CONTACTS已经授权了,当你的app申请WRITE_CONTACTS时,系统会直接授权通过。

此外,对于申请时的弹窗上面的文本说明也是对整个权限组的说明,而不是单个权限。

下面介绍下Android 6.0以上 动态申请权限所设计到的一些方法。

(2)权限申请方法

在申请权限先,首先要保证在AndroidManifest中写明需要的权限。 例如:

具体权限方法详解:

img

权限申请示例

以获取定位权限为例。

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,给用户解释。

以上就是动态申请权限的逻辑,大概流程如下:

img

注意: shouldShowRequestPermissionRationale :默认情况下,不重写该方法,在Android原生系统中,如果第二次弹出权限申请的对话框,会出现“以后不再弹出”的提示框,如果用户勾选了,你再申请权限,则shouldShowRequestPermissionRationale返回true,意思是说要给用户一个 解释,告诉用户为什么要这个权限。

转载于:https://blog.51cto.com/14284753/2378030

你可能感兴趣的文章
SQL Server 造成cpu 使用率高的 6 原因
查看>>
MYSQL <=>运算符
查看>>
unable to access android sdk add-on list
查看>>
Azure Traffic Manager 现可与 Azure 网站集成!
查看>>
由.NET说到WCF(未完成)
查看>>
用motion实现家庭视频监控
查看>>
帝国cms缩略图:网站不同地方生成不同的缩略图
查看>>
python Django Ajax基础
查看>>
aop point-cut表达式
查看>>
第四周 day17 类名称空间,查询顺序等/组合
查看>>
easyui的 getSelections 与 getSelected 对比区别
查看>>
后缀数组模板 UOJ#35. 后缀排序
查看>>
[转]DirectX Rendering Pipeline渲染管线图
查看>>
ImageMaigck不支持中文路径的问题
查看>>
俄罗斯方块
查看>>
ZOJ 2061 - Buy the Ticket
查看>>
博客园定制页面(五)——使用自定义JS脚本(公告栏显示时间)
查看>>
清华申请退学博士作品:完全用Linux工作
查看>>
总结:串和数组的学习
查看>>
Canvas + JavaScript 制作图片粒子效果
查看>>