En esta página:
Demo Github
En la parte anterior llamada Como Solicitar Permisos del GPS Cuando una Aplicación se esta ejecutando (FusedLocationProviderClient) con Java – Parte 2 importamos los elementos que usaré en mi aplicación, declaré algunas variables necesarias las cuales usaré en mi código y creamos los primeros métodos y códigos para que la aplicación funcione correctamente, en esta Tercera y última parte, crearemos los últimos métodos y códigos de la aplicación, asimismo compartiré una Demo para ver el proyecto en acción y con el código fuente.
Partes
Antes de continuar te invito a leer los siguientes artículos:
- Que es Android y tu Primera aplicación Hola Mundo
- Como Leer un archivo JSON en Android (Android Studio 3.6.1 + Java) – Parte 1
- Que es Kotlin y otros detalles
- Tipos de Variables en Kotlin
- Que es la Inteligencia Artificial y otros Detalles
- Que es Machine Learning, Historia y otros detalles
- Las Novedades más Destacadas que trae Android Studio 4.0
- Puedes leer más artículos en la categoría Android
Asimismo te invito a escuchar el Podcast: “¿ Que Hago Si No Tengo Los Recursos Para Dedicarme A La Programación ?”:
Spotify: | Sound Cloud: |
Bien ahora continuemos con el Post: Como Solicitar Permisos del GPS Cuando una Aplicación se esta ejecutando (FusedLocationProviderClient) con Java – Parte 3 (Final). te pierdas nuestros próximos contenidos.
Continuaremos creando los métodos y el código en la Actividad Principal (MapsActivity), pasemos con el método onMapReady(). En este método solo declaró la variable mMap para cargar el mapa de google cuando la interface este lista o haya sido cargada.
1 2 3 4 5 6 7 8 |
@Override public void onMapReady(GoogleMap googleMap) { mMap = googleMap; } |
Paso seguido crearé mi método obtenerUltimaUbicacion() el cual llamo en el método o ciclo de vida onCreate().
En el método obtenerUltimaUbicacion() solicitamos permisos cuando el dispositivo cuenta con una versión de Android que es mayor o igual a la versión de Android 6 (Marshmallow – API 23), si esto es cierto, pues ejecutamos el método dialogoSolicitarPermisoGPS() que muestra una ventana o Dialog en donde el usuario debe dar permisos para el uso del GPS de su dispositivo.
El método dialogoSolicitarPermisoGPS() lo crearemos más adelante.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
private void obtenerUltimaUbicacion() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // TODO: Consider calling // Activity#requestPermissions // muestra una ventana o Dialog en donde el usuario debe // dar permisos para el uso del GPS de su dispositivo. // El método dialogoSolicitarPermisoGPS() lo crearemos más adelante. dialogoSolicitarPermisoGPS(); } } } |
Con el método createLocationRequest() obtenemos actualizaciones de la ubicación del usuario, este método también lo llamamos en el método onCreate().
1 2 3 4 5 6 7 8 9 10 |
protected LocationRequest createLocationRequest() { LocationRequest mLocationRequest = LocationRequest.create(); mLocationRequest.setInterval(30000); mLocationRequest.setFastestInterval(10000); mLocationRequest.setSmallestDisplacement(30); mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); return mLocationRequest; } |
Ahora crearemos el método checkLocationSettings() en donde creamos una tarea haciendo uso de las Tasks API, le pasamos algunos oyentes o Listeners (He colocado comentarios para explicar que hace cada parte del código).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
private void checkLocationSetting(LocationSettingsRequest.Builder builder) { builder.setAlwaysShow(true); // Dentro de la variable 'cliente' iniciamos LocationServices, para los servicios de ubicación SettingsClient cliente = LocationServices.getSettingsClient(this); // Creamos una task o tarea para verificar la configuración de ubicación del usuario Task<LocationSettingsResponse> task = cliente.checkLocationSettings(builder.build()); // Adjuntamos OnSuccessListener a la task o tarea task.addOnSuccessListener(this, new OnSuccessListener<LocationSettingsResponse>() { @Override public void onSuccess(LocationSettingsResponse locationSettingsResponse) { // Si la configuración de ubicación es correcta, // se puede iniciar solicitudes de ubicación del usuario // mediante el método iniciarActualizacionesUbicacion() que crearé más abajo. iniciarActualizacionesUbicacion(); } }); // Adjuntamos addOnCompleteListener a la task para gestionar si la tarea se realiza correctamente task.addOnCompleteListener(new OnCompleteListener<LocationSettingsResponse>() { @Override public void onComplete(Task<LocationSettingsResponse> task) { try { LocationSettingsResponse response = task.getResult(ApiException.class); // En try podemos hacer 'algo', si la configuración de ubicación es correcta, } catch (ApiException exception) { switch (exception.getStatusCode()) { case LocationSettingsStatusCodes.RESOLUTION_REQUIRED: // La configuración de ubicación no está satisfecha. // Le mostramos al usuario un diálogo de confirmación de uso de GPS. try { // Transmitimos a una excepción resoluble. ResolvableApiException resolvable = (ResolvableApiException) exception; // Mostramos el diálogo llamando a startResolutionForResult() // y es verificado el resultado en el método onActivityResult(). resolvable.startResolutionForResult( MapsActivity.this, REQUEST_CHECK_SETTINGS); } catch (IntentSender.SendIntentException e) { // Ignora el error. } catch (ClassCastException e) { // Ignorar, aca podría ser un error imposible. } break; case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE: // La configuración de ubicación no está satisfecha // podemos hacer algo. break; } } } }); } |
El método iniciarActualizacionesUbicacion() lo llamamos anteriormente en el método checkLocationSettings() y también será llamado en el método onActivityResult().
Verificamos si el dispositivo cuenta con una versión de Android que es mayor o igual a la versión de Android 6 (Marshmallow – API 23), si esto es cierto, pues le concedemos permisos de ubicación del usuario y obtenemos la ubicación más reciente del usuario, por ende la cámara se mueve y hace zoom hasta su ubicación actual.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public void iniciarActualizacionesUbicacion() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // TODO: Consider calling // Activity#requestPermissions return; } } // Obtenemos la ubicación más reciente fusedLocationClient.requestLocationUpdates(mLocationRequest, mlocationCallback, null /* Looper */); } |
Luego que el usuario da permisos para usar el GPS de su dispositivo, en el método onActivityResult() llamamos al método que creamos anteriormente llamado iniciarActualizacionesUbicacion() el cual empezará a enviar su ubicación en el mapa de google.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
@Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CHECK_SETTINGS) { if (resultCode == RESULT_OK) { // Se cumplen todas las configuraciones de ubicación. // La aplicación envía solicitudes de ubicación del usuario. iniciarActualizacionesUbicacion(); } else { checkLocationSetting(builder); } } } |
Por último mediante el método dialogoSolicitarPermisoGPS() hacemos la solicitud de permisos al usuario para usar el GPS de su dispositivo.
1 2 3 4 5 6 7 8 |
private void dialogoSolicitarPermisoGPS(){ if (ActivityCompat.checkSelfPermission(MapsActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(MapsActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(MapsActivity.this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION}, 123); } } |
Bueno eso es todo, al inicio de cada Parte de este tutorial he colocado una Demo para que veas el proyecto en funcionamiento y entiendas de que trata este tutorial, si bien parece una Geolocalización simple, pues no tanto es así, ya que hacemos uso de FusedLocationProviderClient.
Por ejemplo, cuando ejecutamos una aplicación de pedido de taxi como Uber, Taxi Beat, Easy Taxi, etc. al abrirlas estas nos solicitan activar nuestro GPS, esto es común cuando la aplicación estuvo cerrada mucho tiempo y el GPS estuvo apagado durante mucho tiempo, la aplicación no sabe a donde geolocalizar o que ubicación mostrar en el mapa.
Para solucionar esto, hacemos uso de FusedLocationProviderClient que nos carga la ubicación más reciente del usuario en el mapa y realiza un zoom determinado a esta ubicación más reciente del usuario.
Conclusión
En este tutorial hemos aprendido como hacer para que una aplicación Android, solicite permisos de ubicación (GPS) mientras se esta ejecutando, con el Lenguaje de Programación Java.
Nota (s)
- El código compartido en este tutorial pueden cambiar, quedar obsoleto o continuar, esto no depende de nosotros, si no de la empresa que dan soporte a Android Studio y Java, que suelen cambiar sus métodos y códigos en futuras versiones.
- No olvides que debemos usar la Tecnología para hacer cosas Buenas por el Mundo.
Síguenos en nuestras Redes Sociales para que no te pierdas nuestros próximos contenidos.