android 6.0权限申请封装

来源:互联网 发布:阿里云大学下载 编辑:程序博客网 时间:2024/06/05 08:24

此篇文章目的在于封装android 6.0权限申请,让开发者能进行快速开发。开发者只需要在项目中添加一个工具类,在baseActivity中添加几个方法,在需要的activity中添加三个方法即可~

权限流程

关于android 6.0权限问题,大家如果用api23+编译的话,应该都有遇到过crash的情况。google开发团队觉得有些隐私权限,希望得到用户许可,以弹出框的形式告诉用户,其权限流程如下: 
这里写图片描述

但是系统弹框会有不再提示的问题,如果用户勾选了不再提示,就进不了app了,这样体验很差,基于此,新的权限流程如下: 
这里写图片描述

危险权限列表

如果你的activity中有用到如下权限,就需要申请权限哦~

CALENDARREAD_CALENDAR 

WRITE_CALENDARCAMERACAMERACONTACTSREAD_CONTACTS 

WRITE_CONTACTS 

GET_ACCOUNTSLOCATIONACCESS_FINE_LOCATION 

ACCESS_COARSE_LOCATIONMICROPHONERECORD_AUDIOPHONEREAD_PHONE_STATE

CALL_PHONE

READ_CALL_LOG

WRITE_CALL_LOG

ADD_VOICEMAIL

USE_SIP

PROCESS_OUTGOING_CALLSSENSORSBODY_SENSORSSMSSEND_SMS RECEIVE_SMS

READ_SMS

RECEIVE_WAP_PUSH

RECEIVE_MMSSTORAGEREAD_EXTERNAL_STORAGE

WRITE_EXTERNAL_STORAGE

此列表是在网上找的,关于SMS有歧义,我在项目中有用到发短信功能,但是缺不属于危险权限。

封装

首先定义一个工具类,判断是否缺少权限:

 //检查权限时,判断系统的权限集合    public boolean permissionSet(String... permissions) {        for (String permission : permissions) {            if (isLackPermission(permission)) {//是否添加完全部权限集合                return true;            }        }        return false;    }    //检查系统权限是,判断当前是否缺少权限(PERMISSION_DENIED:权限是否足够)    private boolean isLackPermission(String permission) {        return ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_DENIED;    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

然后,在你的baseActivity中作如下封装:

//首先声明权限授权    public static final int PERMISSION_DENIEG = 1;//权限不足,权限被拒绝的时候    public static final int PERMISSION_REQUEST_CODE = 0;//系统授权管理页面时的结果参数    public static final String PACKAGE_URL_SCHEME = "package:";//权限方案    public CheckPermission checkPermission;//检测权限类的权限检测器    private boolean isrequestCheck = true;//判断是否需要系统权限检测。防止和系统提示框重叠    public abstract int initContentID();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        initContentID();        process(savedInstanceState);    }    //显示对话框提示用户缺少权限    public void showMissingPermissionDialog() {        AlertDialog.Builder builder = new AlertDialog.Builder(this);        builder.setTitle(R.string.help);//提示帮助        builder.setMessage(R.string.string_help_text);        //如果是拒绝授权,则退出应用        //退出        builder.setNegativeButton(R.string.quit, new DialogInterface.OnClickListener() {            @Override            public void onClick(DialogInterface dialog, int which) {                finish();            }        });        //打开设置,让用户选择打开权限        builder.setPositiveButton(R.string.settings, new DialogInterface.OnClickListener() {            @Override            public void onClick(DialogInterface dialog, int which) {                startAppSettings();//打开设置            }        });        builder.setCancelable(false);        builder.show();    }    //获取全部权限    public boolean hasAllPermissionGranted(int[] grantResults) {        for (int grantResult : grantResults) {            if (grantResult == PackageManager.PERMISSION_DENIED) {                return false;            }        }        return true;    }    //打开系统应用设置(ACTION_APPLICATION_DETAILS_SETTINGS:系统设置权限)    public void startAppSettings() {        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);        intent.setData(Uri.parse(PACKAGE_URL_SCHEME + getPackageName()));        startActivity(intent);    }    //请求权限去兼容版本    public void requestPermissions(String... permission) {        ActivityCompat.requestPermissions(this, permission, PERMISSION_REQUEST_CODE);    }    /**     * 用于权限管理     * 如果全部授权的话,则直接通过进入     * 如果权限拒绝,缺失权限时,则使用dialog提示     *     * @param requestCode  请求代码     * @param permissions  权限参数     * @param grantResults 结果     */    @Override    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {        super.onRequestPermissionsResult(requestCode, permissions, grantResults);        if (PERMISSION_REQUEST_CODE == requestCode && hasAllPermissionGranted(grantResults)) //判断请求码与请求结果是否一致        {            isrequestCheck = true;//需要检测权限,直接进入,否则提示对话框进行设置            getAllGrantedPermission();        } else {            //提示对话框设置            isrequestCheck = false;            showMissingPermissionDialog();//dialog        }    }    /*    * 当获取到所需权限后,进行相关业务操作     */    public void getAllGrantedPermission() {    }    protected void process(Bundle savedInstanceState) {        if (getPermissions() != null) {            checkPermission = new CheckPermission(this);            if (checkPermission.permissionSet(getPermissions())) {                requestPermissions(getPermissions());     //去请求权限            } else {                getAllGrantedPermission();            }        }    }    @Override    protected void onResume() {        super.onResume();        //根据activity生命周期,onRestart()->onResume()        //此处表示从系统设置页面返回后,检查用户是否将所需的权限打开        if (!isrequestCheck) {            if (getPermissions() != null) {                if (checkPermission.permissionSet(getPermissions())) {                    showMissingPermissionDialog();//dialog                } else {                    //获取全部权限,走正常业务                    getAllGrantedPermission();                }            }        } else {            isrequestCheck = true;        }    }    public String[] getPermissions() {        return null;    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134

最后,在你的activity中,重写以下几个方法:

static final String[] PERMISSION = new String[]{            Manifest.permission.WRITE_EXTERNAL_STORAGE,// 写入权限            Manifest.permission.READ_EXTERNAL_STORAGE,  //读取权限            Manifest.permission.READ_PHONE_STATE,        //读取设备信息            Manifest.permission.ACCESS_COARSE_LOCATION, //百度定位            Manifest.permission.ACCESS_FINE_LOCATION,    };    //布局id上送到BaseActivity    @Override    public int initContentID() {        return R.layout.activity_main;    }    @Override    protected void process(Bundle savedInstanceState) {        super.process(savedInstanceState);        //如果有什么需要初始化的,在这里写就好~    }    @Override    public void getAllGrantedPermission() {        //当获取到所需权限后,进行相关业务操作        super.getAllGrantedPermission();    }    @Override    public String[] getPermissions() {        return PERMISSION;    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

当然了,如果你的activity中不包含危险权限,也就不用重写方法getPermissions()和getAllGrantedPermission(),你只需要在方法process()中作初始化相关操作就好啦!

2 0
原创粉丝点击