¿Cómo mostrar el cuadro de diálogo Habilitar ubicación como Google Maps?

129

Utilizo la última versión de Google Play Services (7.0) y seguí los pasos dados en su guía y habilité el cuadro de diálogo de ubicación como se muestra a continuación, que tiene un botón "nunca". Mi aplicación necesita ubicación obligatoriamente, por lo que no quiero mostrar "nunca" al usuario, porque una vez que el usuario hace clic en "nunca", no puedo obtener la ubicación ni solicitarla nuevamente.

Mientras que Google Maps solo tiene un botón de sí y no sin un botón, ¿alguna idea de cómo lograrlo?

La imagen de mi aplicación ingrese la descripción de la imagen aquí

Imagen de Google Map ingrese la descripción de la imagen aquí

Mufri A
fuente

Respuestas:

149

LocationSettingsRequest.Builder tiene un método setAlwaysShow(boolean show). Si bien el documento indica que actualmente no está haciendo nada (actualizado 2015-07-05: la documentación actualizada de Google ha eliminado esta redacción), la configuración builder.setAlwaysShow(true);habilitará el comportamiento de Google Maps: ingrese la descripción de la imagen aquí

Aquí está el código que lo hizo funcionar:

if (googleApiClient == null) {
    googleApiClient = new GoogleApiClient.Builder(getActivity())
            .addApi(LocationServices.API)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this).build();
    googleApiClient.connect();

    LocationRequest locationRequest = LocationRequest.create();
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    locationRequest.setInterval(30 * 1000);
    locationRequest.setFastestInterval(5 * 1000);
    LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
            .addLocationRequest(locationRequest);

    //**************************
    builder.setAlwaysShow(true); //this is the key ingredient
    //**************************

    PendingResult<LocationSettingsResult> result =
            LocationServices.SettingsApi.checkLocationSettings(googleApiClient, builder.build());
    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.
                    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(
                                getActivity(), 1000);
                    } 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;
            }
        }
    });
}

De la documentación de Android

Para Kotlin ver aquí: https://stackoverflow.com/a/61868985/12478830

Kai
fuente
1
@ MarianPaździoch está bastante seguro de que no es necesario, ya que el propio código de muestra de Google en SettingsApi no lo requiere.
Kai
1
@Kai Sí, el código no se modifica en un Nexus 5. Al usar los registros, veo que cuando los servicios de ubicación están inicialmente desactivados, siempre se activa RESOLUTION_REQUIRED. Luego, una vez que acepto y habilito la ubicación, golpea SUCCESSy omite por completo onActivityResult(). Presionar Noo retroceder hace que el cuadro de diálogo desaparezca por un segundo, luego vuelva a cargar y presione RESOLUTION_REQUIREDnuevamente. La única forma de deshacerse del diálogo es aceptar o cerrar y volver a abrir la aplicación.
pez
2
@pez probó en Galaxy S4 con los servicios de Google Play 7.5.74 y funciona, la cancelación no hace que se llame a RESOLUTION_REQUIRED. Mi sugerencia sería actualizar los servicios de reproducción e intentar nuevamente. Si eso falla, inicie una nueva pregunta de StackOverflow para ver si otros han encontrado y resuelto este problema.
Kai
2
@Kai funcionó para mí, pero qué pasa si un usuario presionó no. Cómo mostrar el diálogo nuevamente o agregar algún código allí si presionó no. Cualquier ayuda será muy apreciada.
Gurpreet singh
1
NOTA: su actividad launchModeNO se puede configurar de singleInstanceotra manera, esto NO funcionará. El cuadro de diálogo nunca aparecerá y onActivityResultse llamará automáticamente. NO TIENES android:launchMode="singleInstance"para tu actividad en AndroidManifest. Aprendí de esta manera muy difícil después de 3 horas
ᴛʜᴇᴘᴀᴛᴇʟ
55

Me gustaría agregar algunos cambios a la respuesta de kai para aquellos que buscan manejar botones Sí / No.

Declara esta constante en tu actividad

protected static final int REQUEST_CHECK_SETTINGS = 0x1;

llame settingsrequest()a su onStart ()

public void settingsrequest()
    {
        LocationRequest locationRequest = LocationRequest.create();
        locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        locationRequest.setInterval(30 * 1000);
        locationRequest.setFastestInterval(5 * 1000);
        LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
                .addLocationRequest(locationRequest);
        builder.setAlwaysShow(true); //this is the key ingredient

        PendingResult<LocationSettingsResult> result =
                LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, builder.build());
        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.
                        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_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.
                        break;
                }
            }
        });
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
// Check for the integer request code originally supplied to startResolutionForResult().
            case REQUEST_CHECK_SETTINGS:
                switch (resultCode) {
                    case Activity.RESULT_OK:
                        startLocationUpdates();
                        break;
                    case Activity.RESULT_CANCELED:
                        settingsrequest();//keep asking if imp or do whatever
                        break;
                }
                break;
        }
    }
Veer3383
fuente
1
obtenido de la documentación oficial: developers.google.com/android/reference/com/google/android/gms/… si necesita agregar solo mapas, para usar esto debe agregar esas bibliotecas (sin importar toda la biblioteca de servicios de juego ): compilar 'com.google.android.gms: play-services-maps: 9.0.2' compilar 'com.google.android.gms: play-services-location: 9.0.2'
MatPag
cómo manejar el evento de clic de este diálogo y nunca debo mostrar el botón nunca en el diálogo
M.Yogeshwaran
elimine la línea settingsrequest () de la caja del interruptor en ActivityOnResult .. ¿Es eso lo que está preguntando?
Veer3383
Si no hago clic en ningún botón del cuadro de diálogo, ese cuadro de diálogo aparece continuamente ... Ya elimino la línea settingsrequest () de la caja del interruptor en ActivityOnResult ... ¿entonces por qué se muestra continuamente?
Asmi
Puede que necesite limpiar el proyecto.
Veer3383 el
25

LocationServices.SettingsApi está en desuso ahora, así que usamos SettingsClient

    LocationRequest mLocationRequest = new LocationRequest();
        mLocationRequest.setInterval(10);
        mLocationRequest.setSmallestDisplacement(10);
        mLocationRequest.setFastestInterval(10);
        mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        LocationSettingsRequest.Builder builder = new 
        LocationSettingsRequest.Builder();
        builder.addLocationRequest(mLocationRequest);

Luego verifique si la configuración de ubicación actual se cumple. Cree la tarea LocationSettingsResponse:

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

Luego agregue Listener

task.addOnCompleteListener(new OnCompleteListener<LocationSettingsResponse>() {
            @Override
                    public void onComplete(Task<LocationSettingsResponse> task) {
                        try {
                            LocationSettingsResponse response = task.getResult(ApiException.class);
                            // All location settings are satisfied. The client can initialize location
                            // requests here.

                        } catch (ApiException exception) {
                            switch (exception.getStatusCode()) {
                                case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                                    // Location settings are not satisfied. But could be fixed by showing the
                                    // user a dialog.
                                    try {
                                        // Cast to a resolvable exception.
                                        ResolvableApiException resolvable = (ResolvableApiException) exception;
                                        // Show the dialog by calling startResolutionForResult(),
                                        // and check the result in onActivityResult().
                                        resolvable.startResolutionForResult(
                                                HomeActivity.this,
                                                101);
                                    } catch (IntentSender.SendIntentException e) {
                                        // Ignore the error.
                                    } catch (ClassCastException e) {
                                        // Ignore, should be an impossible 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;
                            }
                        }
                    }
                });

Añadido enActivityResult

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        final LocationSettingsStates states = LocationSettingsStates.fromIntent(data);
        switch (requestCode) {
            case 101:
                switch (resultCode) {
                    case Activity.RESULT_OK:
                        // All required changes were successfully made
                        Toast.makeText(HomeActivity.this,states.isLocationPresent()+"",Toast.LENGTH_SHORT).show();
                        break;
                    case Activity.RESULT_CANCELED:
                        // The user was asked to change settings, but chose not to
                        Toast.makeText(HomeActivity.this,"Canceled",Toast.LENGTH_SHORT).show();
                        break;
                    default:
                        break;
                }
                break;
        }
    }

Consulte el enlace ConfiguraciónCliente

Arul Pandian
fuente
1
Compruebe stackoverflow.com/a/53277287 @BadLoser usando SettingsClient
Ketan Ramani el
¿Cuál es el nombre de la dependencia para importar? No se puede resolver el símbolo Tarea.
Denis
Lo encontré: implementación 'com.google.android.gms: play-services-task: 16.0.1'
Denis
@ Denis, podría usar implementation 'com.google.android.gms:play-services-location:16.0.0'en su lugar.
CoolMind
25

¿Funciona de manera similar a Google Maps?
Código fuente: https://drive.google.com/open?id=0BzBKpZ4nzNzUOXM2eEhHM3hOZk0

Agregar dependencia en el archivo build.gradle:

compile 'com.google.android.gms:play-services:8.3.0'

O

compile 'com.google.android.gms:play-services-location:10.0.1'

ingrese la descripción de la imagen aquí

public class LocationOnOff_Similar_To_Google_Maps extends AppCompatActivity {

    protected static final String TAG = "LocationOnOff";


    private GoogleApiClient googleApiClient;
    final static int REQUEST_LOCATION = 199;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        this.setFinishOnTouchOutside(true);

        // Todo Location Already on  ... start
        final LocationManager manager = (LocationManager) LocationOnOff_Similar_To_Google_Maps.this.getSystemService(Context.LOCATION_SERVICE);
        if (manager.isProviderEnabled(LocationManager.GPS_PROVIDER) && hasGPSDevice(LocationOnOff_Similar_To_Google_Maps.this)) {
            Toast.makeText(LocationOnOff_Similar_To_Google_Maps.this,"Gps already enabled",Toast.LENGTH_SHORT).show();
            finish();
        }
        // Todo Location Already on  ... end

        if(!hasGPSDevice(LocationOnOff_Similar_To_Google_Maps.this)){
            Toast.makeText(LocationOnOff_Similar_To_Google_Maps.this,"Gps not Supported",Toast.LENGTH_SHORT).show();
        }

        if (!manager.isProviderEnabled(LocationManager.GPS_PROVIDER) && hasGPSDevice(LocationOnOff_Similar_To_Google_Maps.this)) {
            Log.e("keshav","Gps already enabled");
            Toast.makeText(LocationOnOff_Similar_To_Google_Maps.this,"Gps not enabled",Toast.LENGTH_SHORT).show();
            enableLoc();
        }else{
            Log.e("keshav","Gps already enabled");
            Toast.makeText(LocationOnOff_Similar_To_Google_Maps.this,"Gps already enabled",Toast.LENGTH_SHORT).show();
        }
    }


    private boolean hasGPSDevice(Context context) {
        final LocationManager mgr = (LocationManager) context
                .getSystemService(Context.LOCATION_SERVICE);
        if (mgr == null)
            return false;
        final List<String> providers = mgr.getAllProviders();
        if (providers == null)
            return false;
        return providers.contains(LocationManager.GPS_PROVIDER);
    }

    private void enableLoc() {

        if (googleApiClient == null) {
            googleApiClient = new GoogleApiClient.Builder(LocationOnOff_Similar_To_Google_Maps.this)
                    .addApi(LocationServices.API)
                    .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() {
                        @Override
                        public void onConnected(Bundle bundle) {

                        }

                        @Override
                        public void onConnectionSuspended(int i) {
                            googleApiClient.connect();
                        }
                    })
                    .addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() {
                        @Override
                        public void onConnectionFailed(ConnectionResult connectionResult) {

                            Log.d("Location error","Location error " + connectionResult.getErrorCode());
                        }
                    }).build();
            googleApiClient.connect();

            LocationRequest locationRequest = LocationRequest.create();
            locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
            locationRequest.setInterval(30 * 1000);
            locationRequest.setFastestInterval(5 * 1000);
            LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
                    .addLocationRequest(locationRequest);

            builder.setAlwaysShow(true);

            PendingResult<LocationSettingsResult> result =
                    LocationServices.SettingsApi.checkLocationSettings(googleApiClient, builder.build());
            result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
                @Override
                public void onResult(LocationSettingsResult result) {
                    final Status status = result.getStatus();
                    switch (status.getStatusCode()) {
                        case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                            try {
                                // Show the dialog by calling startResolutionForResult(),
                                // and check the result in onActivityResult().
                                status.startResolutionForResult(LocationOnOff_Similar_To_Google_Maps.this, REQUEST_LOCATION);

                                finish();
                            } catch (IntentSender.SendIntentException e) {
                                // Ignore the error.
                            }
                            break;
                    }
                }
            });
        }
    }

}
Keshav Gera
fuente
es un placer
Keshav Gera
1
Vea la publicación del receptor de difusión muy útil y me gusta stackoverflow.com/questions/15698790/…
Keshav Gera
Solución perfecta.
Lalit Sharma
Gracias Lalit Sharma
Keshav Gera
¿Pueden actualizar el enlace? Ahora está roto, publiquen el código en GitHub
Manoj Perumarath
7

Ola Cabs está utilizando la API de configuración recientemente lanzada para lograr esta funcionalidad. Según la nueva API, no se requiere que el usuario navegue a la página de configuración para habilitar los servicios de ubicación que brindan una integración perfecta para el mismo. Por favor lea a continuación para más detalles:

https://developers.google.com/android/reference/com/google/android/gms/location/SettingsApi

Abhi
fuente
esto se ve igual que la respuesta veer3383.
corrígeme
@rakeshkashyap sí, es lo mismo
MatPag
Quería saber si es posible hacer lo siguiente: * establecer un tiempo de espera para obtener la ubicación. * verifique en la API de configuración de GPS, si todos los sensores necesarios están habilitados y muestre el mensaje en consecuencia. * Si esto es posible, ¿cómo establecer un tiempo de espera? No pude encontrar ninguna configuración de este tipo al crear la API
rakesh kashyap
Hola, tengo un problema al cargar el mapa por segunda vez después de encender el GPS desde el estado Desactivado. Por favor, que alguien me ayude: stackoverflow.com/questions/44368960/… Gracias.
Jaimin Modi
3
SettingsAPIha quedado en desuso, ahora usa SettingsClient developers.google.com/android/reference/com/google/android/gms/…
Saik Caskey
7

Dependencia

compile 'com.google.android.gms:play-services-location:10.0.1'

Código

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.IntentSender;
import android.location.LocationManager;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.PendingResult;
import com.google.android.gms.common.api.ResultCallback;
import com.google.android.gms.common.api.Status;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.location.LocationSettingsRequest;
import com.google.android.gms.location.LocationSettingsResult;
import com.google.android.gms.location.LocationSettingsStates;
import com.google.android.gms.location.LocationSettingsStatusCodes;

public class MainActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {

    public static final int REQUEST_LOCATION=001;

    GoogleApiClient googleApiClient;

    LocationManager locationManager;
    LocationRequest locationRequest;
    LocationSettingsRequest.Builder locationSettingsRequest;
    Context context;


    PendingResult<LocationSettingsResult> pendingResult;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        context = this;

        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
            Toast.makeText(this, "Gps is Enabled", Toast.LENGTH_SHORT).show();

        } else {
            mEnableGps();
        }

    }

    public void mEnableGps() {
        googleApiClient = new GoogleApiClient.Builder(context)
                .addApi(LocationServices.API).addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .build();
        googleApiClient.connect();
        mLocationSetting();
    }

    public void mLocationSetting() {
        locationRequest = LocationRequest.create();
        locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        locationRequest.setInterval(1 * 1000);
        locationRequest.setFastestInterval(1 * 1000);

        locationSettingsRequest = new LocationSettingsRequest.Builder().addLocationRequest(locationRequest);

        mResult();

    }

    public void mResult() {
        pendingResult = LocationServices.SettingsApi.checkLocationSettings(googleApiClient, locationSettingsRequest.build());
        pendingResult.setResultCallback(new ResultCallback<LocationSettingsResult>() {
            @Override
            public void onResult(@NonNull LocationSettingsResult locationSettingsResult) {
                Status status = locationSettingsResult.getStatus();


                switch (status.getStatusCode()) {
                    case LocationSettingsStatusCodes.SUCCESS:
                        // All location settings are satisfied. The client can initialize location
                        // requests here.

                        break;
                    case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:

                        try {

                            status.startResolutionForResult(MainActivity.this, REQUEST_LOCATION);
                        } catch (IntentSender.SendIntentException e) {

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

        });
    }


    //callback method
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        final LocationSettingsStates states = LocationSettingsStates.fromIntent(data);
        switch (requestCode) {
            case REQUEST_LOCATION:
                switch (resultCode) {
                    case Activity.RESULT_OK:
                        // All required changes were successfully made
                        Toast.makeText(context, "Gps enabled", Toast.LENGTH_SHORT).show();
                        break;
                    case Activity.RESULT_CANCELED:
                        // The user was asked to change settings, but chose not to
                        Toast.makeText(context, "Gps Canceled", Toast.LENGTH_SHORT).show();
                        break;
                    default:
                        break;
                }
                break;
        }
    }


    @Override
    public void onConnected(@Nullable Bundle bundle) {

    }

    @Override
    public void onConnectionSuspended(int i) {

    }

    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

    }
}
Francis
fuente
4

También puede agregar varios LocationRequests for Builder para lograr el cuadro de diálogo "Usar GPS, Wi-Fi y redes móviles para la ubicación" en lugar de simplemente "Usar GPS para la ubicación"

LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
                .addLocationRequest(createLocationRequest(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY))
                .addLocationRequest(createLocationRequest(LocationRequest.PRIORITY_HIGH_ACCURACY))
                .setAlwaysShow(true);

PendingResult<LocationSettingsResult> result =
                LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, builder.build());
Andrey Busik
fuente
En mi caso, es suficiente usar PRIORITY_HIGH_ACCURACY para obtener la frase "Usar GPS, Wi-Fi y redes móviles para la ubicación". Pero es extraño que funcione en un dispositivo real, pero en el simulador no. En el simulador, la oración siempre está sin "Usar GPS" al principio, aunque veo que el dispositivo simulador tiene GPS.
mikep
0

En Kotlin, use este código:

import android.app.Activity
import android.content.Intent
import android.content.IntentSender
import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import com.google.android.gms.common.api.GoogleApiClient
import com.google.android.gms.common.api.PendingResult
import com.google.android.gms.common.api.Status
import com.google.android.gms.location.*

class MainActivity : AppCompatActivity() {
    private var googleApiClient: GoogleApiClient? = null
    private val REQUESTLOCATION = 199
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableLoc()
    }
    private fun enableLoc() {
        googleApiClient = GoogleApiClient.Builder(this)
            .addApi(LocationServices.API)
            .addConnectionCallbacks(object : GoogleApiClient.ConnectionCallbacks {
                override fun onConnected(bundle: Bundle?) {}
                override fun onConnectionSuspended(i: Int) {
                    googleApiClient?.connect()
                }
            })
            .addOnConnectionFailedListener {
            }.build()
        googleApiClient?.connect()
        val locationRequest = LocationRequest.create()
        locationRequest.priority = LocationRequest.PRIORITY_HIGH_ACCURACY
        locationRequest.interval = 30 * 1000.toLong()
        locationRequest.fastestInterval = 5 * 1000.toLong()
        val builder = LocationSettingsRequest.Builder()
            .addLocationRequest(locationRequest)
        builder.setAlwaysShow(true)
        val result: PendingResult<LocationSettingsResult> =
            LocationServices.SettingsApi.checkLocationSettings(googleApiClient, builder.build())
        result.setResultCallback { result ->
            val status: Status = result.status
            when (status.statusCode) {
                LocationSettingsStatusCodes.RESOLUTION_REQUIRED -> try {
                    status.startResolutionForResult(
                        this@MainActivity,
                        REQUESTLOCATION
                    )
                } catch (e: IntentSender.SendIntentException) {
                }
            }
        }
    }
    override fun onActivityResult(
        requestCode: Int,
        resultCode: Int,
        data: Intent?
    ) {
        super.onActivityResult(requestCode, resultCode, data)
        when (requestCode) {
            REQUESTLOCATION -> when (resultCode) {
                Activity.RESULT_OK -> Log.d("abc","OK")
                Activity.RESULT_CANCELED -> Log.d("abc","CANCEL")
            }
        }
    }
}
MMG
fuente
0

Compruebe mi solución muy simple para obtener la ubicación del usuario en primer plano.

  1. Diálogo de configuración de GPS
  2. Ubicación del usuario con datos en vivo.
  3. La clase LocationUtility es el ciclo de vida de la actividad consciente de pausar / reanudar las actualizaciones de ubicación.
  4. Ubicación con el último cliente FusedLocationProviderClient

https://github.com/Maqsood007/UserLocation-Android/blob/master/app/src/main/java/jetpack/skill/userlocation_android/utils/LocationUtility.kt

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Muhammad Maqsood
fuente