再谈Android6.0 运行时权限(快速处理)
来源:互联网 发布:mac信仰灯会影响屏幕吗 编辑:程序博客网 时间:2024/06/12 20:09
6.0的运行时权限过去很久了,现在看来这个机制的意义应该是让用户知道了“权限”这么个东西的存在。
Android共有9组隐私权限需要运行时检测。
同一个权限组的任何一个权限被授权了,这个权限组的其他权限也自动被授权。
1.日历 |CALENDAR | READ_CALENDAR,WRITE_CALENDAR |
2.相机 |CAMERA | CAMERA |
3.通讯录 |CONTACTS | READ_CONTACTS,WRITE_CONTACTS,GET_ACCOUNTS |
4.位置 |LOCATION | ACCESS_FINE_LOCATION,ACCESS_COARSE_LOCATION |
5.话筒 |MICROPHONE | RECORD_AUDIO |
6.打电话 |PHONE | READ_PHONE_STATE,CALL_PHONE,READ_CALL_LOG,
WRITE_CALL_LOG,ADD_VOICEMAIL,USE_SIP,PROCESS_OUTGOING_CALLS |
|SENSORS | BODY_SENSORS |
7.短信 |SMS | SEND_SMS,RECEIVE_SMS,READ_SMS,RECEIVE_WAP_PUSH,RECEIVE_MMS |
8.存储 |STORAGE | READ_EXTERNAL_STORAGE,WRITE_EXTERNAL_STORAGE |
9.传感器| SENSORS
虽然官方给了九种,但由于国产rom的优化,与官方有差异,部分权限默认不是隐私权限。
运行时检测权限的方法,不再赘述,官方文档,或者百度足矣了解,这里贴上自己封装的运行时权限检测工具(这里为每次只请求单个权限),不正之处还请请指教
先看使用时的例子
PermiUtils.inspectPermi(mActivity, PermiUtils.LOCATION, new IPermissionCallback() { @Override public void onPermissionAgree(int requestCode, String perms) { //授予了权限要做的操作在这里 Toast.makeText(mContext, "给予权限="+permiName, Toast.LENGTH_LONG).show(); } @Override public void onPermissionReject(int requestCode, String perms) { Toast.makeText(mContext, "拒绝权限="+permiName, Toast.LENGTH_LONG).show(); } });-------------- @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); PermiUtils.onRequestPermissionsResult(requestCode, permissions, grantResults, mActivity); }
工具类
public interface IPermissionCallback { /** * 给予了权限 * @param requestCode * @param perms */ void onPermissionAgree(int requestCode, String perms); /** * 拒绝权限 * @param requestCode * @param perms */ void onPermissionReject(int requestCode, String perms);}-----------------------------------------------------public class PermiUtils { /** * 存储权限 **/ public static final int STORAGE = 1;//存储权限 /** * 相机权限 **/ public static final int CAMERA = 2;//相机权限 /** * 位置权限 **/ public static final int LOCATION = 3;//位置权限 /** * 打电话权限 **/ public static final int PHONE = 4;//打电话权限 /** * 通讯录权限 **/ public static final int CONTACTS = 5;//通讯录权限 /** * 话筒权限 **/ public static final int MICROPHONE = 6;//话筒权限 /** * 日历权限 **/ public static final int CALENDAR = 7;//日历权限 /** * 短信权限 **/ public static final int SMS = 8;//短信权限 /** * 传感器 **/ public static final int SENSORS = 9;//传感器 private static IPermissionCallback permissionCallback; /** * 检查权限 * * @param activity * @param requestCode */ public static void inspectPermi(Activity activity, int requestCode, IPermissionCallback callback) { String permiNames = getPermiNames(requestCode); permissionCallback = callback; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (ActivityCompat.checkSelfPermission(activity, permiNames) != PackageManager.PERMISSION_GRANTED) { AppLog.d("无权限" + permiNames); //需要权限,告诉用户 ActivityCompat.requestPermissions(activity, new String[]{permiNames}, requestCode); return; } } if (permissionCallback != null) permissionCallback.onPermissionAgree(requestCode, permiNames); } /** * 选择回调 * * @param requestCode * @param permissions * @param grantResults * @param mActivity */ public static void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults, Activity mActivity) { if (grantResults.length <= 0 || permissions.length <= 0) { AppLog.d("权限请求回调异常length<=0"); return; } AppLog.d(grantResults[0] + "处理权限" + permissions[0]); if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { AppLog.d("给予了权限" + permissions[0]); if (permissionCallback != null) permissionCallback.onPermissionAgree(requestCode, permissions[0]); } else { if (!ActivityCompat.shouldShowRequestPermissionRationale(mActivity, permissions[0])) { AppLog.d("拒绝授权且不再提醒"); //用户不同意,且勾选了对话框不再提醒 } AppLog.d("拒绝授权" + permissions[0]); if (permissionCallback != null) permissionCallback.onPermissionReject(requestCode, permissions[0]); } } private static String getPermiNames(int requestCode) { String permiNames = null; switch (requestCode) { case STORAGE: permiNames = Manifest.permission.READ_EXTERNAL_STORAGE; break; case CAMERA: permiNames = Manifest.permission.CAMERA; break; case LOCATION: permiNames = Manifest.permission.ACCESS_FINE_LOCATION; break; case PHONE: permiNames = Manifest.permission.READ_PHONE_STATE; break; case CONTACTS: permiNames = Manifest.permission.READ_CONTACTS; break; case MICROPHONE: permiNames = Manifest.permission.RECORD_AUDIO; break; case CALENDAR: permiNames = Manifest.permission.READ_CALENDAR; break; case SMS: permiNames = Manifest.permission.SEND_SMS; break; case SENSORS: permiNames = Manifest.permission.BODY_SENSORS; break; } return permiNames; }}
- 再谈Android6.0 运行时权限(快速处理)
- Android6.0运行时权限处理
- Android6.0运行时权限处理详解
- android6.0运行时权限处理简介
- Android6.0运行时权限处理
- Android6.0运行时权限处理透析
- Android6.0运行时权限的处理
- 关于Android6.0运行时权限处理
- Android6.0+运行时权限的处理
- Android6.0运行时权限(一)
- Android6.0运行时权限的处理及解决办法
- android6.0 运行时权限处理完全解析
- Android6.0运行时权限处理-超简单封装
- Android6.0运行时权限:处理定位和存储问题
- Android6.0运行时权限处理架构搭建
- Android6.0运行时权限的处理及解决办法
- Android6.0 运行时权限
- Android6.0 运行时权限
- python资源大全+自己常用库
- Java 基础-- 实现java多线程的方法
- 基础知识3
- 量化金融第一步获取市场数据 (Python Tushare)
- 注解@PostConstruct与@PreDestroy讲解及实例
- 再谈Android6.0 运行时权限(快速处理)
- 分布式tensorflow测试 同步更新结果及问题
- Codeforces777E. Hanoi Factory
- Android振动器(Vibrator)系统详解
- vtk中读写raw数据的方法
- fiddler访问https 网页打不开 在fiddler抓包出现tunnel to 443的问题
- 循环遍历不确定长度数组
- 一:《方田》-- 11
- UITableView的contentInset属性