来自Google Play的定位服务无法在模式"仅限设备"

时间:2016-12-16 01:29:53

标签: android google-location-services

我有一个跟踪设备位置的应用。在过去,我使用了Android框架位置API。按预期工作 - 所以没有必要改变它。 但现在我想从Google建议使用的Google Play服务评估位置服务,因此我相应地更改了我的应用。有一些选项可能会在未来派上用场。

为此,我跟随 https://developer.android.com/training/location/change-location-settings.html 我解决了相当复杂的依赖关系和要求后,我现在有一个工作配置。但是有一些问题:

第1部分

似乎没有选择使用“仅设备”模式(意味着只有GPS用于定位服务,而不是WiFi等......

如果我使用PRIORITY_HIGH_ACCURACY,间隔10000和最小位移20请求位置更新,则挂起的LocationSettingsResult始终返回状态为RESOLUTION_REQUIRED,如果设备设置为位置模式“仅设备”。 分辨率是激活“高精度”模式,也可以启用WiFi等。 但在此模式下,位置数据会发送给Google,这可能会对某些用户造成隐私问题。

我认为这是一个错误,因为“仅设备”模式应该足以满足请求。 在哪里提交Google Play服务的错误?不幸的是,这些问题超出了AOSP Bug Tracker的范围,我也不知道有任何官方地方可以提交此类错误。

当要从服务启动位置请求时,会出现另一个问题。如果现在状态为RESOLUTION_REQUIRED如何解决这种情况? Google提供的解决方案需要针对解决方案的活动。但是在服务中没有可用于此的活动。 LocationSettingsResult的状态对象可以访问LocationSettingsStates对象 - 但是如何提取问题的原因和可能的解决方案?

2 个答案:

答案 0 :(得分:1)

我遇到了完全相同的问题 - 当手机(Moto G4)设置为“仅设备”模式时,FusedLocationProvider没有响应位置数据。经过一些实验,结果是由于手机盖阻挡了GPS信号!使用像GPS Status and Toolbox这样的应用确实有助于找出卫星的信号强度,是否接收到修复等,

答案 1 :(得分:0)

关于启动结果解析的第二个活动问题:LocationSettingsResult是一个Parcelable对象。因此,您可以使用PutExtra将其与Intent捆绑在一起,并将其广播到活动以启动更正操作。下面的代码片段说明了解包意图和解决状态。

Status status = intent.getParcelableExtra(Constants.EXTRA_SETTINGS_UPDATE_REQD);
            switch (status.getStatusCode()) {
                case LocationSettingsStatusCodes.SUCCESS:
                    // All location settings are satisfied. The client can
                    // initialize location requests here.
                    break;
                case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                    // Location settings are not satisfied, but this can be fixed
                    // by showing the user a dialog.

                    try {
                        // Show the dialog by calling startResolutionForResult(),
                        // and check the result in onActivityResult().
                        status.startResolutionForResult(getActivity(),
                                Constants.REQ_CODE_CHECK_SYSTEM_SETTINGS_LOC);
                    } catch (IntentSender.SendIntentException e) {
                        // Ignore the error.
                    }
                    break;
                case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                    // Location settings are not satisfied. However, we have no way
                    // to fix the settings so we won't show the dialog.

                    break;
            }