共计 3199 个字符,预计需要花费 8 分钟才能阅读完成。
因为当初地位信息变为了敏感数据,因而 Android 限度了它的应用,尤其在 APP 后盾。
在 Android 9 之前,地位权限没有依照前后台拆散,APP 在前台和后盾应用雷同的资源。
然而,Google 开始意识到一些 APP 滥用此类数据,于是决定依照 前台
和后盾
拆散资源的形式,减少一些层级来爱护用户的地位信息数据。
对于 Android 开发者来说,这就为咱们在 APP 中申请地位权限减少了一些额定的工作。
在具体介绍之前,让咱们先看一看在最近几个 Android 版本中的更改日志:
在 Android 8 中
:处于后盾的利用,每小时只能检索几次用户的地位。Android 10 之前
:地位权限是一个繁多资源,利用只需一次受权就能够到处应用,随时应用(前台和后盾)在 Android 10 中
:后盾地位变成了一个独立的资源,应用程序除了前台申请外,还必须明确申请此权限。Android 11 中
:无奈与其他人同时申请后盾地位权限,利用必须独自申请。此外,申请此权限不会像其余权限一样立刻弹窗提醒用户,而是会将用户带到/ Settings 页面 / Location 权限
会话,以便用户能够更新权限级别。
依据下面的这些变动,咱们必须依据不同的零碎版本解决地位权限的申请,这里有 3 种不同场景(在写本文时,咱们目前应用的是 Android 11):
Android 10 之前
地位权限只需申请一次,处于前台和后盾的 APP 都可应用
@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
}
在这些版本中,用户只有 2 个选项:受权
或不受权
。
Android 10
在这个版本中,减少了ACCESS_BACKGROUND_LOCATION
, 你能够申请此权限来同时取得前台和后盾的权限,像上面这样呢:
@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
}
同样,如果申请前台权限(ACCESS_COARSE_LOCATION
或者 ACCESS_FINE_LOCATION
),则 Android 操作系统会主动将后盾权限(ACCESS_BACKGROUND_LOCATION
)增加到申请中。它相似于<uses-permission>
申明,无论是 ACCESS_COARSE_LOCATION
或ACCESS_FINE_LOCATION
被申明,ACCESS_BACKGROUND_LOCATION
将在装置过程中被增加。
用户当初有三个选项:后盾(随时)
、前台 (仅应用 APP 期间)
、 回绝
。
Android 11
除上述内容外,开发人员还须要减少其余一些步骤。
这里有 2 种场景,第一种状况是当仅申请前台权限,在这种状况下,咱们通常应用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 中,咱们有 4 个权限等级用于地位信息。
当用户抉择Allow all the time
, APP 就有了后盾应用地位信息的权限了。
瞧,这就是 Android 11 中获取地位权限的整个过程,和各个系统版本的不同解决状况,心愿本篇博客对你有用!!!
原文链接:
https://medium.com/swlh/reque…