关于Android 6.0运行时权限的一些理解和权限处理的三方库的应用

版权声明:转载请注明出处 https://blog.csdn.net/dl10210950/article/details/68485762

运行时权限:就是在手机运行中需要运用到什么权限就去申请授权什么权限;
这个是从Android 6.0出来的,在以往的Android版本里,权限只是在第一次安装的时候一次性全部授权,这就导致很多app一次申请n多个权限,私下里偷偷不知道在你手机里干什么,说不定你的艳照就被被人获取到了,基于这些个安全的考虑,所以推出了运行时权限这一说

当然,也不是所有权限都需要在运行的时候去申请授权,有些不涉及到隐私等常用的权限就不需要去动态授权了,所以新的权限策略就把权限分为了普通权限和危险权限;

普通权限:这类权限还是只需要在manifast去声明就行了,在app安装的时候直接授权,不需要去检测它们是否授权,以下就是普通权限:

ACCESS_LOCATION_EXTRA_COMMANDS
ACCESS_NETWORK_STATE
ACCESS_NOTIFICATION_POLICY
ACCESS_WIFI_STATE
BLUETOOTH
BLUETOOTH_ADMIN
BROADCAST_STICKY
CHANGE_NETWORK_STATE
CHANGE_WIFI_MULTICAST_STATE
CHANGE_WIFI_STATE
DISABLE_KEYGUARD
EXPAND_STATUS_BAR
GET_PACKAGE_SIZE
INSTALL_SHORTCUT
INTERNET
KILL_BACKGROUND_PROCESSES
MODIFY_AUDIO_SETTINGS
NFC
READ_SYNC_SETTINGS
READ_SYNC_STATS
RECEIVE_BOOT_COMPLETED
REORDER_TASKS
REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
REQUEST_INSTALL_PACKAGES
SET_ALARM
SET_TIME_ZONE
SET_WALLPAPER
SET_WALLPAPER_HINTS
TRANSMIT_IR
UNINSTALL_SHORTCUT
USE_FINGERPRINT
VIBRATE
WAKE_LOCK
WRITE_SYNC_SETTINGS

危险权限:APP运行在Android 6.0 (API level 23)或以上的设备中,并且你的Android Studio的app下的build.gradle里面的targetSdkVersion>=23时这里写图片描述
此时系统就会采取新的运行时权限策略了,需要危险权限的时候,如果没有做相应的处理app就会崩溃,这tm事情就大了!以下就是危险权限:

CALENDAR(日历) 
READ_CALENDAR
WRITE_CALENDAR
CAMERA(相机) 
CAMERA
CONTACTS(联系人) 
READ_CONTACTS
WRITE_CONTACTS
GET_ACCOUNTS
LOCATION(位置) 
ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION
MICROPHONE(麦克风) 
RECORD_AUDIO
PHONE(手机) 
READ_PHONE_STATE
CALL_PHONE
READ_CALL_LOG
WRITE_CALL_LOG
ADD_VOICEMAIL
USE_SIP
PROCESS_OUTGOING_CALLS
SENSORS(传感器) 
BODY_SENSORS
SMS(短信) 
SEND_SMS
RECEIVE_SMS
READ_SMS
RECEIVE_WAP_PUSH
RECEIVE_MMS
STORAGE(存储卡) 
READ_EXTERNAL_STORAGE
WRITE_EXTERNAL_STORAGE

当你需要使用危险权限的时候你就需要注意了:
1.这些个权限你还是需要在manifast里面去申明
2.同一个权限组的任何一个权限被授权了,这个权限组的其他权限也自动被授权。(从上面的危险权限中可以看出他们有时候是组队出现的)
3.申请权限的弹出框是组队出现的,例如我申请READ_EXTERNAL_STORAGE,系统会提示”允许xxx访问设备上的照片、媒体内容和文件吗?”。
4.如果app运行在Android 6.0及以上,但是你的Android Studio targetSdkVersion<23时,系统还是会按照老的权限策略去执行,即还是在安装的时候去申请所有权限。

具体的实现步骤

1.你需要的危险权限在manifast里面申明,如下:

  <uses-permission android:name="android.permission.CALL_PHONE" />

2.在你需要用到这个权限的地方去检测用户是否授权过这个权限,具体如下:

 /**
         * 检查用户是否授权 CALL_PHONE 这个权限
         * PackageManager.PERMISSION_GRANTED   表示用户已经授权
         * PackageManager.PERMISSION_DENIED    表示用户已经拒绝或者还没有授权
         */
        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) {
            //表示用户已经授权该权限,接下来你想干嘛就干嘛了

        } else {
            //表示还没授权,没有授权那就去申请啦
            todoRequestPermission();

        }

3,如果没有授权就有这一步,没有就要去申请了,具体申请如下:

/**
     * 用来申请 Manifest.permission.CALL_PHONE 这个权限的
     */
    private void todoRequestPermission() {
        /**
         *  需要3个参数
         *  1,Activity
         *  2,申请权限的permissions数组,可以一次申请好几个权限,全部写在数组里面
         *  3,请求码,用来区分是谁请求的,是哪个权限数组请求的
         */
        String[] permissions = {Manifest.permission.CALL_PHONE};
        int requestCode = 1;
        ActivityCompat.requestPermissions(MainActivity.this,permissions,requestCode);
    }

4,用户到底是授权了还是拒绝了呢?这里就需要重写onRequestPermissionsResult方法,在此方法里面去获取了,具体如下:

 /**
     *
     * @param requestCode  这个requestCode就是我们申请的时候填写的那货,不清楚请看上一步
     * @param permissions  这个就是你申请的时候的权限数组,请看上一步
     * @param grantResults  这个是你申请权限返回的授权结果,如果你申请了13个权限,那么这个里面就有13个结果
     *                      同意PackageManager.PERMISSION_GRANTED,拒绝PackageManager.PERMISSION_DENIED
     *                      换句话说,就是放的这2货,和申请的权限数组是一一对应的
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case 1:
                /*
                先判断一下这个申请结果数组的长度,我感觉判不判断都无所谓,因为只有你申请了权限,才会回掉这个方法
                既然申请了,grantResults数组就不应该为空的 ,但是我看android大佬们都判断了,我一菜逼不判断,感觉
                要被鄙视的节奏
                 */
                if (grantResults.length>0) {
                    //判断第一个请求结果是啥,同意:PERMISSION_GRANTED,拒绝:PERMISSION_DENIED
                    if (grantResults[0] == PackageManager.PERMISSION_DENIED) {
                        //拒绝了,你是个好人,我们不合适

                    } else {
                        //同意了,可以去如家了,嘿嘿嘿~~~

                    }
                }
                break;

        }
    }

相比自己写,我还是更愿意用别人封装好的,嘿嘿嘿,下面介绍2个大佬封装好的拿来用

扫描二维码关注公众号,回复: 3761461 查看本文章

1,PermissionGen

github地址:https://github.com/lovedise/PermissionGen

用法
0,添加依赖:compile ‘com.lovedise:permissiongen:0.0.6’
1,在manifast里面去申明
2,在需要用到的地方申请

 PermissionGen.with(MainActivity.this)
                        .addRequestCode(100)
                        .permissions(
                                Manifest.permission.READ_CONTACTS,
                                Manifest.permission.RECEIVE_SMS,
                                Manifest.permission.WRITE_CONTACTS)
                        .request();

或者一个:

 PermissionGen.needPermission(this, 100, Manifest.permission.CAMERA);

3,重写onRequestPermissionsResult

 @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        PermissionGen.onRequestPermissionsResult(this, requestCode, permissions, grantResults);
    }

4,处理授权和拒绝了,注解上面的requsetCode一定要是你申请的时候写的

 @PermissionSuccess(requestCode = 100)
    public void test() {
        //授权了
    }

    @PermissionFail(requestCode = 100)
    private void test2() {
       //拒绝了
    }

是不是感觉还是很麻烦啊,我也觉得,下面来一个更简单的
2,RxPermissions
github地址:https://github.com/tbruyelle/RxPermissions

猜你喜欢

转载自blog.csdn.net/dl10210950/article/details/68485762
今日推荐