android 自定义权限管理
在Android6.0后有些权限就需要进行询问,虽然可以将targetSdkVersion设置成小于等于23,但是这样可能有些东西无法使用,所以要进行权限的管理。
实现逻辑:打开页面就询问权限,如果没有权限就出现系统提示框,如果拒绝则弹出自定义警告框,左边是设置跳到系统的权限的界面,右边是结束当前的页面。
AndroidManifest.xml
- <!--危险权限-->
- <uses-permission android:name="android.permission.RECORD_AUDIO"/>
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- <!--一般权限-->
- <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
- MainActivity.java
- package com.kkrs.permission;
- import android.Manifest;
- import android.content.Intent;
- import android.support.v7.app.AppCompatActivity;
- import android.os.Bundle;
- public class MainActivity extends AppCompatActivity {
- private static final int REQUEST_CODE = 0; // 请求码
- // 所需的全部权限
- static final String[] PERMISSIONS = new String[]{
- Manifest.permission.RECORD_AUDIO,
- Manifest.permission.MODIFY_AUDIO_SETTINGS,
- Manifest.permission.WRITE_EXTERNAL_STORAGE
- };
- private PermissionsChecker mPermissionsChecker; // 权限检测器
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- mPermissionsChecker = new PermissionsChecker(this);
- }
- @Override protected void onResume() {
- super.onResume();
- // 缺少权限时, 进入权限配置页面
- if (mPermissionsChecker.lacksPermissions(PERMISSIONS)) {
- startPermissionsActivity();
- }
- }
- private void startPermissionsActivity() {
- PermissionsActivity.startActivityForResult(this, REQUEST_CODE, PERMISSIONS);
- }
- @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- super.onActivityResult(requestCode, resultCode, data);
- // 拒绝时, 关闭页面, 缺少主要权限, 无法运行
- if (requestCode == REQUEST_CODE && resultCode == PermissionsActivity.PERMISSIONS_DENIED) {
- finish();
- }
- }
- }
- PermissionsChecker.java
- package com.kkrs.permission;
- import android.content.Context;
- import android.content.pm.PackageManager;
- import android.support.v4.content.ContextCompat;
- /**
- * Created by zd on 2018/12/10.
- */
- public class PermissionsChecker {
- private final Context mContext;
- public PermissionsChecker(Context context) {
- mContext = context.getApplicationContext();
- }
- // 判断权限集合
- public boolean lacksPermissions(String... permissions) {
- for (String permission : permissions) {
- if (lacksPermission(permission)) {
- return true;
- }
- }
- return false;
- }
- // 判断是否缺少权限
- private boolean lacksPermission(String permission) {
- return ContextCompat.checkSelfPermission(mContext, permission) ==
- PackageManager.PERMISSION_DENIED;
- }
- }
- PermissionsActivity.java
- package com.kkrs.permission;
- import android.app.Activity;
- import android.app.AlertDialog;
- import android.content.DialogInterface;
- import android.content.Intent;
- import android.content.pm.PackageManager;
- import android.net.Uri;
- import android.os.Bundle;
- import android.provider.Settings;
- import android.support.annotation.NonNull;
- import android.support.annotation.Nullable;
- import android.support.v4.app.ActivityCompat;
- import android.support.v7.app.AppCompatActivity;
- /**
- * Created by zd on 2018/12/10.
- */
- public class PermissionsActivity extends AppCompatActivity {
- public static final int PERMISSIONS_GRANTED = 0; // 权限授权
- public static final int PERMISSIONS_DENIED = 1; // 权限拒绝
- private static final int PERMISSION_REQUEST_CODE = 0; // 系统权限管理页面的参数
- private static final String EXTRA_PERMISSIONS =
- "com.kkrs.permission.permission.extra_permission"; // 权限参数
- private static final String PACKAGE_URL_SCHEME = "package:"; // 方案
- private PermissionsChecker mChecker; // 权限检测器
- private boolean isRequireCheck; // 是否需要系统权限检测
- // 启动当前权限页面的公开接口
- public static void startActivityForResult(Activity activity, int requestCode, String... permissions) {
- Intent intent = new Intent(activity, PermissionsActivity.class);
- intent.putExtra(EXTRA_PERMISSIONS, permissions);
- ActivityCompat.startActivityForResult(activity, intent, requestCode, null);
- }
- @Override protected void onCreate(@Nullable Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- if (getIntent() == null || !getIntent().hasExtra(EXTRA_PERMISSIONS)) {
- throw new RuntimeException("PermissionsActivity需要使用静态startActivityForResult方法启动!");
- }
- setContentView(R.layout.activity_permissions);
- mChecker = new PermissionsChecker(this);
- isRequireCheck = true;
- }
- @Override protected void onResume() {
- super.onResume();
- if (isRequireCheck) {
- String[] permissions = getPermissions();
- if (mChecker.lacksPermissions(permissions)) {
- requestPermissions(permissions); // 请求权限
- } else {
- allPermissionsGranted(); // 全部权限都已获取
- }
- } else {
- isRequireCheck = true;
- }
- }
- // 返回传递的权限参数
- private String[] getPermissions() {
- return getIntent().getStringArrayExtra(EXTRA_PERMISSIONS);
- }
- // 请求权限兼容低版本
- private void requestPermissions(String... permissions) {
- ActivityCompat.requestPermissions(this, permissions, PERMISSION_REQUEST_CODE);
- }
- // 全部权限均已获取
- private void allPermissionsGranted() {
- setResult(PERMISSIONS_GRANTED);
- finish();
- }
- /**
- * 用户权限处理,
- * 如果全部获取, 则直接过.
- * 如果权限缺失, 则提示Dialog.
- *
- * @param requestCode 请求码
- * @param permissions 权限
- * @param grantResults 结果
- */
- @Override
- public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
- if (requestCode == PERMISSION_REQUEST_CODE && hasAllPermissionsGranted(grantResults)) {
- isRequireCheck = true;
- allPermissionsGranted();
- } else {
- isRequireCheck = false;
- showMissingPermissionDialog();
- }
- }
- // 含有全部的权限
- private boolean hasAllPermissionsGranted(@NonNull int[] grantResults) {
- for (int grantResult : grantResults) {
- if (grantResult == PackageManager.PERMISSION_DENIED) {
- return false;
- }
- }
- return true;
- }
- // 显示缺失权限提示
- private void showMissingPermissionDialog() {
- AlertDialog.Builder builder = new AlertDialog.Builder(PermissionsActivity.this);
- builder.setTitle("权限标题");
- builder.setMessage("需要权限的内容");
- // 拒绝, 退出应用
- builder.setNegativeButton("退出", new DialogInterface.OnClickListener() {
- @Override public void onClick(DialogInterface dialog, int which) {
- setResult(PERMISSIONS_DENIED);
- finish();
- }
- });
- builder.setPositiveButton("设置", new DialogInterface.OnClickListener() {
- @Override public void onClick(DialogInterface dialog, int which) {
- startAppSettings();
- }
- });
- builder.show();
- }
- // 启动应用的设置
- private void startAppSettings() {
- Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
- intent.setData(Uri.parse(PACKAGE_URL_SCHEME + getPackageName()));
- startActivity(intent);
- }
- }
效果
android 自定义权限管理的更多相关文章
- 大约Android 了解权限管理
如Android应用程序开发人员.为android权限机制一直觉得很奇怪.为什么要这个东西权限?为什么要AndroidManifest里面写的uses-permission 这样的事情?我一直搞不清楚 ...
- DRF内置权限组件之自定义权限管理类
DRF内置权限组件permissions 权限控制可以限制用户对于视图的访问和对于具体数据对象的访问. 在执行视图的dispatch()方法前,会先进行视图访问权限的判断 在通过get_object( ...
- Android 开发 权限管理
Android 开发 权限管理 https://sspai.com/post/42779 $ adb shell pm list permissions -d -g https://zhuanlan. ...
- Android自定义权限和使用权限
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 自定义权限,主要用于保护被赋予权限的组件.如无权限与有权限,正如public与private的对类保 ...
- [Android Pro] android 4.4 Android原生权限管理:AppOps
reference : http://m.blog.csdn.net/blog/langzxz/45308199 reference : http://blog.csdn.net/hyhyl1990/ ...
- Android自定义权限
一.自定义权限 自定义权限,一般是考虑到应用共享组件时的安全问题.我们知道在四大组件 AndroidManifest 中注册的时候,添加 exported = "true" 这一属 ...
- android sdcard 权限管理策略研究
自从android4.4 以来,第三方应用程序是不能再随便的访问sdcard了,从开发者的角度而言,研究一下android系统到底是怎么样来实现这样的控制还是比较有价值的. 首先分析下现状,现在已知, ...
- Android 自定义权限 (<permission> <uses-permission>)
在android系统的安全模型中,应用程序在默认的情况下不可以执行任何对其他应用程序,系统或者用户带来负面影响的操作.如果应用需要执行某些操作,就需要声明使用这个操作对应的权限. (在manifest ...
- Android自定义权限与使用
1. 如何自定义权限 Android允许我们使用permission标签,在Manifest文件中定义属于自己的权限,一个例子如下, <?xml version="1.0" ...
随机推荐
- .NET之JSON序列化运用
1.项目引用NuGet包:搜索:Newtonsoft.Json 2.序列号实例 using System; using System.Collections.Generic; using System ...
- nginx常用配置系列-静态资源处理
接上篇,nginx处理静态资源的能力很强,后端服务器其实也可以处理静态资源,比如tomcat,但把非业务类的单一数据交给后端处理显然效率比较低,还有一种场景是多个站点公用一套资源集时,通过nginx可 ...
- PAT1002:A+B for Polynomials
1002. A+B for Polynomials (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue T ...
- kvm常见故障及解决
一.启动虚拟机Connection reset by peer # virsh start vmhost1error: Failed to start domain vmhost1error: Una ...
- 主成分分析PCA详解
转载请声明出处:http://blog.csdn.net/zhongkelee/article/details/44064401 一.PCA简介 1. 相关背景 上完陈恩红老师的<机器学习与知识 ...
- java中Number类理解
一般我们使用数字的时候,会使用内置的数据类型,比如int.float.double.但在实际的开发当中,我们有时候会遇到需要使用数字对象,而不是数据类型的时候.为解决这个问题,java为每一种数据类型 ...
- float之脱离文档流
所谓的文档流:指的是元素在排版过程中,元素自动从左到右,从上到下的顺序排列. 脱离文档流:也就是将元素从普通的布局排版中拿走,其他盒子在定位的时候,会当做脱离文档流的元素不存在而进行定位 只有绝对定位 ...
- SSM-Spring-14:Spring中默认自动代理DefaultAdvisorAutoProxyCreator
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 默认自动代理DefaultAdvisorAutoProxyCreator 本处没有什么要讲的,放原代码 ISo ...
- js实现html截图生成图片
没有华丽的开场,直入主题,这就是题主随笔风格.随笔既是日常工作积累,也可理解是个工作笔记,方便日后用到之处快速的有方可寻. 先讲一个需求场景: 定制网页截图传给服务器端保存,用户关注公众号后自 ...
- 17.app后端如何保证通讯安全--aes对称加密
在上文<16.app后端如何保证通讯安全--url签名>提到,url签名有两个缺点,这两个缺点,如果使用对称加密方法的话,则完全可以避免这两个缺点.在本文中,会介绍对称加密的具体原理,和详 ...