Android 6.0权限管理

Android 6.0权限管理

有关权限管理

Android6.0 发布之后,Android 的权柄系统让还设计。在 23 之前 App
的权只会于用户设置之时询问同次,App一旦设置后虽得采取具有的权杖了,而从
23 之后,App 可以一直装,App
只有当运作时需采用一些权力时才会为用户了解是不是授权,此时系会弹来一个对话框让用户挑选确认或者取消授权,同时用户也得以以装置页面对每个
App
的权柄进行管理。关键:这个对话框需要开发者手动调用,且不可自行定制样式

Android Developer 文章:
System
Permissions
Requesting Permissions at Run
Time
Permissions Best
Practices

通用权限和危急权限

通用权限

通用权限是负未干用户隐私,只需要在Manifest遭逢宣称即可的权能,比如网络、蓝牙齐名,只要
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中说明,否则申请时不提使用用户,直接回调开发者权限被驳回。
同一个权组的外一个权力被授权了,这个权力组的另权限也自动为授权。例如,一旦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.
        }
    }
}

权力申请流程

图片 1

checkSelfPermission()

1、检查有一个权的时状态,在恳求某个权限时当检查是权力是否早已深受用户授权,已经授权的权杖应该过了申请。
2、该方法发生一个参数是权力名称,有一个int的回到值,可看清检查的权限当前的状态。

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

requestPermissions()

提请权限,调用后系会显得一个要用户授权的提醒对话框,App不可知安排以及改者对话框。
1、 如果需要提醒用户之权力相关的消息要证明,需要以调用
requestPermissions() 之前处理,该措施来星星点点只参数:

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

2、当用户处理了授权操作时,会回调Activity或者Fragment的onRequestPermissionsResult()方法。

onRequestPermissionsResult()

拍卖权限结果回调,当用户处理了授权操作时,系统会自动回调该办法,此时赶回三只参数,可以判定用户是否允许了申请之权限

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

shouldShowRequestPermissionRationale()

是否相应显示请求权限的证实。
1、当第一浅呼吁权限时,用户拒绝了,此时更调用shouldShowRequestPermissionRationale()晚会见返回true,显示怎么用之权力的求证。
2、用户在首先不行驳回某个权限后,下次再申请时,授权的dialog中拿会晤起“不再提拔”选项,一旦当选勾选了,那么下次提请将非会见唤起用户。此时调用shouldShowRequestPermissionRationale()会返回false
3、设备的方针禁止当前利用得这权力的授权:shouldShowRequestPermissionRationale()返回false

Permission Builder

一个友好实现的Permission辅助库,帮助我们会高效使简单的在Android上申请权限。

Github地址:PermissiongBuilder
博客地址:cpacm

相关文章