在targetSdkVersion
的值为23或者更高,就要进行权限管理,不然若是运行在Android6.0
或以上的设备会没有相应权限而致使崩溃html
请求权限后,在onRequestPermissionsResult
方法回调,在该方法判断三种状态:容许获取权限、拒绝授予权限、拒绝授予权限且再也不询问android
Android将不一样的权限分组管理,分为正常权限和危险权限。正常权限是不用申请的。在申请危险权限时,系统会向用户弹出一个申请权限的对话框,描述要获取的权限所在的权限组,而不是具体的要申请的权限。只要得到组内的任一权限,那么默认该权限组的全部权限申请成功,再次申请该组内的其余权限,系统将马上授予权限,不会再显示申请权限对话框异步
危险权限共9组24个ide
权限组 | 描述 | 权限 |
---|---|---|
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 |
应用信息/权限
中看到指定权限的Android6.0
以上,是的话就检查是否已经获取到相应的危险权限onRequestPermissionsResult
回调中查看结果,若是已经获取到权限,则去进行相应的操做。若是没有获取到权限,则有两种可能:禁止或者是禁止且再也不询问。禁止的话,还能再下次使用时再去申请权限。若是是禁止且再也不询问,那么想要进行下一步操做只能到应用信息/权限
界面去手动开启权限了==若是应用须要危险权限,则每次执行须要这一权限的操做时都必须检查本身是否具备该权限。用户始终能够自由调用此权限,所以,即便应用昨天使用了相机,它不能假设本身今天仍具备该权限。==ui
要检查是否具备某项权限,请调用 ContextCompat.checkSelfPermission()
方法。例如,如下代码段显示了如何检查 Activity 是否具备在日历中进行写入的权限:this
// Assume thisActivity is the current activity int permissionCheck = ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.WRITE_CALENDAR);
若是应用具备此权限,方法将返回 PackageManager.PERMISSION_GRANTED
,而且应用能够继续操做。若是应用不具备此权限,方法将返回 PERMISSION_DENIED
,且应用必须明确向用户要求权限。code
若是应用须要应用清单中列出的危险权限,那么,它必需要求用户授予该权限。Android 提供了多种权限请求方式。调用这些方法将显示一个标准的 Android 对话框,不过,不能对它们进行自定义htm
在某些状况下,可能须要帮助用户了解应用为何须要某项权限。例如,若是用户启动一个摄影应用,用户对应用要求使用相机的权限可能不会感到吃惊,但用户可能没法理解为何此应用想要访问用户的位置或联系人。在请求权限以前,不妨为用户提供一个解释。固然,只是一个解释get
为了帮助查找用户可能须要解释的情形,Android 提供了一个实用程序方法,即 shouldShowRequestPermissionRationale()
。若是应用以前请求过此权限但用户拒绝了请求,此方法将返回 true
it
注:若是用户在过去拒绝了权限请求,并在权限请求系统对话框中选择了 Don't ask again选项,此方法将返回false
。若是设备规范禁止应用具备该权限,此方法也会返回false
。
若是应用尚无所需的权限,则应用必须调用一个requestPermissions()
方法,以请求适当的权限。应用将传递其所需的权限,以及指定用于识别此权限请求的整型请求代码。此方法异步运行:它会当即返回,而且在用户响应对话框以后,系统会使用结果调用应用的回调方法,将应用传递的相同请求代码传递到requestPermissions()
注:当应用调用requestPermissions()
时,系统将向用户显示一个标准对话框。应用 没法配置或更改此对话框。若是须要为用户提供任何信息或解释,应在用requestPermissions()
以前进行,如 解释应用为何须要权限中所述。
当应用请求权限时,系统将向用户显示一个对话框。当用户响应时,系统将调用应用的onRequestPermissionsResult()
方法,向其传递用户响应。应用必须替换该方法,以了解是否已得到相应权限。回调会将传递的相同请求代码传递给requestPermissions()
系统显示的对话框说明了应用须要访问的权限组;它不会列出具体权限。例如,若是请求READ_CONTACTS
权限,系统对话框只显示应用须要访问设备的联系人。用户只须要为每一个权限组授予一次权限。若是应用请求该组中的任何其余权限(已在应用清单中列出),系统将自动授予应用这些权限。当请求此权限时,系统会调用的onRequestPermissionsResult()
回调方法,并传递PERMISSION_GRANTED
,若是用户已经过系统对话框明确赞成权限请求,系统将采用相同方式操做。
注:应用仍须要明确请求其须要的每项权限,即便用户已向应用授予该权限组中的其余权限。此外,权限分组在未来的 Android 版本中可能会发生变化。代码不该依赖特定权限属于或不属于相同组这种假设
这时候若是还坚持使用须要该权限的功能,那么就只能到应用详情界面去手动打开权限了,而后回到代码中再去检查是否已经得到权限
//跳转到应用详情界面 Intent intent = new Intent() intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS") intent.setData(Uri.fromParts("package",getPackageName(), null)); startActivity(intent);
onRequestPermissionsResult
应用请求权限结果的回调,不管是赞成或拒绝,都会在这里获得结果
ActivityCompat.shouldShowRequestPermissionRationale
向用户解释为何须要该权限。若是应用以前已经请求过该权限且用户拒绝,那么将返回true
ContextCompat.checkSelfPermission
用来检查是否具备某种权限,若是应用具备此权限,方法将返回PackageManager.PERMISSION_GRANTED
,而且应用能够继续操做。若是应用不具备此权限,方法将返回PERMISSION_DENIED
,且应用必须明确向用户要求权限
ActivityCompat.requestPermissions
请求权限的方法,传入须要请求的权限和整数请求码