• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

如何在Android-11-中正确请求位置权限以及Android-8-11位置权限的变化及适配方法

android 搞代码 3年前 (2022-03-02) 19次浏览 已收录 0个评论

因为当初地位信息变为了敏感数据,因而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都可应用

<code class="kotlin">@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, 你能够申请此权限来同时取得前台和后盾的权限,像上面这样呢:

<code class="kotlin">@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_LOCATIONACCESS_FINE_LOCATION被申明,ACCESS_BACKGROUND_LOCATION将在装置过程中被增加。

用户当初有三个选项:后盾(随时)前台(仅应用APP期间)回绝

Android 11

除上述内容外,开发人员还须要减少其余一些步骤。

这里有2种场景,第一种状况是当仅申请前台权限,在这种状况下,咱们通常应用ACCESS_FINE_LOCATION 或者ACCESS_COARSE_LOCATION, 然而,申请受权的弹窗和以前的略有不同,在Android 11 中,Google 减少了一个可选项 Only this time

请留神,即便将ACCESS_BACKGROUND_LOCATION增加到要申请的权限列表中,零碎也将疏忽它。

第二种状况是:利用也须要后盾权限,为此,你必须筹备本人的对话框,并应用明确的音讯来阐明后盾地位的应用。

当用户批准后,将他疏导到利用设置页面,那里能够抉择他想授予的权限等级

示例代如下:

<code class="kotlin">@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&#8230;


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:如何在Android-11-中正确请求位置权限以及Android-8-11位置权限的变化及适配方法

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址