traduccion google fusedlocationproviderclient fused example android google-maps gps fusedlocationproviderapi

fusedlocationproviderclient - google api client location android



La configuración de Android FusedLocationApi no funciona más de una vez (1)

Parece que el problema es que no está volviendo a crear LocationSettingsRequest.Builder cada vez, ya que solo lo vuelve a crear si es nulo.

Lo tengo funcionando, probado en Android 4.4.4 y 6.0.1.

El cuadro de diálogo se muestra cada vez que se presiona el botón (siempre que la ubicación esté desactivada en el dispositivo entre las pulsaciones de los botones):

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; } } }); }

FusedLocation tiene una maravillosa API para verificar si el usuario ha habilitado todas las configuraciones relevantes para obtener la ubicación. Seguí la documentación https://developers.google.com/android/reference/com/google/android/gms/location/SettingsApi para iniciar SettingsApi. Mi código para verificar la configuración del usuario es el siguiente

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; } } } }); }

Esta pieza de código funciona perfectamente bien por primera vez. Posteriormente, el CallBack PendingResult nunca funcionó. No pude encontrar ningún registro en Logcat también. Para mí, parece un problema de implementación.

Aquí es cómo reproducir el problema.

Apaga tu GPS. Intente llamar al método y funciona perfectamente como se espera. Me pide que cambie n GPS. Una vez que reciba la actualización de ubicación, apague el GPS nuevamente y llame a este método. Nunca me aparece un diálogo para habilitar el GPS. Llamo a este método con un clic de botón que intenta obtener la última ubicación del usuario.

EDITAR: Intenté declarar el resultado de PendingResult como una variable de clase. Todavía sin suerte. También traté de inicializar el resultado una sola vez comprobando si es nulo, como se esperaba y, como se menciona en la documentación de Google, arroja una excepción que menciona que el resultado ya se ha consumido.