API 28 位置模式与新的二进制 Google 精度设置不正确

Posted

技术标签:

【中文标题】API 28 位置模式与新的二进制 Google 精度设置不正确【英文标题】:API 28 Location Mode is incorrect with new binary Google Accuracy Setting 【发布时间】:2019-07-08 17:38:30 【问题描述】:

我目前正在开发一个要求用户在其设备上启用高精度的应用程序。我已将应用程序编程为使用 android 弹出窗口和设置 API 来询问和解决此问题。

首先检查用户的位置模式是否正确,我使用:

retVal = Settings.Secure.getInt(context.getContentResolver(), Settings.Secure.LOCATION_MODE) == Settings.Secure.LOCATION_MODE_HIGH_ACCURACY;

此检查似乎适用于 API 级别 27 及以下。

但是,使用 API 28 中引入的新二进制 Google 精度设置,我遇到了问题。如果我关闭了准确性并使用应用程序中的弹出窗口打开准确性设置。即使现在启用了高精度,Settings.Secure.LOCATION_MODE 也会返回错误的值。仅当用户从 Android 中的“设置”应用手动更改此设置时,LOCATION_MODE 才会返回正确的值。

我想知道是否有新的 API 可以在 API 28 中准确返回 LOCATION_MODE

【问题讨论】:

【参考方案1】:

根据Settings.Secure.LOCATION_MODEdocs:

此常量在 API 级别 28 中已弃用。 要检查位置状态,请使用 LocationManager.isLocationEnabled()。要获取位置提供者的状态,请使用 LocationManager.isProviderEnabled(String)。

所以我相信您可以通过以下方式获得所需的信息:

retVal = LocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) 
&& LocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)

【讨论】:

非常感谢您的回复,尝试此检查后,似乎对上述问题没有任何影响。 1)检查提供者,如果其中一个被禁用,请用户提高准确性。 2) 用户获得谷歌弹出窗口以提高 gps 3) 用户点击是 4) 准确性现已开启 5) 操作系统仍将其中一个提供程序返回为关闭,因此 retval 继续保持错误 一旦用户响应了谷歌 GPS 弹出窗口,我需要 retval 翻转到正确的状态。旧标志 LOCATION_MODE 用于准确执行此操作,直到 API 27。但是对于 android P,除非用户从设置应用程序手动执行此操作,否则从应用程序内更改精度设置总是会从操作系统返回陈旧的 GPS 精度状态,包括是否提供程序是否启用。

以上是关于API 28 位置模式与新的二进制 Google 精度设置不正确的主要内容,如果未能解决你的问题,请参考以下文章

YouTube Android Player API 在解组时抛出“BadParcelableException ClassNotFoundException:asc”与新的 YouTube 版本

是否可以使用 Google 的新融合位置提供程序模拟位置?

将 Firebase 身份验证与新的 @App 协议一起使用

使用 Google Play 服务我可以在离线模式下获取最新位置吗(FusedLocationProvider Api)

如何使用来自 Firebase Google Maps API Android 的数据更新标记位置

如何将 webpack-dev-server 与新的 Chromium SameSite=None 策略一起使用?