从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)。
返回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为你自己定义一个对应的号码,方便系统回调时识别。
这里处理的是权限相应结果。
requestCode对应之前的你自己定义的号码MY_PERMISSIONS_REQUEST_READ_CONTACTS。
grantResults是权限申请结果数组。其结果可以是PackageManager.PERMISSION_GRANTED或PackageManager.PERMISSION_DENIED