本网站(662p.com)打包出售,且带程序代码数据,662p.com域名,程序内核采用TP框架开发,需要联系扣扣:2360248666 /wx:lianweikj
精品域名一口价出售:1y1m.com(350元) ,6b7b.com(400元) , 5k5j.com(380元) , yayj.com(1800元), jiongzhun.com(1000元) , niuzen.com(2800元) , zennei.com(5000元)
需要联系扣扣:2360248666 /wx:lianweikj
如何在Android 11 中正确请求位置权限?
吴振华 · 723浏览 · 发布于2020-11-04 +关注

由于现在位置信息变为了敏感数据,因此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中获取位置权限的整个过程,和各个系统版本的不同处理情况,希望本篇博客对你有用!!!


相关推荐

android下vulkan与opengles纹理互通

talkchan · 1158浏览 · 2020-11-23 10:37:39
Android 使用RecyclerView实现轮播图

奔跑的男人 · 2166浏览 · 2019-05-09 17:11:13
微软发布新命令行工具 Windows Terminal

吴振华 · 860浏览 · 2019-05-09 17:15:04
Facebook 停止屏蔽部分区块链广告

· 746浏览 · 2019-05-09 17:20:08
加载中

0评论

评论
坐标是江苏.南京,行业是互联网,技术是PHP和java,还有熟悉前后端等。
分类专栏
小鸟云服务器
扫码进入手机网页