Android 6.0动态权限申请

Android 6.0开始,有部分危险权限申请需要在运行时候申请,一般是你的目标版本targetSdkVersion大于或等于23就要动态申请权限了,否则APP在运行当中会崩溃。

Ubuntu Server 14.04上编译Android 6.0源码

Android 6.0百度网盘下载

一、基础知识 1、权限种类

权限分两种:正常权限和危险权限。危险权限在targetSdkVersion大于或等于23就要动态申请权限了。危险权限有以下几种:

权限组权限
CALENDAR   READ_CALENDAR  
    WRITE_CALENDAR  
CAMERA   CAMERA  
CONTACTS   READ_CONTACTS  
    WRITE_CONTACTS  
    GET_ACCOUNTS  
LOCATION   ACCESS_FINE_LOCATION  
    ACCESS_COARSE_LOCATION  
MICROPHONE   RECORD_AUDIO  
    WRITE_CALENDAR  
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  

每组权限中,用户只要授权该组下的一个权限,该组中所有权限都可以用。

2、权限相关 是否需要向用户解析需要申请的权限。 ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_CONTACTS)

如果应用之前请求过此权限但用户拒绝了请求,此方法将返回 true。
如果用户在过去拒绝了权限请求,并在权限请求系统对话框中选择了 Don’t ask again 选项,此方法将返回 false。
如果设备规范禁止应用具有该权限,此方法也会返回 false。所以第一次进入APP申请该权限时,有些设备会返回false(第二次申请才为true)。

检查APP是否已经有权限。 ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.READ_CONTACTS)

返回PackageManager.PERMISSION_GRANTED表示已拥有,不具有则返回PackageManager.PERMISSION_DENIED

权限申请 ActivityCompat.requestPermissions(thisActivity, new String[]{Manifest.permission.READ_CONTACTS}, MY_PERMISSIONS_REQUEST_READ_CONTACTS);

ActivityCompat.requestPermissions用于申请权限。
thisActivity,不用多说了,就是当前的Activity名字的一个实例(引用)。
new String[]{Manifest.permission.READ_CONTACTS}是你要申请的权限,你可以写几个权限进入数组里申请。
MY_PERMISSIONS_REQUEST_READ_CONTACTS为你自己定义一个对应的号码,方便系统回调时识别。

处理权限请求响应 @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { }

这里处理的是权限相应结果。
requestCode对应之前的你自己定义的号码MY_PERMISSIONS_REQUEST_READ_CONTACTS。
grantResults是权限申请结果数组。其结果可以是PackageManager.PERMISSION_GRANTED或PackageManager.PERMISSION_DENIED

跳转到用户权限管理页面 Intent intent = new Intent(); intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Log.d(TAG, "getPackageName(): " + activity.getPackageName()); Uri uri = Uri.fromParts("package", activity.getPackageName(), null); intent.setData(uri); activity.startActivity(intent); AndroidManifest里填写

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/ecf462c71ab4738d37c675b63510df00.html