ACCESSAndroid 6.0权限管理

Android 6.0权限管理

有关权限管理

Android6.0 发表之后,Android 的权能系统被重新设计。在 23 此前 App
的权限只会在用户安装的时候询问1遍,App一旦设置后就能够利用全部的权力了,而从
23 之后,App 能够一贯设置,App
只有在运作时须求采取一些权柄时才会向用户精通是不是授权,此时系统会弹出三个会话框让用户选择确认或然撤回授权,同时用户也能够在安装页面对每种App
的权柄举行政管理制。重点:那些对话框供给开发者手动调用,且不得自行定制样式

Android Developer 文章:
System
Permissions

Requesting Permissions at Run
Time

Permissions Best
Practices

通用权限和危急权限

通用权限

通用权限是指不涉及用户隐衷,只必要在Manifest中扬言即可的权杖,比如互连网、Bluetooth等,只要
app 安装,那个权限暗许都以被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

危险权限

具备危险的Android系统权限属于权限组,借使APP运维在Android 6.0 (API level
23)只怕更高级其余设备中,而且targetSdkVersion>=23时,系统将会活动采取动态权限管理策略。
此类权限也务必在Manifest中证明,不然申请时不提使用用户,直接回调开发者权限被拒绝。
同1个权力组的别的三个权力被授权了,那一个权力组的任何权限也自行被授权。例如,一旦WRITE_CONTACTS被授权了,App也有READ_CONTACTSGET_ACCOUNTS了。
提请某一个权力的时候系统弹出的Dialog是对任何权限组的证实,而不是单个权限。例如笔者申请READ_EXTERNAL_STORAGE,系统会唤起”允许xxx访问设备上的照片、媒体内容和文件呢?”。
只要App运转在Android 5.1 (API level
22)大概更低级别的装备中,可能targetSdkVersion<=22时(此时设施得以是Android
6.0 (API level
23)可能更高),在装有系统中仍将应用旧的权杖管理策略,系统会要求用户在设置的时候授予权限。其次,系统就告诉用户App须要哪些权限组,而不是独家的某些权限。

(targetSdkVersion>=23)
Dangous Permissions

Permission Group Permissions
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

八个奇特的权力

SYSTEM_ALERT_WINDOWWRITE_SETTINGS
那八个权力比较新鲜,无法通过代码申请形式赢得,必须得用户打开软件安装页手动打开,才能授权。官方建议须求报名该权限时指点用户跳转到Setting中协调去开启权限开关。

public static int OVERLAY_PERMISSION_REQ_CODE = 1234;

@TargetApi(Build.VERSION_CODES.M)
public void requestDrawOverLays() {
    if (!Settings.canDrawOverlays(MainActivity.this)) {
        Toast.makeText(this, "can not DrawOverlays", Toast.LENGTH_SHORT).show();
        Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + MainActivity.this.getPackageName()));
        startActivityForResult(intent, OVERLAY_PERMISSION_REQ_CODE);
    } else {
        // Already hold the SYSTEM_ALERT_WINDOW permission, do addview or something.
    }
}

@TargetApi(Build.VERSION_CODES.M)
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == OVERLAY_PERMISSION_REQ_CODE) {
        if (!Settings.canDrawOverlays(this)) {
            // SYSTEM_ALERT_WINDOW permission not granted...
            Toast.makeText(this, "Permission Denieddd by user.Please Check it in Settings", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(this, "Permission Allowed", Toast.LENGTH_SHORT).show();
            // Already hold the SYSTEM_ALERT_WINDOW permission, do addview or something.
        }
    }
}

权力申请流程

ACCESS 1

checkSelfPermission()

壹 、检查某3个权力的脚下状态,在呼吁有个别权限时应有检查那一个权力是不是曾经被用户授权,已经授权的权力应该跳过申请。
二 、该措施有多个参数是权力名称,有二个int的再次回到值,可看清检查的权杖当前的气象。

if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_CONTACTS)
        != PackageManager.PERMISSION_GRANTED) {
    // 没有权限
}else{
    // 有权限了
}

requestPermissions()

提请权限,调用后系统会议及展览示二个请求用户授权的唤起对话框,App不可能铺排和改动那几个对话框。
一 、 若是须求提示用户那么些权力相关的音信或申明,须求在调用
requestPermissions() 在此以前处理,该措施有几个参数:

    int requestCode //会在回调onRequestPermissionsResult()时返回,用来判断是哪个授权申请的回调。
    String[] permissions//权限数组,你需要申请的的权限的数组

② 、当用户处理完授权操作时,会回调Activity可能Fragment的onRequestPermissionsResult()方法。

onRequestPermissionsResult()

拍卖权限结果回调,当用户处理完授权操作时,系统会活动回调该形式,此时回来多少个参数,能够判定用户是不是同意了报名的权位

    int requestCode // 在调用requestPermissions()时的第一个参数。
    String[] permissions //权限数组,在调用requestPermissions()时的第二个参数。
    int[] grantResults //授权结果数组,对应permissions,具体值和上方提到的PackageManager中的两个常量做比较。

shouldShowRequestPermissionRationale()

是或不是相应展现请求权限的注明。
① 、当第3回呼吁权限时,用户拒绝了,此时再调用shouldShowRequestPermissionRationale()后会重返true,显示怎么需求以此权力的认证。
贰 、用户在第三回驳回某些权限后,下次再也申请时,授权的dialog上校会油不过生“不再升迁”选项,一旦当选勾选了,那么下次提请将不会提醒用户。此时调用shouldShowRequestPermissionRationale()会返回false
③ 、设备的国策禁止当前采用获取那几个权力的授权:shouldShowRequestPermissionRationale()返回false

Permission Builder

贰个温馨完结的Permission协理库,帮衬我们能够相当的慢而容易的在Android上申请权限。

Github地址:PermissiongBuilder
博客地址:cpacm

相关文章