Android Q 中引入的 ACCESS_BACKGROUND_LOCATION 对地理围栏 API 有何影响?
Posted
技术标签:
【中文标题】Android Q 中引入的 ACCESS_BACKGROUND_LOCATION 对地理围栏 API 有何影响?【英文标题】:How does ACCESS_BACKGROUND_LOCATION introduced in Android Q affect Geofence APIs? 【发布时间】:2019-09-06 09:12:02 【问题描述】:为了使用地理围栏 API,用户 has to give 应用程序 ACCESS_FINE_LOCATION
。这个位置被认为是危险的,可以随时撤销;一旦此权限被撤销,应用程序将无法请求地理围栏更新。
ACCESS_BACKGROUND_LOCATION
权限如何适合这张图片?我们确定这个权限也是dangerous 和can be revoked at any time。是不是说,如果我们想注册一些IntentService
,在每次地理围栏发生变化时调用,我们还必须确保用户已经提供了ACCESS_BACKGROUND_LOCATION
权限?或者,如果我们尝试在我们自己的后台 Service/BroadcastReceiver 中获取当前位置,我们是否需要仅使用此权限?
我问这个问题的原因是文档在这一点上似乎有点含糊:描述 Q Developer Preview 的文档提到地理围栏是后台位置检索的用例之一,而 @ 987654325@ 的要求中没有提到ACCESS_BACKGROUND_LOCATION
。
【问题讨论】:
【参考方案1】:Geofencing API Documentation 现已更新,如果我们针对 android Q,我们需要定义 ACCESS_BACKGROUND_LOCATION
来监控地理围栏
来自文档:
要使用地理围栏,您的应用必须请求 ACCESS_FINE_LOCATION。如果您的应用面向 Android 10(API 级别 29)或更高版本,则您的应用还必须请求 ACCESS_BACKGROUND_LOCATION。
【讨论】:
【参考方案2】:我的猜部分“Re-register geofences only when required”:
注册的地理围栏保存在
com.google.process.location
进程中,该进程由com.google.android.gms
包拥有。
这并不是真正需要的,因为com.google.process.location
应该是获取位置数据的那个(所以需要请求ACCESS_BACKGROUND_LOCATION
权限的那个)。
话虽如此,遵循这个逻辑ACCESS_FINE_LOCATION
权限应该也不需要。需要它可能是因为两个原因(我不知道真正的原因):
对我来说,第二个假设更有意义,这意味着即使应用程序在技术上不需要(获取位置的过程是 Play Service),出于隐私/安全原因,它也是必需的。
按照这个逻辑,Google 应该(将?)也强制执行ACCESS_BACKGROUND_LOCATION
,以确保用户的隐私/安全并减少电池消耗。
【讨论】:
是的,我的想法完全一样:一方面,与地理围栏相关的工作(需要权限)发生在单独的进程中,因此不需要后台位置权限;另一方面,ACCESS_FINE_LOCATION
权限是必需的。【参考方案3】:
在 beta 4 中,在未授予 ACCESS_BACKGROUND_LOCATION
时添加地理围栏,即使应用程序完全处于前台,也会失败并显示状态代码 13(“错误”)。
【讨论】:
【参考方案4】:您需要 Android 10 API 级别 29+ 才能使用 ACCES_BACKGROUND_LOCATION
【讨论】:
以上是关于Android Q 中引入的 ACCESS_BACKGROUND_LOCATION 对地理围栏 API 有何影响?的主要内容,如果未能解决你的问题,请参考以下文章
SandHook 第四弹 | Android Q 支持 & Inline 的特别处理