165 lines
6.0 KiB
Dart
165 lines
6.0 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:flutter/foundation.dart' show kIsWeb;
|
|
import 'package:geolocator/geolocator.dart';
|
|
import 'package:latlong2/latlong.dart';
|
|
|
|
/// Service de géolocalisation pour gérer les permissions et l'accès à la position
|
|
class LocationService {
|
|
/// Vérifie si les services de localisation sont activés
|
|
static Future<bool> isLocationServiceEnabled() async {
|
|
// En version web, on considère que les services de localisation sont toujours activés
|
|
// car la vérification est gérée différemment par le navigateur
|
|
if (kIsWeb) {
|
|
return true;
|
|
}
|
|
return await Geolocator.isLocationServiceEnabled();
|
|
}
|
|
|
|
/// Vérifie et demande les permissions de localisation
|
|
/// Retourne true si l'autorisation est accordée, false sinon
|
|
static Future<bool> checkAndRequestPermission() async {
|
|
// En version web, on considère que les permissions sont toujours accordées
|
|
// car la gestion des permissions est différente et gérée par le navigateur
|
|
if (kIsWeb) {
|
|
return true;
|
|
}
|
|
|
|
try {
|
|
// Vérifier si les services de localisation sont activés
|
|
bool serviceEnabled = await isLocationServiceEnabled();
|
|
if (!serviceEnabled) {
|
|
// Les services de localisation ne sont pas activés, on ne peut pas demander la permission
|
|
return false;
|
|
}
|
|
|
|
// Vérifier le statut actuel de la permission
|
|
LocationPermission permission = await Geolocator.checkPermission();
|
|
|
|
if (permission == LocationPermission.denied) {
|
|
// Demander la permission
|
|
permission = await Geolocator.requestPermission();
|
|
if (permission == LocationPermission.denied) {
|
|
// La permission a été refusée
|
|
return false;
|
|
}
|
|
}
|
|
|
|
if (permission == LocationPermission.deniedForever) {
|
|
// La permission a été refusée définitivement
|
|
return false;
|
|
}
|
|
|
|
// La permission est accordée (whileInUse ou always)
|
|
return true;
|
|
} catch (e) {
|
|
debugPrint('Erreur lors de la vérification des permissions de localisation: $e');
|
|
// En cas d'erreur, on retourne false pour être sûr
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/// Obtient la position actuelle de l'utilisateur
|
|
/// Retourne null si la position ne peut pas être obtenue
|
|
static Future<LatLng?> getCurrentPosition() async {
|
|
try {
|
|
// En version web, la géolocalisation fonctionne différemment
|
|
// et peut être bloquée par le navigateur si le site n'est pas en HTTPS
|
|
if (kIsWeb) {
|
|
try {
|
|
Position position = await Geolocator.getCurrentPosition(
|
|
desiredAccuracy: LocationAccuracy.high,
|
|
);
|
|
return LatLng(position.latitude, position.longitude);
|
|
} catch (e) {
|
|
debugPrint('Erreur lors de l\'obtention de la position en version web: $e');
|
|
// En version web, en cas d'erreur, on peut retourner une position par défaut
|
|
// ou null selon les besoins de l'application
|
|
return null;
|
|
}
|
|
}
|
|
|
|
// Version mobile
|
|
// Vérifier si l'autorisation est accordée
|
|
bool hasPermission = await checkAndRequestPermission();
|
|
if (!hasPermission) {
|
|
return null;
|
|
}
|
|
|
|
// Obtenir la position actuelle
|
|
Position position = await Geolocator.getCurrentPosition(
|
|
desiredAccuracy: LocationAccuracy.high,
|
|
);
|
|
|
|
return LatLng(position.latitude, position.longitude);
|
|
} catch (e) {
|
|
debugPrint('Erreur lors de l\'obtention de la position: $e');
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/// Vérifie si l'application peut accéder à la position de l'utilisateur
|
|
/// Retourne un message d'erreur si l'accès n'est pas possible, null sinon
|
|
static Future<String?> getLocationErrorMessage() async {
|
|
// En version web, on considère qu'il n'y a pas d'erreur de localisation
|
|
// car la gestion des permissions est gérée par le navigateur
|
|
if (kIsWeb) {
|
|
return null;
|
|
}
|
|
|
|
try {
|
|
// Vérifier si les services de localisation sont activés
|
|
bool serviceEnabled = await isLocationServiceEnabled();
|
|
if (!serviceEnabled) {
|
|
return 'Les services de localisation sont désactivés. Veuillez les activer dans les paramètres de votre appareil.';
|
|
}
|
|
|
|
// Vérifier le statut actuel de la permission
|
|
LocationPermission permission = await Geolocator.checkPermission();
|
|
|
|
if (permission == LocationPermission.denied) {
|
|
return 'L\'accès à la localisation a été refusé. Cette application ne peut pas fonctionner sans cette autorisation.';
|
|
}
|
|
|
|
if (permission == LocationPermission.deniedForever) {
|
|
return 'L\'accès à la localisation a été définitivement refusé. Veuillez l\'autoriser dans les paramètres de votre appareil.';
|
|
}
|
|
|
|
return null; // Pas d'erreur
|
|
} catch (e) {
|
|
debugPrint('Erreur lors de la vérification des erreurs de localisation: $e');
|
|
// En cas d'erreur, on retourne null pour ne pas bloquer l'application
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/// Ouvre les paramètres de l'application pour permettre à l'utilisateur de modifier les autorisations
|
|
static Future<void> openAppSettings() async {
|
|
// En version web, cette fonctionnalité n'est pas disponible
|
|
if (kIsWeb) {
|
|
debugPrint('Ouverture des paramètres de l\'application non disponible en version web');
|
|
return;
|
|
}
|
|
|
|
try {
|
|
await Geolocator.openAppSettings();
|
|
} catch (e) {
|
|
debugPrint('Erreur lors de l\'ouverture des paramètres de l\'application: $e');
|
|
}
|
|
}
|
|
|
|
/// Ouvre les paramètres de localisation de l'appareil
|
|
static Future<void> openLocationSettings() async {
|
|
// En version web, cette fonctionnalité n'est pas disponible
|
|
if (kIsWeb) {
|
|
debugPrint('Ouverture des paramètres de localisation non disponible en version web');
|
|
return;
|
|
}
|
|
|
|
try {
|
|
await Geolocator.openLocationSettings();
|
|
} catch (e) {
|
|
debugPrint('Erreur lors de l\'ouverture des paramètres de localisation: $e');
|
|
}
|
|
}
|
|
}
|