Android FusedLocation';s设置SAPI只能工作一次

Android FusedLocation';s设置SAPI只能工作一次,android,google-maps,gps,fusedlocationproviderapi,Android,Google Maps,Gps,Fusedlocationproviderapi,FusedLocation有一个很棒的API来检查用户是否启用了所有相关设置以获取位置。我按照文档启动设置SAPI。我检查用户设置的代码如下 private void checkLocationSetting() { if (mLocationSettingsRequest == null) { mLocationSettingsRequest = new LocationSettingsRequest.Builder()

FusedLocation有一个很棒的API来检查用户是否启用了所有相关设置以获取位置。我按照文档启动设置SAPI。我检查用户设置的代码如下

private void checkLocationSetting()
{
    if (mLocationSettingsRequest == null)
    {
        mLocationSettingsRequest =
                new LocationSettingsRequest.Builder()
                        .addLocationRequest(mLocationRequest)
                        .setAlwaysShow(true)
                        .build();
    }

    PendingResult<LocationSettingsResult> result =
            LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, mLocationSettingsRequest);

    result.setResultCallback(new ResultCallback<LocationSettingsResult>()
    {
        @Override
        public void onResult(LocationSettingsResult result)
        {
            final Status status = result.getStatus();
            final LocationSettingsStates state = result.getLocationSettingsStates();
            switch (status.getStatusCode())
            {
                case LocationSettingsStatusCodes.SUCCESS:
                {
                    // All location settings are satisfied. The client can initialize location
                    // requests here.
                    requestNewLocationBySettingLocationReq();
                    break;
                }
                case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                {
                    // Location settings are not satisfied. But could be fixed by showing the user
                    // a dialog.
                    try
                    {
                        // Show the dialog by calling startResolutionForResult(),
                        // and check the result in onActivityResult().
                        status.startResolutionForResult(SpotToiletMap.this, REQUEST_CHECK_SETTINGS);
                    } 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.
                    MiscellaneousMethods.showGenericSnackBar(rootView, getString(R.string.location_settings_unavailable));
                    break;
                }
            }
        }
    });
}
private void checkLocationSetting()
{
if(mLocationSettingsRequest==null)
{
mLocationSettingsRequest=
新建位置SettingsRequest.Builder()
.addLocationRequest(MLLocationRequest)
.setAlwaysShow(真)
.build();
}
Pendingreult结果=
LocationServices.SettingsApi.checkLocationSettings(MGoogleAppClient、MLLocationSettingsRequest);
result.setResultCallback(新的ResultCallback()
{
@凌驾
公共void onResult(位置设置结果)
{
最终状态状态=result.getStatus();
最终位置SettingsStates状态=结果。getLocationSettingsStates();
开关(status.getStatusCode())
{
案例位置设置StatusCodes.SUCCESS:
{
//满足所有位置设置。客户端可以初始化位置
//请求在这里。
requestNewLocationBySettingLocationReq();
打破
}
案例位置设置StatusCodes.RESOLUTION_要求:
{
//不满足位置设置。但可以通过显示用户来修复
//对话。
尝试
{
//通过调用startResolutionForResult()显示对话框,
//并在onActivityResult()中检查结果。
status.startResult解决方案(spotoiletmap.this,请求检查设置);
}catch(IntentSender.sendtintentexe)
{
//忽略错误。
}
打破
}
案例位置设置StatusCodes.SETTINGS\u CHANGE\u不可用:
{
//位置设置不满意。但是,我们无法修复此问题
//设置,这样我们就不会显示对话框。
showGenericSnackBar(rootView,getString(R.string.location\u settings\u unavailable));
打破
}
}
}
});
}
这段代码第一次运行得非常好。随后,Pendingreult回调从未起作用。我也无法在logcat上找到任何日志。对我来说,这似乎是一个实现问题

下面是如何重现这个问题

关掉你的GPS。尝试调用该方法,它会像预期的那样完美地工作。它要求我切换n个GPS。收到位置更新后,再次关闭GPS并调用此方法。我从未获得启用GPS的对话框。我通过单击按钮调用此方法,尝试获取用户的最新位置

编辑:
我试图将Pendingreult结果声明为类变量。还是不走运。我还试着只初始化一次结果,检查它是否为空,正如预期的那样,正如Google文档中提到的,它抛出一个异常,表明结果已被使用。

问题似乎在于每次都没有重新创建
LocationSettingsRequest.Builder
,因为只有当它为空时才重新创建它

我让它工作了,在Android 4.4.4和6.0.1上进行了测试

每次按下按钮时都会显示该对话框(前提是在按下按钮之间禁用了设备上的位置):

public void checkLocationSetting(){
mLocationRequest=LocationRequest.create();
mLocationRequest.setPriority(位置请求.优先级高精度);
mLocationRequest.setInterval(30*1000);
mlLocationRequest.SetFastTestInterval(5*1000);
LocationSettingsRequest.Builder=新建LocationSettingsRequest.Builder()
.addLocationRequest(MLLocationRequest);
builder.setAlwaysShow(true);
结果=LocationServices.SettingsApi.checkLocationSettings(mgoogleapClient,builder.build());
result.setResultCallback(新的ResultCallback(){
@凌驾
公共void onResult(位置设置结果){
最终状态状态=result.getStatus();
开关(status.getStatusCode()){
案例位置设置StatusCodes.SUCCESS:
//满足所有位置设置。客户端可以初始化位置
//请求在这里。
//...
打破
案例位置设置StatusCodes.RESOLUTION_要求:
//不满足位置设置。但可以通过显示用户来修复
//对话。
试一试{
//通过调用startResolutionForResult()显示对话框,
//并在onActivityResult()中检查结果。
status.StartResult解决方案(
这个,,
请求地址);
}catch(IntentSender.sendtintentexe){
//忽略错误。
}
打破
案例位置设置StatusCodes.SETTINGS\u CHANGE\u不可用:
//位置设置不满意。但是,我们无法修复此问题
//设置,这样我们就不会显示对话框。
//...
打破
}
}
});
}

您在应用程序中使用的Google Play服务的版本是什么?在t
public void checkLocationSetting() {
    mLocationRequest = LocationRequest.create();
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    mLocationRequest.setInterval(30 * 1000);
    mLocationRequest.setFastestInterval(5 * 1000);

    LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
            .addLocationRequest(mLocationRequest);
    builder.setAlwaysShow(true);

    result = LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, builder.build());

    result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
        @Override
        public void onResult(LocationSettingsResult result) {
            final Status status = result.getStatus();
            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 could be fixed by showing the user
                    // a dialog.
                    try {
                        // Show the dialog by calling startResolutionForResult(),
                        // and check the result in onActivityResult().
                        status.startResolutionForResult(
                                MainActivity.this,
                                REQUEST_LOCATION);
                    } 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;
            }
        }
    });

}