Android运行时权限工具类
来源:互联网 发布:诺基亚n9deb的软件 编辑:程序博客网 时间:2024/06/05 18:58
不想下载demo的直接复制文中代码就可以用了
demo地址:http://download.csdn.net/detail/bnm52007/9801104
为了减少重复代码,就把请求权限方法全部放在activity的基类里了,如果你不想放在基类里也可以直接把本demo的方法复制出来单独用。
此demo抽去了一个BaseActivity,请求权限时只需要传入(“要请求的权限(多个权限就传数组)”,requestCode,”用户拒绝时提示的内容”)
MainActivity.super.Requestpermission(Manifest.permission.ACCESS_COARSE_LOCATION,99,"需要位置权限才能使用");
注意事项
如果targetSdkVersion 25 小于23那一开始默认安装APP就会获得权限
demo拒绝授权提示对话框使用的时默认样式如果你的和demo的不同是因为activity的主题不同,请在清单文件修改。
一般请求权限流程:
在清单文件加上要请求的权限,activity继承OnRequestPermissionsResultCallback,重写onRequestPermissionsResult方法,判断是否请求成功
1、判断是否大于或等于23
2、判断是否已经有权限了
3、有就直接使用,没有就去请求
一次请求多个权限时,遍历数组看那权限没有就去请求那个,不重复请求以具备的权限
//单个权限请求检测,true不需要请求权限,false需要请求权限 public boolean isPermissionGranted(String permissionName) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { return true; } //判断是否需要请求允许权限 int hasPermision = checkSelfPermission(permissionName); if (hasPermision != PackageManager.PERMISSION_GRANTED) { return false; } return true; }
//多个权限请求检测,返回list,如果list.size为空说明权限全部有了不需要请求,否则请求没有的 public List<String> isPermissionsAllGranted(String[] permArray) { List<String> list = new ArrayList<>(); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { return list; } for (int i = 0; permArray != null && i < permArray.length; i++) { //获得批量请求但被禁止的权限列表 if (PackageManager.PERMISSION_GRANTED != checkSelfPermission(permArray[i])) { list.add(permArray[i]); } } return list; }
//单个权限请求protected void Requestpermission(String s, int requestCode, String defeat) { hint = defeat; if (!TextUtils.isEmpty(s)) { boolean granted = isPermissionGranted(s); if (granted) { //有权限,调用方法 okPermissionResult(requestCode); } else { requestPermissions(new String[]{s}, requestCode); } } } //多个权限请求 protected void Requestpermission(String s[], int requestCode, String defeat) { hint = defeat; if (s.length != 0) { List<String> perList = isPermissionsAllGranted(s); if (perList.size() == 0) { //有权限,调用方法 okPermissionResult(requestCode); } else { requestPermissions(perList.toArray(new String[perList.size()]), requestCode); } } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); for (int i : grantResults) { if (i != PackageManager.PERMISSION_GRANTED) { //有权限未通过 popAlterDialog(); return; } } okPermissionResult(requestCode); } //有权限调用 protected void okPermissionResult(int requestCode) { } public void popAlterDialog() { new AlertDialog.Builder(this) .setTitle("提示") .setMessage(hint) .setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }) .setPositiveButton("设置", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //前往应用详情界面 try { Uri packUri = Uri.parse("package:" + getPackageName()); Intent intent = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, packUri); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); } catch (Exception e) { Toast.makeText(BaseActivity.this, "跳转失败", Toast.LENGTH_SHORT).show(); } dialog.dismiss(); } }).create().show(); }
使用方法
//定位,单个权限请求 findViewById(R.id.tv_location).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //参数说明:权限字符串,请求标记码(requestCode),用户拒绝权限提示内容 MainActivity.super.Requestpermission(Manifest.permission.ACCESS_COARSE_LOCATION,99,"需要位置权限才能使用"); } }); //多个权限请求 findViewById(R.id.tv_allpeimission).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //参数说明:要请求的权限数组,请求标记码(requestCode),用户拒绝权限提示内容 String[] perms = { Manifest.permission.CAMERA , Manifest.permission.RECORD_AUDIO , Manifest.permission.READ_EXTERNAL_STORAGE}; MainActivity.super.Requestpermission(perms,102,"需要相机,麦克风,存储权限"); } });
@Override protected void okPermissionResult(int requestCode) { if (requestCode==99){ Toast.makeText(this,"有位置权限了",Toast.LENGTH_SHORT).show(); }else if (requestCode==102){ Toast.makeText(this,"有相机,麦克风,存储权限了",Toast.LENGTH_SHORT).show(); } }
下载demo
0 0
- Android运行时权限工具类
- android 运行时权限工具
- Android PermissionUtils:运行时权限工具类及申请权限的正确姿势
- Android 运行时权限
- android运行时权限
- Android运行时权限
- Android 运行时权限
- android运行时权限
- android运行时权限
- Android 运行时权限
- Android运行时权限
- Android 运行时权限
- Android运行时权限
- Android-运行时权限
- Android运行时权限
- Android 运行时权限
- Android运行时权限
- Android 运行时权限
- 从零开始
- Java单链表实现
- Linux 常用命令个人记录
- C++ 函数指针
- 35 个 Java 代码性能优化总结
- Android运行时权限工具类
- 娱乐视频直播背后的技术支持——DASH重构
- MongoDB的存储结构及对空间使用率的影响
- 【Prison Break】第五天(4.1)
- C#的山寨版的串口调式助手
- 【CAS】自定义数据库连接配置
- 1 多线程下载一个文件(普通的java工程:java实现)
- 【win32】高仿QQ截图
- (23)插值查找