Aplicacions amb Flutter, Dart i Flame

Tutorial Flutter Flame Projectes   Recursos CITCEA
Exemples Dart Dades pràctiques     Inici

Geolocalització

Amb la biblioteca geolocator podem saber el lloc on es troba l'usuari. A més, disposem de l'opció de calcular la distància entre dues posicions. Per emprar aquesta biblioteca, cal anar al fitxer pubspec.yaml per dir-li que la volem fer servir. Ho hem de posar a dependencies, indicant quina és la versió que volem, que normalment ja ens surt de manera automàtica. Quan vam escriure aquest text era la 14.0.2.

dependencies:
  flutter:
    sdk: flutter
  geolocator: ^14.0.2

Un cop afegit, cal picar al botó per baixar el paquet (baixar). En el programa, cal importar el paquet shared_preferences.dart.

import 'package:shared_preferences/geolocator.dart';

A més, cal donar permís de geolocalització. Això ho farem anar al fitxer AndroidManifest.xml que es troba a la carpeta main de la carpeta src de la carpeta app de la carpeta android i afegir les línies del permís després de la de manifest i abans de la d'application:

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
    <application
...

Atenció: Cal tenir en compte que l'absència d'aquest permís pot donar problemes a l'executar l'aplicació en el dispositiu, malgrat aquesta funcioni correctament en el simulador.

És convenient comprovar els permisos en el moment d'iniciar l'aplicació.

...
class _PantPrincipalState extends State<PantPrincipal> {
  String _textPermis = 'Permisos no verificats.';
...

  @override
  void initState() {
    super.initState();
    comprovaPermisos();
  }

  Future<void> comprovaPermisos() async {
    LocationPermission permis = await Geolocator.checkPermission();

    if (permis == LocationPermission.denied) {
      setState(() {
        _textPermis = 'Permís desactivat. Demanant permís...';
      });
      permis = await Geolocator.requestPermission();
    }
    setState(() {
      if (permis == LocationPermission.whileInUse || permis == LocationPermission.always) {
        _textPermis = 'Permís activat.';
      } else {
        _textPermis = 'Permís denegat permanentment.';
      }
    });
  }
...

La localització global té uns paràmetres de configuració, encara que el més habitual és posar sempre les mateixes opcions:

...
      final LocationSettings configPosicio = LocationSettings(
        accuracy: LocationAccuracy.high,
        distanceFilter: 100,
      );
...

La lectura es fa amb la funció getCurrentPosition, que ens deixa les coordenades en els paràmetres latitude i longitude. És recomanable fer servir control d'errors en la lectura. Un exemple de funció de lectura pot ser el següent:

...
  Future<void> llegeixPosicio() async {
    try {
      final LocationSettings configPosicio = LocationSettings(
        accuracy: LocationAccuracy.high,
        distanceFilter: 100,
      );
      Position posicio = await Geolocator.getCurrentPosition(locationSettings: configPosicio);
      setState(() {
        _textPosicio = 'Latitud: ${posicio.latitude}, Longitud: ${posicio.longitude}';
      });
    } catch (e) {
      setState(() {
        _textPosicio = 'Error: $e';
      });
    }
  }
...

Podem determinar la distància entre dos punts (en metres) si en sabem les coordenades.

...
    double distancia = Geolocator.distanceBetween(lat1, lon1, lat2, lon2);
...

Podem trobar un exemple d'això en aquest apartat, que correspon a l'exemple de enviar text i localització a Telegram.

 

 

 

 

 

 

 

 

 

 

Llicència de Creative Commons
Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.