Android 6.0动态申请权限

来源:互联网 发布:肩颈按摩仪 知乎 编辑:程序博客网 时间:2024/06/07 11:49

在Android6.0中,系统权限被分为两大类:一类是Normal Permissions,这类权限一般不涉及用户隐私,是不需要用户进行授权的,比如手机震动、访问网络等;另一类是Dangerous Permission,一般是涉及到用户隐私的,需要用户进行授权,比如读取sdcard、访问通讯录等。

一、Android6.0 动态权限申请程序

当我们的Android工程的targetSdkVersion大于等于23的时候,对于Dangerous Permission,我们就需要手动编写逻辑代码实现权限的授权申请。

以申请相机权限为例,首先,需要在配置文件AndroidManifest中申请我们需要的权限:

<!-- 相机 --><uses-permission android:name="android.permission.CAMERA" /><uses-permission android:name="android.hardware.camera.autofocus" /><uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /><uses-permission android:name="android.permission.BROADCAST_STICKY" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

第二步,我在需要使用相机权限的地方进行权限申请操作。首先判断当前系统是否为Android6.0或之上的版本,如果不是,直接直接执行下一步,否则进入权限申请程序:

首先,checkSelfPermission检查该权限是否已经申请;

shouldShowRequestPermissionRationale检查用户是否已经拒绝过一次了,再次弹出授权框询问并解释为什么需要这个权限;

ActivityCompat.requestPermissions进行权限申请,申请的结果在onRequestPermissionsResult中接收。

//SDK版本为Android6.0以上                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){                    //检查权限                    int checkPermissionCamera = ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA);                    if(checkPermissionCamera != PackageManager.PERMISSION_GRANTED){                        Log.d(Tag, "权限还没有申请");                        if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this,                                Manifest.permission.CAMERA)){                            Log.d(Tag, "用户已经拒绝一次了,再次弹出授权框询问并解释为什么需要这个权限");                        } else {                            //申请授权                            Log.d(Tag, "申请授权");                            ActivityCompat.requestPermissions(MainActivity.this                                    //要申请的权限                                    , new String[]                                            {                                                    Manifest.permission.CAMERA                                            }                                    //申请请求返回码                                    , 100);                        }                    } else{                        Log.d(Tag, "权限已经申请");                    }                }

onRequestPermissionsResult:

    @Override    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults){        switch (requestCode){            case 100:{                if(permissions[0].equals(Manifest.permission.CAMERA) && grantR![1.png](http://upload-images.jianshu.io/upload_images/797252-49f05105989697ed.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)esults[0] == PackageManager.PERMISSION_GRANTED){                    Log.d(Tag, "CAMERA 权限授权成功");                }                else{                    Log.d(Tag, "用户拒绝授权权限 CAMERA");                }/* 获取手机信息权限//用户同意授权if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){                    getDeviceId();                } else {//用户拒绝授权                    Toast.makeText(ComplainHistoryActivity.this, "您已禁止该权限,需要重新开启。", Toast.LENGTH_SHORT).show();                }*/                break;            }        }        super.onRequestPermissionsResult(requestCode, permissions, grantResults);    }

各种情况下的程序运行流程:

1、已经授权:

1.png

2、未授权,授权框点击允许:

2.png

3、未授权,授权框点击拒绝:

3.png


二、普通权限与动态权限

1、普通权限

android.permission.ACCESS_LOCATION_EXTRA_COMMANDSandroid.permission.ACCESS_NETWORK_STATEandroid.permission.ACCESS_NOTIFICATION_POLICYandroid.permission.ACCESS_WIFI_STATEandroid.permission.ACCESS_WIMAX_STATEandroid.permission.BLUETOOTHandroid.permission.BLUETOOTH_ADMINandroid.permission.BROADCAST_STICKYandroid.permission.CHANGE_NETWORK_STATEandroid.permission.CHANGE_WIFI_MULTICAST_STATEandroid.permission.CHANGE_WIFI_STATEandroid.permission.CHANGE_WIMAX_STATEandroid.permission.DISABLE_KEYGUARDandroid.permission.EXPAND_STATUS_BARandroid.permission.FLASHLIGHTandroid.permission.GET_ACCOUNTSandroid.permission.GET_PACKAGE_SIZEandroid.permission.INTERNETandroid.permission.KILL_BACKGROUND_PROCESSESandroid.permission.MODIFY_AUDIO_SETTINGSandroid.permission.NFCandroid.permission.READ_SYNC_SETTINGSandroid.permission.READ_SYNC_STATSandroid.permission.RECEIVE_BOOT_COMPLETEDandroid.permission.REORDER_TASKSandroid.permission.REQUEST_INSTALL_PACKAGESandroid.permission.SET_TIME_ZONEandroid.permission.SET_WALLPAPERandroid.permission.SET_WALLPAPER_HINTSandroid.permission.SUBSCRIBED_FEEDS_READandroid.permission.TRANSMIT_IRandroid.permission.USE_FINGERPRINTandroid.permission.VIBRATEandroid.permission.WAKE_LOCKandroid.permission.WRITE_SYNC_SETTINGScom.android.alarm.permission.SET_ALARMcom.android.launcher.permission.INSTALL_SHORTCUTcom.android.launcher.permission.UNINSTALL_SHORTCUT

2、危险权限

危险权限(6.0权限)是需要单独申请的权限,共分为9组,每组只要有一个权限申请成功,就默认整组权限都可以使用。


原创粉丝点击