无需启用wifi扫描即可从Google Play服务获取设备位置

时间:2019-05-15 16:32:21

标签: java android geolocation google-play-services

我的应用程序要求用户必须位于特定位置,然后才能使用某些功能。为了验证这一点,我将Google Location Services API用作Google Play服务(com.google.android.gms:play-services-location:16.0.0)的一部分。

这已经工作了好多年没有问题,但是由于Google最近在数据隐私方面的不良宣传,用户要求该应用程序不要求启用“ Google位置准确度”(又称为wifi扫描)。问题是-我认为Play服务不会允许我在没有设置的情况下检查设置。

示例代码:

LocationRequest mLocationRequest = LocationRequest.create()
     .setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY)
     .setInterval(UPDATE_INTERVAL).setFastestInterval(FASTEST_INTERVAL_SUCCESS);
LocationSettingsRequest.Builder builder =
        new LocationSettingsRequest.Builder().addLocationRequest(mLocationRequest);

SettingsClient client =  LocationServices.getSettingsClient(this);
Task<LocationSettingsResponse> task = client.checkLocationSettings(builder.build());

task.addOnSuccessListener(this, new OnSuccessListener<LocationSettingsResponse>() {
    @Override
    public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
        checkLastLocation(this);
    }
});

task.addOnFailureListener(this, new OnFailureListener() {
    @Override
    public void onFailure(@NonNull Exception e) {
        int statusCode = ((ApiException) e).getStatusCode();
        switch (statusCode) {
        case CommonStatusCodes.RESOLUTION_REQUIRED:
            try {
                ResolvableApiException resolvable = (ResolvableApiException) e;
                resolvable.startResolutionForResult(this, REQUEST_CHECK_SETTINGS);
            } catch (IntentSender.SendIntentException sendEx) {
                mHelper.handleError(e.getMessage());
            }
            break;
        case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
            mHelper.onLocationReady();
            break;
        }
    }
});

运行此代码后,如果禁用了Google位置准确度-即使启用了设备GPS,并且无论我在位置请求中设置的准确度级别(优先级)如何,任务始终会报告失败。 “ startResolutionForResult”将触发启用它的提示。

如果用户拒绝提示,那么我可以使用以下方法获取其他信息:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    LocationSettingsStates lss = LocationSettingsStates.fromIntent(data);
    if (lss.isLocationPresent() && lss.isLocationUsable()) {
        checkLastLocation(this);
    }
}

这告诉我,即使他们拒绝了该提示,我对位置更新的请求也会成功,但是将由其他提供商提供。

理想情况下,我希望任务不会失败,但是如果必须这样做,我希望能够获得LocationSettingsStates 而无需,而需要使用startResolutionForResult()来打扰用户。 / p>

API建议我应该能够调用task.getResult()。getLocationSettingsStates()),但这仅在任务成功(不需要信息)时才有效-否则调用task.getResult ()生成ApiException(与发送到onFailure的相同)。

0 个答案:

没有答案