我有一个应用程序安装在驾驶室驾驶员用来跟踪驾驶室行驶的位置和距离。 (手机已植根,我们拥有手机的所有权限)。在我们的应用程序的第一个实现中,我们使用LocationManager.requestLocationUpdates从GPS和网络提供商获取位置更新。由于我们需要捕获驾驶室行驶的每公里,因此我们在位置设置中启用了“高精度”模式。
出于两个原因,我们愿意转移到Fused-location-provider
我们观察到FusedLocationProvider提供了更好的结果,并计划将我们的应用程序更改为使用FusedLocationProvider。现在的问题是 - 我们的设备有旧版本的GooglePlayServices,它没有LocationServices。我们有两个选择
使用LocationRequest和LocationClient使用旧版本的FusedLocationProvider。虽然它在户外给出了良好的效果(这是我们的主要要求),但即使启用了wifi并具有良好的网络信号,我们也无法在室内获得位置更新(不是全部)(这似乎也是一个已知问题({{ 3}}。所以,我怀疑旧版本的GooglePlayServices和/或FusedLocationProvider可能会出现一些错误,这些错误在以后的版本中已得到修复。
在所有手机上更新GooglePlayServices(通过无线安装apk)并使用LocationServices以高精度优先获取位置更新。这个实现甚至在室内提供位置更新,这是我们所期望的 - 这里的问题是当我在我的应用程序中请求位置更新时我用apk更新GooglePlayServices它打开2个弹出窗口,要求确认以提高位置准确性和其他是打开谷歌应用程序使用我的位置的能力。它工作正常,即使我不接受第二个弹出窗口,但如果我不接受第一个弹出窗口,它将位置设置更改为“仅设备”模式(这意味着只使用GPS提供商)。
我们不能指望所有的驱动程序在显示时接受弹出窗口。我想知道是否有任何方法可以为第一个弹出窗口执行“默认接受”类型的操作,以便我的设备保持“高精度”模式。
我找到了一种禁用位置许可的解决方案,在位置设置中手动启用高精度模式时会出现这种情况。该解决方案正在使用我们的旧应用程序,但更新后的GooglePlayServices无法使用。
实现这一目标的任何方式 - 比如在设备shell中执行命令,发布意图或修改GooglePlayServices apk本身对我来说都没问题。
答案 0 :(得分:0)
在具有root用户权限的设备上,您可以通过在初始化使用位置服务之前以编程方式设置以下值来抢占这些对话框。
以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'