Android 6.0权限逻辑详解
来源:互联网 发布:淘宝店铺怎样使用seo 编辑:程序博客网 时间:2024/06/05 14:26
Android6.0权限需要主动申请已经很久了,这里写一篇文章记录下。
这类的文章也很多,各位可以百度参考下,下面我只是把权限申请的逻辑详细介绍下,并附上DEMO代码。
具体逻辑可以看上面的图片,逻辑已经很详细了。
请求单个权限
public void startCamera(View view) { requestPermission(Manifest.permission.CAMERA, Manifest.permission.READ_CONTACTS); } private void requestPermission(String... permissions) { if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { // 第一次请求权限时,用户如果拒绝,下一次请求shouldShowRequestPermissionRationale()返回true // 向用户解释为什么需要这个权限 if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) { new AlertDialog.Builder(this) .setMessage("申请相机权限") .setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //申请相机权限 ActivityCompat.requestPermissions(SinglePermissionActivity.this, new String[]{Manifest.permission.CAMERA}, CAMERA_REQUEST_CODE); } }) .show(); } else { //申请相机权限 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, CAMERA_REQUEST_CODE); } } else { tvPermissionStatus.setTextColor(Color.GREEN); tvPermissionStatus.setText("相机权限已申请"); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == CAMERA_REQUEST_CODE) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { tvPermissionStatus.setTextColor(Color.GREEN); tvPermissionStatus.setText("相机权限已申请"); } else { //用户勾选了不再询问 //提示用户手动打开权限 if (!ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) { tvPermissionStatus.setText("相机权限已被禁止,需手动打开"); tvPermissionStatus.setTextColor(Color.RED); } else { tvPermissionStatus.setText("相机权限已被禁止,可再次申请"); tvPermissionStatus.setTextColor(Color.RED); } } } }
请求多个权限
public void startCamera(View view) { requestPermission(Manifest.permission.CAMERA, Manifest.permission.READ_CONTACTS); } private void requestPermission(String... permissions) { List<String> deniedPermissions = findDeniedPermissions(this, permissions); if (deniedPermissions.size() > 0) { ActivityCompat.requestPermissions(this, deniedPermissions.toArray(new String[deniedPermissions.size()]), CAMERA_REQUEST_CODE); } else { tvPermissionStatus.setText("相机、联系人权限已申请"); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == CAMERA_REQUEST_CODE) { StringBuilder builder = new StringBuilder(); for (int i = 0; i < permissions.length; i++) { if (grantResults[i] == PackageManager.PERMISSION_GRANTED) { builder.append(permissions[i] + "权限已申请" + "\n"); } else { //用户勾选了不再询问,提示用户手动打开权限 if (!ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[i])) { builder.append(permissions[i] + "权限已被禁止,需手动打开" + "\n"); } else { builder.append(permissions[i] + "权限已被禁止,可再次申请" + "\n"); } } } tvPermissionStatus.setText(builder.toString()); } } @TargetApi(value = Build.VERSION_CODES.M) public List<String> findDeniedPermissions(Context context, String... permission) { List<String> denyPermissions = new ArrayList<>(); for (String value : permission) { if (ContextCompat.checkSelfPermission(context, value) != PackageManager.PERMISSION_GRANTED) { denyPermissions.add(value); } } return denyPermissions; }
参考:Android 6.0运行时权限详解
DEMO下载地址
阅读全文
0 0
- Android 6.0权限逻辑详解
- android 6.0权限详解
- Android 6.0 权限管理详解
- Android 6.0权限使用详解
- Android 6.0 权限机制详解
- Android 6.0权限申请详解及权限资料整理
- 详解Android 6.0运行时权限
- Android 6.0 运行时权限详解
- Android 6.0运行时权限详解
- Android 6.0运行时权限详解
- Android 6.0 动态权限申请详解
- Android 6.0运行时获取权限详解
- Android 6.0运行时权限详解
- Android 6.0权限详解及封装
- Android 6.0运行时权限详解
- Android 6.0 运行时权限详解
- Android权限详解
- Android权限详解
- DNS相关名词解释(CNAME)
- DevExpress控件使用之SearchLookUpEdit (多选)
- BottomNavigationView 的使用
- WinDBG 技巧:如何生成Dump 文件(.dump 命令)
- python(小总结) 占位符、时间、
- Android 6.0权限逻辑详解
- 使用okhttp3简单执行网络请求
- Unity热更新方案
- 多媒体文件格式之TS
- c#中链接数据库的“增删改查”的通用方法
- MFC的使用 在共享DLL中使用MFC 和在静态库中使用MFC的区别
- charles抓包抓吧抓吧 wirshark拜拜了您那
- 【android】RxJava1原理解析
- 简单代码(根据安卓自带属性确定当前经纬度)