Muchas aplicaciones en Android utilizan las ubicaciones de los usuarios, ya sea para pedir taxis o entregar alimentos y artículos. Aquí, se crea una aplicación de Android simple que devolvería la latitud y la longitud del usuario. Una vez que se conocen la latitud y la longitud, se puede ver la ubicación exacta en Google Maps mediante la siguiente consulta: https://www.google.com/maps/search/?api=1&query=,
Nota: La aplicación funcionará perfectamente en un dispositivo real, pero podría mostrar un error en un emulador. Por lo tanto, intente ejecutarlo en un dispositivo real.
Acercarse
Paso 1. Adquisición de permisos
Dado que el uso del permiso del usuario es un asunto de alta privacidad, primero adquiera el permiso del usuario para usar su ubicación solicitándolo. A partir de Android 6.0 (Marshmallow), se incorporó el concepto de permisos de tiempo de ejecución, por lo que se usará lo mismo para obtener permisos. Cualquiera de los siguientes permisos se puede utilizar para esto:
ACCESS_COARSE_LOCATION: Proporciona precisión de ubicación dentro de un bloque de ciudad.
<usos-permiso android:name=”android.permission.ACCESS_COARSE_LOCATION”/>
ACCESS_FINE_LOCATION: Proporciona una ubicación más precisa. Para hacer esto, necesita hacer algo de trabajo pesado, por lo que se recomienda usar esto solo cuando necesitamos una ubicación precisa.
<usos-permiso android:name=”android.permission.ACCESS_FINE_LOCATION” />
En caso de que la aplicación necesite acceder a la ubicación del usuario mientras la aplicación se ejecuta en segundo plano, debemos agregar el siguiente permiso junto con los anteriores:
<usos-permiso android:name=”android.permission.ACCESS_BACKGROUND_LOCATION” />
Necesitamos agregar todos estos permisos en AndroidManifest.xml . Para acceder a este archivo, seleccione la vista de su proyecto como Android y haga clic en:
aplicación -> manifiestos -> AndroidManifest.xml .
Después de agregar todos los permisos, así es como se ve el archivo AndroidManifest.xml :
XML
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.getuserlocation"> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.GetUserLocation"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
Además, dado que Google PlayServices se utilizará para acceder a la ubicación del dispositivo, agréguelo en dependencias, en el archivo Build.Gradle (aplicación) :
implementación ‘com.google.android.gms:play-services-ubicación:17.0.0’
pruebaImplementación ‘junit:junit:4.12’
AndroidTestImplementation ‘androidx.test.ext:junit:1.1.1’
AndroidTestImplementation ‘androidx.test.espresso:espresso-core:3.2.0’
Paso 2. Diseñar el diseño
Como la aplicación es bastante simple, solo contendría MainActivity y, por lo tanto, un único diseño principal. En el diseño, agregue un ImageView y dos TextViews que mostrarían la latitud y la longitud del usuario. La latitud y la longitud que se mostrarán se obtendrán de la lógica de nuestra MainActivity, que se analizará a continuación. Así es como se ve activity_main.xml :
XML
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#4caf50" android:gravity="center" android:orientation="vertical"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingBottom="120dp" android:src="@drawable/gfgimage" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:fontFamily="sans-serif-black" android:text="Latitude:" /> <TextView android:id="@+id/latTextView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Latitude will be here! " android:textColor="#f5f5f5" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:fontFamily="sans-serif-black" android:text="Longitude:" /> <TextView android:id="@+id/lonTextView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Longitude will be here! " android:textColor="#f5f5f5" /> </LinearLayout>
Producción:
Paso 3. Escribiendo la lógica
- Para trabajar en la lógica principal de nuestra aplicación, seguiremos los siguientes puntos clave:
- Comprobar si los permisos que solicitamos están habilitados.
- De lo contrario, solicite los permisos.
- Si se aceptan los permisos y la ubicación está habilitada, obtenga la última ubicación del usuario.
- Para obtener la última ubicación del usuario, utilice la clase pública de Java FusedLocationProviderClient . En realidad, es un servicio de ubicación que combina la ubicación GPS y la ubicación en red para lograr un equilibrio entre el consumo de batería y la precisión. La ubicación del GPS se usa para proporcionar precisión y la ubicación de la red se usa para obtener la ubicación cuando el usuario está en interiores.
- Junto con FusedLocationProviderClient , la clase pública LocationRequest se usa para obtener la última ubicación conocida. En este objeto LocationRequest , establezca una variedad de métodos, como establecer la prioridad de la precisión de la ubicación o en cuántos intervalos se realizará la solicitud de la ubicación.
- Si se requiere una precisión muy alta, use PRIORITY_HIGH_ACCURACY como argumento para el método setPriority(int) . Para una precisión a nivel de ciudad (baja precisión), use PRIORITY_LOW_POWER .
- Una vez que el objeto LocationRequest esté listo, configúrelo en el objeto FusedLocationProviderClient para obtener la ubicación final.
Veamos ahora el archivo MainActivity.java .
Java
import android.Manifest; import android.annotation.SuppressLint; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.location.Location; import android.location.LocationManager; import android.os.Bundle; import android.os.Looper; import android.provider.Settings; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; 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.tasks.OnCompleteListener; import com.google.android.gms.tasks.Task; public class MainActivity extends AppCompatActivity { // initializing // FusedLocationProviderClient // object FusedLocationProviderClient mFusedLocationClient; // Initializing other items // from layout file TextView latitudeTextView, longitTextView; int PERMISSION_ID = 44; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); latitudeTextView = findViewById(R.id.latTextView); longitTextView = findViewById(R.id.lonTextView); mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this); // method to get the location getLastLocation(); } @SuppressLint("MissingPermission") private void getLastLocation() { // check if permissions are given if (checkPermissions()) { // check if location is enabled if (isLocationEnabled()) { // getting last // location from // FusedLocationClient // object mFusedLocationClient.getLastLocation().addOnCompleteListener(new OnCompleteListener<Location>() { @Override public void onComplete(@NonNull Task<Location> task) { Location location = task.getResult(); if (location == null) { requestNewLocationData(); } else { latitudeTextView.setText(location.getLatitude() + ""); longitTextView.setText(location.getLongitude() + ""); } } }); } else { Toast.makeText(this, "Please turn on" + " your location...", Toast.LENGTH_LONG).show(); Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); startActivity(intent); } } else { // if permissions aren't available, // request for permissions requestPermissions(); } } @SuppressLint("MissingPermission") private void requestNewLocationData() { // Initializing LocationRequest // object with appropriate methods LocationRequest mLocationRequest = new LocationRequest(); mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); mLocationRequest.setInterval(5); mLocationRequest.setFastestInterval(0); mLocationRequest.setNumUpdates(1); // setting LocationRequest // on FusedLocationClient mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this); mFusedLocationClient.requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.myLooper()); } private LocationCallback mLocationCallback = new LocationCallback() { @Override public void onLocationResult(LocationResult locationResult) { Location mLastLocation = locationResult.getLastLocation(); latitudeTextView.setText("Latitude: " + mLastLocation.getLatitude() + ""); longitTextView.setText("Longitude: " + mLastLocation.getLongitude() + ""); } }; // method to check for permissions private boolean checkPermissions() { return ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED; // If we want background location // on Android 10.0 and higher, // use: // ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_BACKGROUND_LOCATION) == PackageManager.PERMISSION_GRANTED } // method to request for permissions private void requestPermissions() { ActivityCompat.requestPermissions(this, new String[]{ Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSION_ID); } // method to check // if location is enabled private boolean isLocationEnabled() { LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) || locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); } // If everything is alright then @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == PERMISSION_ID) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { getLastLocation(); } } } @Override public void onResume() { super.onResume(); if (checkPermissions()) { getLastLocation(); } } }
Producción:
Nota: Para ver esta ubicación en Google Maps, simplemente formule la consulta como:
https://www.google.com/maps/search/?api=1&query=37.4219983, -122.084
Esto se verá así:
Publicación traducida automáticamente
Artículo escrito por agarwalkeshav8399 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA