Android 11位置权限变化及适配方法详解
Android 11位置权限变化及适配方法详解
随着Android系统的发展,位置权限的管理变得越来越严格。从Android 8到Android 11,Google对位置权限的管理进行了多次重大变更,包括限制后台位置信息的访问频率、将前台和后台位置权限分离等。本文将详细介绍这些变更,并提供具体的代码示例,帮助开发者在不同版本的Android系统中正确请求位置权限。
Android 8 中的变化
在Android 8中,Google开始限制后台应用的位置信息访问频率。具体来说,处于后台的应用每小时只能检索几次用户的位置信息。这一变更主要是为了应对一些应用滥用用户位置数据的问题。
Android 10 之前
在Android 10之前,位置权限是一个单一资源,应用只需一次授权就可以在前台和后台随时使用。开发者可以通过以下代码检查和请求位置权限:
@TargetApi(28)
fun Context.checkLocationPermissionAPI28(locationRequestCode : Int) {
if (!checkSinglePermission(Manifest.permission.ACCESS_FINE_LOCATION) ||
!checkSinglePermission(Manifest.permission.ACCESS_COARSE_LOCATION)) {
val permList = arrayOf(
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION
)
requestPermissions(permList, locationRequestCode)
}
}
private fun Context.checkSinglePermission(permission: String) : Boolean {
return ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED
}
在这些版本中,用户只有两个选项:授权或不授权。
Android 10 的变化
在Android 10中,Google引入了ACCESS_BACKGROUND_LOCATION
权限,这是一个独立的后台位置权限。开发者需要显式请求这个权限才能在后台使用位置信息。以下是Android 10中请求位置权限的示例代码:
@TargetApi(29)
private fun Context.checkLocationPermissionAPI29(locationRequestCode : Int) {
if (checkSinglePermission(Manifest.permission.ACCESS_FINE_LOCATION) &&
checkSinglePermission(Manifest.permission.ACCESS_COARSE_LOCATION) &&
checkSinglePermission(Manifest.permission.ACCESS_BACKGROUND_LOCATION)) return
val permList = arrayOf(Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_BACKGROUND_LOCATION)
requestPermissions(permList, locationRequestCode)
}
private fun Context.checkSinglePermission(permission: String) : Boolean {
return ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED
}
用户现在有三个选项:后台(随时)、前台(仅使用APP期间)、拒绝。
Android 11 的变化
在Android 11中,Google对位置权限的管理进一步加强。开发者需要增加额外的步骤来处理位置权限的请求。以下是两种主要场景:
仅请求前台权限
在这种情况下,开发者通常使用ACCESS_FINE_LOCATION
或ACCESS_COARSE_LOCATION
权限。需要注意的是,在Android 11中,Google增加了一个可选项"Only this time"。即使将ACCESS_BACKGROUND_LOCATION
添加到要请求的权限列表中,系统也会忽略它。
同时请求前台和后台权限
如果应用需要后台权限,开发者必须准备自己的对话框,并使用明确的消息说明后台位置的使用。以下是具体的代码示例:
@TargetApi(30)
private fun Context.checkBackgroundLocationPermissionAPI30(backgroundLocationRequestCode: Int) {
if (checkSinglePermission(Manifest.permission.ACCESS_BACKGROUND_LOCATION)) return
AlertDialog.Builder(this)
.setTitle(R.string.background_location_permission_title)
.setMessage(R.string.background_location_permission_message)
.setPositiveButton(R.string.yes) { _,_ ->
// this request will take user to Application's Setting page
requestPermissions(arrayOf(Manifest.permission.ACCESS_BACKGROUND_LOCATION), backgroundLocationRequestCode)
}
.setNegativeButton(R.string.no) { dialog,_ ->
dialog.dismiss()
}
.create()
.show()
}
在Android 11中,用户有四个权限等级可以选择:
当用户选择"Allow all the time"时,应用就获得了后台使用位置信息的权限。
总结
通过本文,我们详细介绍了从Android 8到Android 11中位置权限的变化及适配方法。希望这些内容能帮助开发者更好地理解和处理位置权限相关的开发工作。