Permission权限管理——隐私权限具体说明
文章目录
- 1、应用场景
- 2、实际效果
- 3、权限申请
- 1. PermissionDialogUtil类
- 2. PermissionUtils类
- 3. 具体调用
- 4、权限管理
- 5、项目地址
1、应用场景
最近在做银行的项目,经过测试中心测试后提出需求,对于隐私权限需要满足以下两点:
1. 隐私权限的申请应该依托于具体的业务场景,在不需要某个隐私权限的场景内不得申请该权限,非业务需要的隐私权限不得阻碍正常的业务流程。
2. 需要明确告知用户具体的隐私权限用途,提供用户可以取消权限授权的途径。
针对以上两点我对应用隐私权限的申请进行了整合以及封装,支持在项目中最少量的代码调用,当然这里并不是封装成jar包,用兴趣的同学可以自己封装。
2、实际效果
这里我在权限申请之前告知用户具体的权限用途,文字描述可以根据实际的业务场景来描述,弹窗效果参照了网上的一位兄弟写的,链接如下https://github.com/haiyuKing/PermissionDialog
3、权限申请
1. PermissionDialogUtil类
这个类就是权限申请前的弹窗类,具体说明权限用途,文章最后我会提供源码,这里我们只看一下核心的代码
/*** 初始化权限列表* @param filter* @param type*/private void initItem(ColorMatrixColorFilter filter,int type){//初始化权限列表区域View itemView = View.inflate(mContext, R.layout.permission_list_item, null);String[] permissionTitles = mContext.getResources().getStringArray(R.array.permission_title);String[] permissionInfos = mContext.getResources().getStringArray(R.array.permission_info);String title = permissionTitles[type];String info = permissionInfos[type];((ImageView) itemView.findViewById(R.id.item_img)).setImageResource(mContext.getResources().obtainTypedArray(R.array.permission_icon).getResourceId(type, 0));((ImageView) itemView.findViewById(R.id.item_img)).setColorFilter(filter);((TextView) itemView.findViewById(R.id.item_title)).setText(title);((TextView) itemView.findViewById(R.id.item_info)).setText(info);mListLayout.addView(itemView);}````这里就是权限名称以及相应描述和图片的创建。具体内容我们声明在attrs.xml文件中,内容如下:````c<!-- 权限图标【可根据实际情况修改】注意位置要和下边title、info相对应 --><integer-array name="permission_icon"><item>@drawable/permission_ic_storage</item><item>@drawable/permission_ic_camera</item><item>@drawable/permission_ic_location</item><item>@drawable/permission_ic_phone</item><item>@drawable/permission_ic_phone</item><item>@drawable/permission_ic_micro_phone</item><item>@drawable/permission_ic_calendar</item><item>@drawable/permission_ic_contacts</item><item>@drawable/permission_ic_sms</item><item>@drawable/permission_ic_sensors</item></integer-array><!-- 权限标题【可根据实际情况修改 --><string-array name="permission_title"><item>文件存储</item><item>照相机</item><item>位置信息</item><item>本机识别码</item><item>拨打电话</item><item>录制声音</item><item>日程信息</item><item>通讯录</item><item>短信信息</item><item>传感器</item></string-array><!-- 权限说明(这里应该是根据项目的实际情况,简要说明下该权限主要用于什么场景或者功能)【可根据实际情况修改】 --><string-array name="permission_info"><item>允许应用读取、写入外部存储,应用于版本更新、相册功能</item><item>允许应用访问摄像头进行拍照,应用于个人头像功能</item><item>允许应用获取定位信息</item><item>允许应用获取本机识别码,应用于账号和手机的绑定关系,该权限为必须权限</item><item>允许应用内拨打电话,应用于联系客服</item><item>允许应用通过手机或耳机的麦克风录制声音</item><item>允许应用读取用户的日程信息</item><item>允许应用访问联系人通讯录信息</item><item>允许应用获取短信信息</item><item>允许应用获取传感器信息</item></string-array>
注意标题、图像、描述位置是一一对应的,这里权限的位置在后边我们会用到。
2. PermissionUtils类
public static void checkPermission(final Activity activity, final OnPermissionListener grantedListener, final String... permissions) {boolean havePermission = true;final ArrayList<Integer> types = new ArrayList<Integer>();for (String permission : permissions) {switch (permission) {case Manifest.permission.WRITE_EXTERNAL_STORAGE:case Manifest.permission.READ_EXTERNAL_STORAGE:if (!types.contains(PermissionType.STORAGE)) {types.add(PermissionType.STORAGE);}break;case Manifest.permission.CAMERA:if (!types.contains(PermissionType.CAMERA)) {types.add(PermissionType.CAMERA);}break;case Manifest.permission.READ_PHONE_STATE:if (!types.contains(PermissionType.PHONE)) {types.add(PermissionType.PHONE);}break;case Manifest.permission.CALL_PHONE:if (!types.contains(PermissionType.CALLPHONE)) {types.add(PermissionType.CALLPHONE);}break;case Manifest.permission.ACCESS_COARSE_LOCATION:if (!types.contains(PermissionType.LOCATION)) {types.add(PermissionType.LOCATION);}break;case Manifest.permission.READ_SMS:case Manifest.permission.SEND_SMS:if (!types.contains(PermissionType.SMS)) {types.add(PermissionType.SMS);}break;default:break;}if (ActivityCompat.checkSelfPermission(activity, permission) != PackageManager.PERMISSION_GRANTED) {havePermission = false;}}if (!havePermission) {PermissionDialogUtil permissionDialog = new PermissionDialogUtil(activity, types);permissionDialog.setOnSureClickListener(new PermissionDialogUtil.OnSureClickListener() {@Overridepublic void onSureClick() {types.clear();RxPermissions rxPermission = new RxPermissions((FragmentActivity) activity);rxPermission.requestEachCombined(permissions).subscribe(new Consumer<Permission>() {@Overridepublic void accept(Permission permission) throws Exception {if (permission.granted) {grantedListener.onGranted();} else if (permission.shouldShowRequestPermissionRationale) {grantedListener.onRefused();} else {DialogUtils.showDotAskDialog(activity, new DialogUtils.OnDialogClickListener() {@Overridepublic void confirm() {goSystemStetting(activity);}@Overridepublic void cancel() {}});}}});}});permissionDialog.show();} else {grantedListener.onGranted();}}````在checkPermission方法中,我们比对传递过来的权限,只有需要申请的权限才会显示在弹窗中,PermissionType是一个枚举类如下:````public interface PermissionType {@IntDef({STORAGE, CAMERA, LOCATION, PHONE, CALLPHONE, SMS})@Retention(RetentionPolicy.SOURCE)@interface Type {}int STORAGE = 0;int CAMERA = 1;int LOCATION = 2;int PHONE = 3;int CALLPHONE = 4;int SMS = 8;}
注意声明的枚举后边的数字要等同于上边attrs中权限的实际位置,例如sms在attrs中就处于第八个,当然这个顺序可以自己更改,只要能对应上即可。
权限的申请流程我使用了RxPermissions的requestEachCombined方法,这个方法会将申请的权限当成一组权限,只有全部允许permission.granted才会为true,permission.shouldShowRequestPermissionRationale方法可以用来判断用户是否设置了不在提醒按钮,对于这种权限我的处理方法是下次申请直接跳转到设置页面中,让用户自行开启。DialogUtils.showDotAskDialog弹窗就是用来实现这个功能,内容简单不做介绍,源码中有。
3. 具体调用
我们只需要在需要权限申请的位置调用
PermissionUtils.checkPermission(this, new OnPermissionListener() {@Overridepublic void onGranted() {}@Overridepublic void onRefused() {Toast.makeText(getActivity(), "用户拒绝", Toast.LENGTH_SHORT).show();}}, Manifest.permission.CALL_PHONE, Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.READ_SMS);
在onGranted()方法中处理允许流程,onRefused()处理拒绝流程,如果是在Fragment中调用我们只需要将传入的this换成getActivity()。具体需要申请的权限个数不固定,也可以传入一个。
4、权限管理
对于应用中需要的隐私权限我们需要对他们进行管理,效果参照支付宝。
实现也很简单,我们只需要在PermissionUtils类中增加一个checkPermission()方法,这个方法是用来判断权限是否申请。
public static boolean checkPermission(final Activity activity, String... permissions) {for (String permission : permissions) {if (ActivityCompat.checkSelfPermission(activity, permission) != PackageManager.PERMISSION_GRANTED) {return false;}}return true;}
然后我们在权限管理页面的onResume()方法中进行状态的判断即可。
@Overridepublic void onResume() {super.onResume();if (PermissionUtils.checkPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE)) {ps_storage.setTvRightStyle(getResources().getString(R.string.tv_right), getResources().getColor(R.color.title_text2));} else {ps_storage.setTvRightStyle(getResources().getString(R.string.tv_right_no), getResources().getColor(R.color.link_color));}if (PermissionUtils.checkPermission(getActivity(), Manifest.permission.CAMERA)) {ps_camera.setTvRightStyle(getResources().getString(R.string.tv_right), getResources().getColor(R.color.title_text2));} else {ps_camera.setTvRightStyle(getResources().getString(R.string.tv_right_no), getResources().getColor(R.color.link_color));}if (PermissionUtils.checkPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION)) {ps_location.setTvRightStyle(getResources().getString(R.string.tv_right), getResources().getColor(R.color.title_text2));} else {ps_location.setTvRightStyle(getResources().getString(R.string.tv_right_no), getResources().getColor(R.color.link_color));}if (PermissionUtils.checkPermission(getActivity(), Manifest.permission.CALL_PHONE)) {ps_phone.setTvRightStyle(getResources().getString(R.string.tv_right), getResources().getColor(R.color.title_text2));} else {ps_phone.setTvRightStyle(getResources().getString(R.string.tv_right_no), getResources().getColor(R.color.link_color));}if (PermissionUtils.checkPermission(getActivity(), Manifest.permission.READ_SMS)) {ps_sms.setTvRightStyle(getResources().getString(R.string.tv_right), getResources().getColor(R.color.title_text2));} else {ps_sms.setTvRightStyle(getResources().getString(R.string.tv_right_no), getResources().getColor(R.color.link_color));}}
跳转手机设置中心的方法如下:
public void goSystemStetting() {Intent intent = getAppDetailSettingIntent();startActivity(intent);}private Intent getAppDetailSettingIntent() {Intent localIntent = new Intent();localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {localIntent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");localIntent.setData(Uri.fromParts("package", getActivity().getPackageName(), null));} else if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.FROYO) {localIntent.setAction(Intent.ACTION_VIEW);localIntent.setClassName("com.android.settings", "com.android.settings.InstalledAppDetails");localIntent.putExtra("com.android.settings.ApplicationPkgName", getActivity().getPackageName());}return localIntent;}
5、项目地址
https://github.com/li-21/PermissionU
Permission权限管理——隐私权限具体说明相关推荐
- JAVAWEB开发之权限管理(一)——权限管理详解(权限管理原理以及方案)、不使用权限框架的原始授权方式详解
知识清单 1.了解基于资源的权限管理方式 2. 掌握权限数据模型 3. 掌握基于url的权限管理(不使用Shiro权限框架的情况下实现权限管理) 4. shiro实现用户认证 5. shiro实现用户 ...
- 用户权限管理之权限管理
文章目录 1 基本权限 2 权限管理 3 权限掩码 umask 4 特殊权限 5 特殊属性 1 基本权限 权限 对应数字 意义 r(readable) 4 可读 w(writable) 2 可写 x( ...
- python用户权限管理_python---RBAC权限管理项目
设计标准一 **** 项目需求描述:这是一个真实的项目后端管理平台 要实现如下的功能: 1.在管理页面输入用户名密码,可以登陆到主页 2.不同角色的用户显示的菜单个数不同 3.同一角色用 ...
- Android pms权限管理,Android权限机制
为什么有权限机制 我们知道 Android 应用程序是沙箱隔离的,每个应用都有一个只有自己具有读写权限的专用数据目录.但是如果应用要访问别人的组件或者一些设备上全局可访问的资源,这时候权限机制就能系统 ...
- 麦克风android权限管理,android权限处理详解
写在前面 对于android 6.0来说,增加了权限的管理,能够更好的保护用户的隐私,当用户需要某权限时,才动态的去申请.用户也可以在应用权限管理里面关闭和打开.为了方便以后使用,这里对权限使用相关做 ...
- 原生android 权限管理,Android 权限管理(原生、EasyPermissions、RxPermissions)
前言:动态权限管理是Android6.0(Build.VERSION_CODES.M = Api23)推出的,提醒用户当前APP所需要的权限,防止滥用.这些权限一般分为三种:(1)普通权限:直接man ...
- Android pms权限管理,PMS权限管理和鉴权过程
一.权限的管理基础知识 1.系统的权限机制分为:权限解析.权限分配.鉴权.动态添加权限 2.PermissionInfo : PackageParser.Permission中包含一个对应的Perm ...
- Linux 权限管理: 权限的概念、权限管理、文件访问权限的设置、 粘滞位
Linux下的基本指令 目录: 权限的概念 权限管理 文件访问权限的设置方法 目录的权限 粘滞位 权限的概念 Linux下用户有两种: 超级用户(root).普通用户. 超级用户:具有最高权限,可以在 ...
- java linux 权限管理_权限管理java实现(源于Linux中的权限管理算法)
这个帖子由来已久吧,我也是到处搜到的,然后仔细学习,果然博大精深,然后加强点弄点自己的东西 我已声明 部分转载!! 向大家介绍一种很不错,也是Linux中的权限管理算法. 定义a^b为:a的b次方 假 ...
最新文章
- Hibernate中使用Criteria查询及注解——(Emp.hbm.xml)
- 情境感知技术是什么?
- 关于Java基础需要注意的点
- 答辩攻略之二:纯方案赛
- 小学数学里的必胜问题,在扑克牌游戏里的应用
- TP3.2设置URL伪静态满足更好的SEO效果
- 将APP打包为IPA
- 各种数据传输总线的传输速率是多少?这些速率是如何计算出来的?数据传输的速率单位有哪些以及有哪些区别?Bps,bps,Byte/s,bit/s,kbps等等
- 获取当天23时59分59秒
- Android安全[app风险]
- 血仍未冷——写在37岁生日
- CJBorderView 一种iOS开发中常用的虚线边框View------* An easy way to init a view with dotted line border
- PHP:preg_match
- 基础(一)十六进制转八进制
- [心情] 如果有一天
- 单细胞转录组分析R包安装
- android播放器:MediaPlayer ExoPlayer ijkplayer
- STM32H7xx 串口DMA发送接收(LL库)
- html5 seo 产品经理,seo角度如何做好产品经理
- agv ti 毫米波雷达_ADAS防撞预警系统、激光雷达和毫米波雷达系统的优缺点