requestlocationupdates removelocationupdates locationservices last google fusedlocationproviderclient fusedlocationapi fused example current android android-4.4-kitkat android-location fusedlocationproviderapi android-fusedlocation

android - locationservices - removelocationupdates



¿Por qué es nulo FusedLocationApi.getLastLocation (13)

Compruebe en su dispositivo si ha habilitado la ubicación o no.

Puede habilitarlo desde el Panel de notificaciones o desde Configuración como:

Configuraciones -> Personal -> Ubicación

Sólo he usado el permiso que es:

ACCESS_FINE_LOCATION

Mi código de trabajo es:

package com.go.findlocation; import android.content.pm.PackageManager; import android.location.Location; import android.location.LocationManager; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.ActivityCompat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.widget.TextView; import android.widget.Toast; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.location.LocationListener; import com.google.android.gms.location.LocationRequest; import com.google.android.gms.location.LocationServices; public class MainActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener { private GoogleApiClient mGoogleApiClient = null; //private Location mLocation = null; private LocationManager mLocationManager = null; private LocationRequest mLocationRequest = null; private TextView tv1 = null; private TextView tv2 = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mLocationRequest = new LocationRequest(); mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); mLocationRequest.setInterval(10000); mLocationRequest.setFastestInterval(7000); mLocationRequest.setSmallestDisplacement(1); mGoogleApiClient = new GoogleApiClient.Builder(this) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(LocationServices.API) .build(); mLocationManager = (LocationManager) getSystemService(LOCATION_SERVICE); tv1 = (TextView) findViewById(R.id.tv1); tv2 = (TextView) findViewById(R.id.tv2); } @Override public void onConnected(@Nullable Bundle bundle) { Log.d("abc", "def"); if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // TODO: Consider calling // ActivityCompat#requestPermissions // here to request the missing permissions, and then overriding // public void onRequestPermissionsResult(int requestCode, String[] permissions, // int[] grantResults) // to handle the case where the user grants the permission. See the documentation // for ActivityCompat#requestPermissions for more details. return; } Log.d("ghi", "jkl"); LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); Log.d("connected", String.valueOf(mGoogleApiClient.isConnected())); /* if (mLocation != null) { tv1.setText(String.valueOf(mLocation.getLatitude())); tv2.setText(String.valueOf(mLocation.getLongitude())); } else Toast.makeText(this, "mLocation is null", Toast.LENGTH_SHORT).show();*/ } @Override public void onConnectionSuspended(int i) { } @Override public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { } @Override protected void onStart() { mGoogleApiClient.connect(); super.onStart(); } @Override protected void onStop() { if (mGoogleApiClient.isConnected()) mGoogleApiClient.disconnect(); super.onStop(); } @Override public void onLocationChanged(Location location) { if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // TODO: Consider calling // ActivityCompat#requestPermissions // here to request the missing permissions, and then overriding // public void onRequestPermissionsResult(int requestCode, String[] permissions, // int[] grantResults) // to handle the case where the user grants the permission. See the documentation // for ActivityCompat#requestPermissions for more details. return; } Log.d("mno",String.valueOf(mGoogleApiClient.isConnected())); if (location != null) { tv1.setText(String.valueOf(location.getLatitude())); tv2.setText(String.valueOf(location.getLongitude())); Toast.makeText(this, location.getLatitude()+" "+location.getLongitude(), Toast.LENGTH_SHORT).show(); } else Toast.makeText(this, "location is null", Toast.LENGTH_SHORT).show(); } }

Estoy tratando de obtener la ubicación mediante el uso de FusedLocationApi.getLastLocation y tengo los permisos de ubicación en el archivo de manifiesto:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

Sin embargo, estoy obteniendo un null cuando solicito la ubicación del sistema. Estaba probando los servicios de ubicación y apagado, por lo que puede estar relacionado con eso (por supuesto, está ENCENDIDO cuando estoy intentando esto). Pero incluso después de devolver null, estoy esperando que se onLocationChanged a onLocationChanged y nunca se llama. También he visto una pregunta similar aquí: FusedLocationApi.getLastLocation siempre nulo

Aquí está mi código:

protected LocationRequest createLocationRequest() { LocationRequest mLocationRequest = new LocationRequest(); mLocationRequest.setInterval(120000); mLocationRequest.setFastestInterval(30000); mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); return mLocationRequest; } protected GoogleApiClient getLocationApiClient(){ return new GoogleApiClient.Builder(this) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(LocationServices.API) .build(); } LocationRequest locationRequest = createLocationRequest(); @Override public void onLocationChanged(Location location) { App.setLocation(location); // NEVER CALLED } @Override public void onConnected(Bundle bundle) { App.setLocation(LocationServices.FusedLocationApi.getLastLocation(locationApiClient)); //RETURNS NULL LocationRequest locationRequest = createLocationRequest(); LocationServices.FusedLocationApi.requestLocationUpdates(locationApiClient, locationRequest, this); }

Y en onCreate de mi aplicación:

locationApiClient = getLocationApiClient(); locationApiClient.connect();

Donde this es mi objeto de aplicación. ¿Por qué me estoy quedando nulo (sí, sé que puede ser nulo en algunas circunstancias excepcionales como se indica en los documentos, pero SIEMPRE estoy obteniendo esto, no pocas veces) y aún no recibo actualizaciones de ubicación después de eso? Es un dispositivo real (Samsung Galaxy S3) sin una tarjeta SIM, si ayuda.



El proveedor de ubicación fusionada solo mantendrá la ubicación en segundo plano si al menos un cliente está conectado a ella. Ahora, solo con activar el servicio de ubicación no se garantiza el almacenamiento de la última ubicación conocida.

Una vez que el primer cliente se conecta, inmediatamente intentará obtener una ubicación. Si su actividad es el primer cliente en conectarse y getLastLocation () se invoca de inmediato en onConnected (), es posible que no sea suficiente tiempo para que llegue la primera ubicación.

Entonces está configurando mLocationRequest.setFastestInterval(30000); que básicamente significa 30 segundos. por lo tanto, al menos 30 segundos después, y generalmente de acuerdo con su configuración, el tiempo preferido es de 120 segundos, ¿no es un tiempo muy largo si no hay una última ubicación conocida almacenada? además, está configurando la prioridad de equilibrio de batería, lo que le hará esperar más tiempo.

mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);

Le sugiero que inicie la aplicación Mapas primero, para que haya al menos alguna ubicación confirmada y luego pruebe su aplicación.


Encontré la solución.

Estaba probando mi aplicación en un teléfono con API 22 y funcionó bien, sin embargo, en la ubicación de la API 17 seguía volviendo null .

Como resultado, debes permitir que tu teléfono use los servicios de ubicación de Google. Para hacerlo, vaya a Settings->Location Access->Check the "WLAN & mobile network location" (podría llamarse diferente en otra API). Su ''descripción es la siguiente:

Permita que las aplicaciones usen el servicio de ubicación de Google para estimar su ubicación más rápido. Los datos de ubicación anónimos serán recogidos y enviados a Google.

Al habilitarlo, de repente comencé a obtener datos de ubicación fusionados muy necesarios.

¡Espero que esto ayude!


Esta es la solución exacta. Pero quería agregar algunos pequeños pasos de explicación para que cualquiera obtenga los conceptos exactos. Por qué está volviendo nulo, acepto seguir la respuesta de Amit K. Pero, para garantizar que se evite la ubicación NullPointerException, inicia el procesamiento relacionado con su ubicación dentro de la devolución de llamada onLocationChanged ()

1) onCreate () del componente Android (p. Ej., Actividad , Fragmento o Servicio . Nota: No IntentService ), cree y luego conecte el GoogleApiClient como se muestra a continuación.

buildGoogleApiClient(); mGoogleApiClient.connect();

donde, la implementación de buildGoogleApiClient () es,

protected synchronized void buildGoogleApiClient() { Log.i(TAG, "Building GoogleApiClient"); mGoogleApiClient = new GoogleApiClient.Builder(this) .addApi(LocationServices.API) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .build(); }

Más adelante en onDestroy (), puede desconectar GoogleApiClient como,

@Override public void onDestroy() { Log.i(TAG, "Service destroyed!"); mGoogleApiClient.disconnect(); super.onDestroy(); }

El paso 1 se asegura de construir y conectar el GoogleApiClient.

1) La instancia de GoogleApiClient se conecta por primera vez con el método onConnected (). Ahora, tu próximo paso debería mirar en el método Conectado ().

@Override public void onConnected(@Nullable Bundle bundle) { Log.i(TAG, "GoogleApiClient connected!"); buildLocationSettingsRequest(); createLocationRequest(); location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); Log.i(TAG, " Location: " + location); //may return **null** because, I can''t guarantee location has been changed immmediately }

Anteriormente, llamó a un método createLocationRequest () para crear una solicitud de ubicación. El método createLocationRequest () se ve a continuación.

protected void createLocationRequest() { //remove location updates so that it resets LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); //Import should not be **android.Location.LocationListener** //import should be **import com.google.android.gms.location.LocationListener**; mLocationRequest = new LocationRequest(); mLocationRequest.setInterval(10000); mLocationRequest.setFastestInterval(5000); mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); //restart location updates with the new interval LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); }

3) Ahora, en la devolución de llamada onLocationChange () de la interfaz LocationListener, obtienes una nueva ubicación.

@Override public void onLocationChanged(Location location) { Log.i(TAG, "Location Changed!"); Log.i(TAG, " Location: " + location); //I guarantee of change of location here. }

Obtienes el resultado como este en Logcat: 03-22 18: 34: 17.336 817-817 / com.LiveEarthquakesAlerts I / LocationTracker: Ubicación: Ubicación [fusionado 37.421998, -122.084000 acc = 20 et = + 15m35s840ms alt = 0.0]

Nota: la ubicación anterior es la ubicación de la sede de Google, aunque estoy en Arkansas. Esto sucede cuando usas emulador. En el dispositivo real, muestra la dirección correcta.

Para poder realizar estos tres pasos, debe haber configurado su build.gradle de la siguiente manera:

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


Estaba enfrentando el mismo problema. En mi caso, el problema fue con permitir los permisos para la aplicación. Había denegado el permiso de FINE LOCATION que se me preguntó cuando se inició la aplicación por primera vez.

Intente desinstalar la aplicación de su dispositivo y luego vuelva a desplegarla. Nuevamente pedirá el permiso. Permitir el acceso a una buena ubicación.

Trabajó en mi caso !!


Estoy usando la api FusedLocationProvider en mi aplicación. Aquí está mi código que funciona tanto en el dispositivo como en el emulador:

@Override protected void onCreate(Bundle savedInstanceState){ //put your code here .... getLocation(); } private void getLocation(){ locationRequest = LocationRequest.create(); locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); locationRequest.setInterval(LOCATION_INTERVAL); locationRequest.setFastestInterval(LOCATION_INTERVAL); fusedLocationProviderApi = LocationServices.FusedLocationApi; googleApiClient = new GoogleApiClient.Builder(this) .addApi(LocationServices.API) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .build(); if (googleApiClient != null) { googleApiClient.connect(); } } @Override public void onConnected(Bundle arg0) { fusedLocationProviderApi.requestLocationUpdates(googleApiClient, locationRequest, this); } @Override public void onLocationChanged(Location location) { Toast.makeText(mContext, "location :"+location.getLatitude()+" , "+location.getLongitude(), Toast.LENGTH_SHORT).show(); }

Este es mi código de trabajo.

Espero que mi código te ayude.

Aclamaciones..


Hace 30 minutos se enfrentó un problema similar, el código se estaba ejecutando antes del nuevo simulador. Después de cambiar la longitud del simulador, comenzó a funcionar de nuevo.


No creo que sea un problema de codificación.

Parece que el proveedor de ubicación del dispositivo tiene dificultades para identificar la ubicación en el tiempo propuesto, y el método locationChanged () nunca se llama.

Verifique si la configuración del dispositivo a los servicios de ubicación no está seleccionada con un modo de ubicación más difícil (como solo GPS).

Si es así, su código no puede determinar su ubicación por GPS si está en interiores (como supongo que es). Elija la opción Alta precisión y sus problemas se resolverán.


Probablemente, su problema es cuando conecta el cliente, no puedo probar ahora, pero como se muestra en Google doc en el ejemplo, debe conectar el cliente en su método onStart() en la actividad.

@Override protected void onStart() { super.onStart(); mGoogleApiClient.connect(); } @Override protected void onStop() { super.onStop(); if (mGoogleApiClient.isConnected()) { mGoogleApiClient.disconnect(); } }

Para mí, esto hace que getLocation funcione.


Prueba esto,

private static int UPDATE_INTERVAL = 10000; // 10 sec private static int FATEST_INTERVAL = 5000; // 5 sec private static int DISPLACEMENT = 10; // 10 meters private void createLocationRequest() { mLocationRequest = new LocationRequest(); mLocationRequest.setInterval(UPDATE_INTERVAL); mLocationRequest.setFastestInterval(FATEST_INTERVAL); mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); mLocationRequest.setSmallestDisplacement(DISPLACEMENT); } @Override public void onConnected(@Nullable Bundle bundle) { mLastLocation = LocationServices.FusedLocationApi .getLastLocation(mGoogleApiClient); if(mLastLocation == null){ LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); } }


Si devuelve un valor nulo, esto significa que necesita comenzar a recibir actualizaciones de ubicación con LocationServices.FusedLocationApi.requestLocationUpdates antes de recuperar la ubicación.

Para mí, una solución al problema fue llamar a:

LocationServices.FusedLocationApi.requestLocationUpdates(locationApiClient,locationRequest, this);

antes de:

App.setLocation(LocationServices.FusedLocationApi.getLastLocation(locationApiClient));

El problema es que la última ubicación no existe, por lo que era nula.

Si el problema persiste intente esto:

Compruebe los permisos necesarios.

Asegúrese de que ha habilitado la posición en su dispositivo, luego reinicie.


He utilizado FusedAPI y el código de abajo me funciona ... Prueba en dispositivo Real

import android.Manifest; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.IntentSender; import android.content.pm.PackageManager; import android.location.Location; import android.location.LocationManager; import android.os.AsyncTask; import android.os.Bundle; import android.os.Looper; import android.provider.Settings; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.ActivityCompat; import android.support.v4.app.FragmentActivity; import android.support.v4.content.PermissionChecker; import android.widget.ProgressBar; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GoogleApiAvailability; import com.google.android.gms.common.api.ApiException; import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.common.api.ResolvableApiException; import com.google.android.gms.common.api.ResultCallback; import com.google.android.gms.location.FusedLocationProviderClient; import com.google.android.gms.location.LocationCallback; import com.google.android.gms.location.LocationListener; import com.google.android.gms.location.LocationRequest; import com.google.android.gms.location.LocationResult; import com.google.android.gms.location.LocationServices; import com.google.android.gms.location.LocationSettingsRequest; import com.google.android.gms.location.LocationSettingsResponse; import com.google.android.gms.location.LocationSettingsResult; import com.google.android.gms.location.LocationSettingsStatusCodes; import com.google.android.gms.location.SettingsClient; import com.google.android.gms.maps.CameraUpdate; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.OnMapReadyCallback; import com.google.android.gms.maps.SupportMapFragment; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.LatLngBounds; import com.google.android.gms.maps.model.Marker; import com.google.android.gms.maps.model.MarkerOptions; import com.google.android.gms.tasks.OnCanceledListener; import com.google.android.gms.tasks.OnFailureListener; import com.google.android.gms.tasks.OnSuccessListener; import java.util.ArrayList; import java.util.LinkedHashMap; public class MapsActivity extends FragmentActivity implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener, ResultCallback<LocationSettingsResult> { private static final int REQUEST_CHECK_SETTINGS = 214; private static final int REQUEST_ENABLE_GPS = 516; private final int REQUEST_LOCATION_PERMISSION = 214; protected GoogleApiClient mGoogleApiClient; protected LocationSettingsRequest mLocationSettingsRequest; /* For Google Fused API */ private FusedLocationProviderClient mFusedLocationClient; private SettingsClient mSettingsClient; private LocationCallback mLocationCallback; private LocationRequest mLocationRequest; private Location mCurrentLocation; /* For Google Fused API */ private Context context; private ProgressBar progressBar; private AsyncTask task; private GoogleMap mMap; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_maps); SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() .findFragmentById(R.id.map); mapFragment.getMapAsync(this); try { int permissionCheck = PermissionChecker.checkCallingOrSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION); if (permissionCheck == PackageManager.PERMISSION_GRANTED) { Helper.showLog("Permission is already allowed. Build Client"); buildGoogleApiClient(); } else { Helper.showLog("Permission is requested"); ActivityCompat.requestPermissions(MapsActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_LOCATION_PERMISSION); } } catch (Exception e) { e.printStackTrace(); } } @Override public void onMapReady(GoogleMap googleMap) { mMap = googleMap; // Add a marker in Sydney and move the camera LatLng sydney = new LatLng(-34, 151); mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney")); mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney)); } protected synchronized void buildGoogleApiClient() { mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this); mSettingsClient = LocationServices.getSettingsClient(this); mGoogleApiClient = new GoogleApiClient.Builder(this) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(LocationServices.API) .build(); connectGoogleClient(); mLocationCallback = new LocationCallback() { @Override public void onLocationResult(LocationResult locationResult) { super.onLocationResult(locationResult); Helper.showLog("Location Received"); mCurrentLocation = locationResult.getLastLocation(); onLocationChanged(mCurrentLocation); } }; } private void connectGoogleClient() { GoogleApiAvailability googleAPI = GoogleApiAvailability.getInstance(); int resultCode = googleAPI.isGooglePlayServicesAvailable(this); if (resultCode == ConnectionResult.SUCCESS) { mGoogleApiClient.connect(); } else { int REQUEST_GOOGLE_PLAY_SERVICE = 988; googleAPI.getErrorDialog(this, resultCode, REQUEST_GOOGLE_PLAY_SERVICE); } } @Override public void onConnected(@Nullable Bundle bundle) { mLocationRequest = new LocationRequest(); mLocationRequest.setInterval(30 * 1000); mLocationRequest.setFastestInterval(5 * 1000); mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder(); builder.addLocationRequest(mLocationRequest); builder.setAlwaysShow(true); mLocationSettingsRequest = builder.build(); mSettingsClient .checkLocationSettings(mLocationSettingsRequest) .addOnSuccessListener(new OnSuccessListener<LocationSettingsResponse>() { @Override public void onSuccess(LocationSettingsResponse locationSettingsResponse) { Helper.showLog("GPS Success"); requestLocationUpdate(); } }).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { int statusCode = ((ApiException) e).getStatusCode(); switch (statusCode) { case LocationSettingsStatusCodes.RESOLUTION_REQUIRED: try { ResolvableApiException rae = (ResolvableApiException) e; rae.startResolutionForResult(MapsActivity.this, REQUEST_CHECK_SETTINGS); } catch (IntentSender.SendIntentException sie) { Helper.showLog("PendingIntent unable to execute request."); } break; case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE: Helper.showLog("Location settings are inadequate, and cannot be fixed here. Fix in Settings."); } } }).addOnCanceledListener(new OnCanceledListener() { @Override public void onCanceled() { Helper.showLog("checkLocationSettings -> onCanceled"); } }); } @Override public void onConnectionSuspended(int i) { connectGoogleClient(); } @Override public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { buildGoogleApiClient(); } @Override public void onResult(@NonNull LocationSettingsResult locationSettingsResult) { } @Override public void onLocationChanged(Location location) { String latitude = String.valueOf(location.getLatitude()); String longitude = String.valueOf(location.getLongitude()); if (latitude.equalsIgnoreCase("0.0") && longitude.equalsIgnoreCase("0.0")) { requestLocationUpdate(); } else { //Perform Your Task with LatLong } } @SuppressLint("MissingPermission") private void requestLocationUpdate() { mFusedLocationClient.requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.myLooper()); } @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CHECK_SETTINGS) { switch (resultCode) { case Activity.RESULT_OK: Helper.showLog("User allow to access location. Request Location Update"); requestLocationUpdate(); break; case Activity.RESULT_CANCELED: Helper.showLog("User denied to access location."); openGpsEnableSetting(); break; } } else if (requestCode == REQUEST_ENABLE_GPS) { LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); boolean isGpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); if (!isGpsEnabled) { openGpsEnableSetting(); } else { requestLocationUpdate(); } } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_LOCATION_PERMISSION) { int permissionCheck = PermissionChecker.checkCallingOrSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION); if (permissionCheck == PackageManager.PERMISSION_GRANTED) { Helper.showLog("User Allowed Permission Build Google Client"); buildGoogleApiClient(); } else { Helper.showLog("User Denied Permission"); } } } private void openGpsEnableSetting() { Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); startActivityForResult(intent, REQUEST_ENABLE_GPS); } @Override protected void onDestroy() { //Remove location update callback here mFusedLocationClient.removeLocationUpdates(mLocationCallback); super.onDestroy(); } }

Clase de ayuda

public class Helper { public static void showLog(String message) { Log.e("Ketan", "" + message); } public static void showToast(Context context, String message) { Toast.makeText(context, "" + message, Toast.LENGTH_SHORT).show(); } }

Puede ayudar