En esta página:
Demo
En la parte anterior llamada Como Solicitar Permisos del GPS Cuando una Aplicación se esta ejecutando (FusedLocationProviderClient) con Java – Parte 1 creamos un nuevo proyecto en Android Studio, también configuramos nuestra API KEY o credencial, para poder hace uso de los servicios de Google Maps, en esta Parte 2 vamos a crear el código Java para solicitar permisos del GPS al usuario y mostrar su ubicación más reciente en el Mapa, vamos con ello.
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: “Con Que Lenguaje De Programación Comenzar Para El Desarrollo Web”:
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 2.
Para poder hacer uso de la FusedLocationProviderClient debemos agregar el paquete de servicios de ubicación de Google Play Services, esto lo hacemos en el archivo build.gradle (Module: app) que se encuentra en Gradle Scripts > build.grade (Project: Module app)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
/app ├── /manifests ├── /java ├── /java (generated) ├── /res /Gradle Scripts ├── build.gradle (Project: MiAppGPS) ├── build.gradle (Project: Module: app) // Abro este Archivo ├── gradle-wrapper.properties (Gradle Version) ├── proguard-rules.pro (ProGuard Rules for app) ├── gradle.properties (Project Properties) ├── settings.gradle (Project Settings) ├── local.properties (SDK Location) |
Abro el archivo build.grade (Project: Module app) y en la zona de dependencias agrego el servicio de ubicación de Google Play Services.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
dependencies { implementation fileTree(dir: "libs", include: ["*.jar"]) implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'com.google.android.gms:play-services-maps:17.0.0' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' // Agrego el servicio de ubicación de Google Play Services implementation 'com.google.android.gms:play-services-location:17.0.0' testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test.ext:junit:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' } |
Cuando hice la creación del nuevo proyecto, Android Studio me genero varios archivos uno de ellos es el archivo de la actividad principal llamado MapsActivity.java y en el crearé la funcionalidad para solicitar permisos del GPS al usuario y mostrar su ubicación más reciente en el Mapa, vamos con ello.
Actividad Principal (MapsActivity)
Abro el archivo MapsActivity.java que Android Studio me generó, al crear un nuevo proyecto, este archivo se encuentra en app > java > com > example > miappgps > MapsActivity.java (En Android Studio 4.0 el orden de los directorios y archivos ha cambiado un poco).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
/app ├── /manifests ├── /java ├── /com ├── /example ├── /miappgps ├── MapsActivity.java // Abro este Archivo ├── /com (androidTest) ├── /com (test) ├── /java (generated) ├── /res /Gradle Scripts |
Cuando abro el archivo MapsActivity.java puedo encontrar una clase llamada MapsActivity y dentro de ella crearé los métodos y el código para mi aplicación.
1 2 3 4 5 6 7 |
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback { // Acá va el código } |
Pero antes de la clase MapsActivity importo los siguientes elementos.
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 |
package com.example.miappgps; import androidx.annotation.Nullable; import androidx.core.app.ActivityCompat; import androidx.fragment.app.FragmentActivity; import android.Manifest; import android.content.Intent; import android.content.IntentSender; import android.content.pm.PackageManager; import android.location.Location; import android.os.Build; import android.os.Bundle; import android.util.Log; import com.google.android.gms.common.api.ApiException; import com.google.android.gms.common.api.ResolvableApiException; import com.google.android.gms.location.FusedLocationProviderClient; import com.google.android.gms.location.LocationCallback; 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.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.BitmapDescriptorFactory; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.Marker; import com.google.android.gms.maps.model.MarkerOptions; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.OnSuccessListener; import com.google.android.gms.tasks.Task; public class MapsActivity extends FragmentActivity implements OnMapReadyCallback { // Acá va el código } |
Paso seguido, antes del método o ciclo de vida onCreate() voy declarar las siguientes variables (He colocado comentarios para explicar que hace cada variable).
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 |
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback { // Estado del Settings de verificación de permisos del GPS private static final int REQUEST_CHECK_SETTINGS = 102; // La clase FusedLocationProviderClient private FusedLocationProviderClient fusedLocationClient; // La clase LocationCallback se utiliza para recibir notificaciones de FusedLocationProviderApi // cuando la ubicación del dispositivo ha cambiado o ya no se puede determinar. private LocationCallback mlocationCallback; // La clase LocationSettingsRequest.Builder extiende un Object // y construye una LocationSettingsRequest. private LocationSettingsRequest.Builder builder; // La clase LocationRequest sirve para para solicitar las actualizaciones // de ubicación de FusedLocationProviderApi public LocationRequest mLocationRequest; // Marcador para la ubicación del usuario Marker marker; // Mapa de Google private GoogleMap mMap; @Override protected void onCreate(Bundle savedInstanceState) { // Código para el método onCreate() } } |
Ahora dentro del método onCreate() voy hacer uso de la variable FusedLocationProviderClient, llamo al método obtenerUltimaUbicacion() el cual crearé más adelante, también haré uso de LocationCallback para enviar notificaciones de la ubicación del usuario, luego verificamos si hay coordenadas de ubicación del usuario y si las hay pues agregamos un marcador para su ubicación con el método agregarMarcador() el cual crearé más adelante, obtenemos actualizaciones de la ubicación del usuario, construimos con Builder un LocationSettingsRequest y verificamos la configuración de los permisos de ubicación con el método nativo checkLocationSetting que pertenece a SettingsClient (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 66 67 68 69 |
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback { private static final int REQUEST_CHECK_SETTINGS = 102; private FusedLocationProviderClient fusedLocationClient; private LocationCallback mlocationCallback; private LocationSettingsRequest.Builder builder; public LocationRequest mLocationRequest; Marker marker; private GoogleMap mMap; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_maps); // Obtain the SupportMapFragment and get notified when the map is ready to be used. SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() .findFragmentById(R.id.map); mapFragment.getMapAsync(this); // Hago uso de FusedLocationProviderClient fusedLocationClient = LocationServices.getFusedLocationProviderClient(this); // Método para obtener la última ubicación del usuario (Lo crearé más adelante) obtenerUltimaUbicacion(); // Con LocationCallback enviamos notificaciones de la ubicación del usuario mlocationCallback = new LocationCallback() { @Override public void onLocationResult(LocationResult locationResult) { // Si no hay coordenadas de la ubicación del usuario le pasamos un return if (locationResult == null) { return; } // Cuando obtenemos la coordenadas de ubicación del usuario, agregamos // un marcador para la ubicación del usuario con el método agregarMarcador() // el cual crearé más adelante for (Location location : locationResult.getLocations()) { agregarMarcador(location.getLatitude(),location.getLongitude()); //Log.e("Coordenadas: ", location.toString()); } }; }; // Obtenemos actualizaciones de la ubicación del usuario mLocationRequest = createLocationRequest(); // Construimos un LocationSettingsRequest builder = new LocationSettingsRequest.Builder() .addLocationRequest(mLocationRequest); // Verificamos la configuración de los permisos de ubicación checkLocationSetting(builder); } } |
Ahora crearé el método agregarMarcador() el cual llamo dentro del método onCreate y dentro del LocationCallback en el método onLocationResult.
Obtengo las coordenadas de la ubicación del usuario, hacemos un zoom, yo le daré 19 de zoom, le ponemos un titulo que será mostrado cuando el usuario presione el marcador en la pantalla, hago uso de un drawable (imagen en formato PNG transparente) llamado usuario.png y por último movemos la cámara hacia la ubicación del usuario.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
private void agregarMarcador(double lat, double lng) { LatLng coordenadas = new LatLng(lat, lng); CameraUpdate miUbicacion = CameraUpdateFactory.newLatLngZoom(coordenadas, 19); if (marker != null) marker.remove(); marker = mMap.addMarker(new MarkerOptions() .position(coordenadas) .title("Tu posición") .icon(BitmapDescriptorFactory.fromResource(R.drawable.usuario))); mMap.animateCamera(miUbicacion); } |
El archivo para el marcador usuario.png lo he colocado dentro del directorio drawable, específicamente en app > res > drawable > usuario.png
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
/app ├── /manifests ├── /java ├── /java (generated) ├── /res ├── /drawable ├── ic_launcher_background.xml ├── ic_launcher_background.xml (v24) ├── usuario.png // Este Archivo ├── /layout ├── /mipmap ├── /values /Gradle Scripts |
Bien hasta aquí esta segunda parte en donde he importado los elementos que usaré en mi actividad, he creado las variables que usaré en mi código y he creado los primeros métodos y códigos para la aplicación.
Ten Paciencia, lo que quiero es que entiendas todo el proceso para Crear este Proyecto y no llenarte el capitulo de mucho contenido porque te puedes marear y no tendrás un óptimo aprendizaje.
Nota (s)
- En el siguiente capitulo terminaremos de crear los métodos y el código para que la aplicación funciones sin problemas.
- El código compartido en este capitulo del 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.