3

我有一个应用程序安装在出租车司机的电话中,用于跟踪出租车行驶的位置和距离。(手机已root,我们拥有手机的所有权限)。在我们应用程序的第一个实现中,我们使用 LocationManager.requestLocationUpdates 从 GPS 和网络提供商获取位置更新。由于我们需要捕捉出租车行驶的每一公里,我们在位置设置中启用了“高精度”模式。

出于两个原因,我们愿意迁移到 Fused-location-provider

  1. 出于某种原因(android 中的一个已知错误:https ://code.google.com/p/android/issues/detail?id= 57707)NETWORK_PROVIDER 不提供位置更新。
  2. 由于某种原因,设备突然失去 GPS 定位,并且在设备重新启动之前不会再次获得。

我们观察到 FusedLocationProvider 提供了更好的结果,并计划更改我们的应用程序以使用 FusedLocationProvider。现在的问题是 - 我们的设备有一个旧版本的 GooglePlayServices,它没有 LocationServices。我们有两个选择是

  1. 使用 LocationRequest 和 LocationClient 使用旧版本的 FusedLocationProvider。尽管它在户外提供了良好的结果(这是我们的主要要求),但即使启用了 wifi 并且网络信号良好(这似乎也是一个已知问题(位置更新),我们也没有在室内获得位置更新(根本没有)Fusion Location Provider APIs 声称不能在室内工作)。因此,我怀疑旧版本的 GooglePlayServices 和/或 FusedLocationProvider 中可能存在一些错误,这些错误将在以后的版本中得到修复。

  2. 更新所有手机上的 GooglePlayServices(通过无线安装 apk)并优先使用 LocationServices 获取高精度的位置更新。这种实现甚至在室内也能提供位置更新,这是我们所期望的——这里的问题是,当我在应用程序中请求位置更新时,我用 apk 更新 GooglePlayServices 时,它会打开 2 个弹出窗口,一个要求确认以提高位置准确性,另一个是打开谷歌应用程序使用我的位置的能力。即使我不接受第二个弹出窗口,它也可以正常工作,但如果我不接受第一个弹出窗口,它会将位置设置更改为“仅设备”模式(这意味着仅使用 GPS 提供程序)。

提高定位精度

允许谷歌应用使用位置的权限

我们不能指望我们所有的驱动程序在弹出窗口显示时都接受它。我想知道是否有任何方法可以为第一个弹出窗口执行“默认接受”之类的操作,以便我的设备保持“高精度”模式。

我找到了一种禁用位置同意的解决方案,该解决方案是在位置设置中手动启用高精度模式时出现的。该解决方案适用于我们的旧应用程序,但更新后的 GooglePlayServices 无法正常工作。

任何实现这一点的方法——比如在设备外壳中执行命令、发出意图或修改 GooglePlayServices apk 本身对我来说都很好。

4

1 回答 1

0

在有根设备上,您可以通过在初始化位置服务使用之前以编程方式设置以下值来抢占这些对话框。

运行以下命令su

content insert --uri content://com.google.settings/partner --bind name:s:network_location_opt_in --bind value:i:1
content insert --uri content://com.google.settings/partner --bind name:s:use_location_for_services --bind value:i:1
content insert --uri content://settings/global --bind name:s:assisted_gps_enabled --bind value:i:1
content insert --uri content://settings/secure --bind name:s:allowed_geolocation_origins --bind value:s:'http://www.google.co.uk http://www.google.com'
于 2020-10-15T00:30:07.327 回答