美文网首页
android6.0程序在运行时申请权限

android6.0程序在运行时申请权限

作者: Android开发__落岑 | 来源:发表于2017-06-06 16:42 被阅读44次

    一、运行时权限的变化及特点

    对于6.0以下的权限及在安装的时候,根据权限声明产生一个权限列表,用户只有在同意之后才能完成app的安装,造成了我们想要使用某个app,就要默默忍受其一些不必要的权限(比如是个app都要访问通讯录、短信等)。而在6.0以后,我们可以直接安装,当app需要我们授予不恰当的权限的时候,我们可以予以拒绝(比如:单机的象棋对战,请求访问任何权限,我都是不同意的)。当然你也可以在设置界面对每个app的权限进行查看,以及对单个权限进行授权或者解除授权。

    新的权限机制更好的保护了用户的隐私,Google将权限分为两类,一类是Normal Permissions,这类权限一般不涉及用户隐私,是不需要用户进行授权的,比如手机震动、访问网络等;另一类是Dangerous Permission,一般是涉及到用户隐私的,需要用户进行授权

    Normal Permissions如下

    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_INSTALL_PACKAGES

    SET_ALARM

    SET_TIME_ZONE

    SET_WALLPAPER

    SET_WALLPAPER_HINTS

    TRANSMIT_IR

    UNINSTALL_SHORTCUT

    USE_FINGERPRINT

    VIBRATE

    WAKE_LOCK

    WRITE_SYNC_SETTINGS

    Dangerous Permissions:

    group:android.permission-group.CONTACTS

    permission:android.permission.WRITE_CONTACTS

    permission:android.permission.GET_ACCOUNTS

    permission:android.permission.READ_CONTACTS

    group:android.permission-group.PHONE

    permission:android.permission.READ_CALL_LOG

    permission:android.permission.READ_PHONE_STATE

    permission:android.permission.CALL_PHONE

    permission:android.permission.WRITE_CALL_LOG

    permission:android.permission.USE_SIP

    permission:android.permission.PROCESS_OUTGOING_CALLS

    permission:com.android.voicemail.permission.ADD_VOICEMAIL

    group:android.permission-group.CALENDAR

    permission:android.permission.READ_CALENDAR

    permission:android.permission.WRITE_CALENDAR

    group:android.permission-group.CAMERA

    permission:android.permission.CAMERA

    group:android.permission-group.SENSORS

    permission:android.permission.BODY_SENSORS

    group:android.permission-group.LOCATION

    permission:android.permission.ACCESS_FINE_LOCATION

    permission:android.permission.ACCESS_COARSE_LOCATION

    group:android.permission-group.STORAGE

    permission:android.permission.READ_EXTERNAL_STORAGE

    permission:android.permission.WRITE_EXTERNAL_STORAGE

    group:android.permission-group.MICROPHONE

    permission:android.permission.RECORD_AUDIO

    group:android.permission-group.SMS

    permission:android.permission.READ_SMS

    permission:android.permission.RECEIVE_WAP_PUSH

    permission:android.permission.RECEIVE_MMS

    permission:android.permission.RECEIVE_SMS

    permission:android.permission.SEND_SMS

    permission:android.permission.READ_CELL_BROADCASTS

    可以通过adb shell pm list permissions -d -g进行查看。

    看到上面的dangerous permissions,会发现一个问题,好像危险权限都是一组一组的,恩,没错,的确是这样的,

    那么有个问题:分组对我们的权限机制有什么影响吗?

    的确是有影响的,如果app运行在Android 6.x的机器上,对于授权机制是这样的。如果你申请某个危险的权限,假设你的app早已被用户授权了同一组的某个危险权限,那么系统会立即授权,而不需要用户去点击授权。比如你的app对READ_CONTACTS已经授权了,当你的app申请WRITE_CONTACTS时,系统会直接授权通过。此外,对于申请时弹出的dialog上面的文本说明也是对整个权限组的说明,而不是单个权限(ps:这个dialog是不能进行定制的)。

    不过需要注意的是,不要对权限组过多的依赖,尽可能对每个危险权限都进行正常流程的申请,因为在后期的版本中这个权限组可能会产生变化。

    运行时权限运用方案(以文件读写权限为例)

    if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {

    ActivityCompat.requestPermissions(MainActivity.this, new String[]{ Manifest.permission. WRITE_EXTERNAL_STORAGE }, 1);

    } else {

    // 获取权限后要执行的事件

    openAlbum();

    }

    // 检测到还没有获取到权限时执行,申请获取权限

    @Override

    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {

    switch (requestCode) {

    case 1:

    if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

    // 获取权限后要执行的事件

    openAlbum();

    } else {

    Toast.makeText(this, "权限被拒绝", Toast.LENGTH_SHORT).show();

    }

    break;

    default:

    }

    }

    相关文章

      网友评论

          本文标题:android6.0程序在运行时申请权限

          本文链接:https://www.haomeiwen.com/subject/oyfnfxtx.html