[flutter] 플러터 geolocator를 이용한 위치 서비스 제어

안녕하세요. 오늘은 플러터에서 위치 서비스를 제어하는 방법에 대해 알아보겠습니다. 위치 서비스는 앱에서 사용자의 위치 정보를 얻는 데 사용되는 중요한 기능 중 하나입니다.

Geolocator 패키지 설치

먼저, Geolocator 패키지를 사용하기 위해 pubspec.yaml 파일에 패키지를 추가해야 합니다.

dependencies:
  flutter:
    sdk: flutter
  geolocator: ^7.1.0

패키지를 추가한 후, 터미널에서 flutter pub get 명령을 실행하여 패키지를 다운로드 및 업데이트해야 합니다.

위치 권한 확인하기

사용자의 위치 정보에 접근하기 전에 위치 권한을 확인해야 합니다. Geolocator 패키지에서는 위치 권한을 확인하고 요청하는 기능을 제공합니다. 아래는 위치 권한을 확인하는 코드 예시입니다.

import 'package:geolocator/geolocator.dart';

Future<bool> checkLocationPermission() async {
  LocationPermission permission = await Geolocator.checkPermission();
  
  if (permission == LocationPermission.denied) {
    permission = await Geolocator.requestPermission();
  
    if (permission == LocationPermission.denied) {
      return false;
    }
  }
  
  return true;
}

위 코드에서 checkLocationPermission() 함수는 위치 권한을 확인하고, 만약 권한이 거부된 경우 권한을 요청합니다. 권한이 허용되었으면 true를 반환하고, 거부되었으면 false를 반환합니다.

현재 위치 정보 가져오기

위치 권한을 확인한 후, 사용자의 현재 위치 정보를 가져오는 방법을 알아보겠습니다. Geolocator 패키지에서는 getCurrentPosition() 메서드를 사용하여 현재 위치 정보를 얻을 수 있습니다. 아래는 현재 위치 정보를 가져오는 코드 예시입니다.

import 'package:geolocator/geolocator.dart';

Future<Position> getCurrentLocation() async {
  bool locationPermissionGranted = await checkLocationPermission();
  
  if (locationPermissionGranted) {
    Position position = await Geolocator.getCurrentPosition(
      desiredAccuracy: LocationAccuracy.high,
    );
    
    return position;
  } else {
    throw Exception('위치 권한이 없습니다.');
  }
}

위 코드에서 getCurrentLocation() 함수는 checkLocationPermission() 함수를 사용하여 위치 권한을 확인하고, 권한이 허용된 경우 getCurrentPosition() 메서드를 사용하여 현재 위치 정보를 가져옵니다. 위치 정보의 정확도는 desiredAccuracy 매개변수를 통해 설정할 수 있으며, LocationAccuracy.high 값을 사용하면 높은 정확도의 위치 정보를 가져올 수 있습니다.

사용자 위치 추적

Geolocator 패키지는 사용자의 위치를 실시간으로 추적하는 기능을 제공합니다. getPositionStream() 메서드를 사용하여 주기적으로 위치 업데이트를 받을 수 있습니다. 아래는 사용자 위치를 추적하는 코드 예시입니다.

import 'package:geolocator/geolocator.dart';

Stream<Position> trackUserLocation() async* {
  bool locationPermissionGranted = await checkLocationPermission();
  
  if (locationPermissionGranted) {
    Position position = await Geolocator.getCurrentPosition(
      desiredAccuracy: LocationAccuracy.high,
    );
    
    yield position;
    
    await for (Position update in Geolocator.getPositionStream(
      desiredAccuracy: LocationAccuracy.high,
      distanceFilter: 10, // 10 미터마다 업데이트
    )) {
      yield update;
    }
  } else {
    throw Exception('위치 권한이 없습니다.');
  }
}

위 코드에서 trackUserLocation() 함수는 checkLocationPermission() 함수를 사용하여 위치 권한을 확인하고, 권한이 허용된 경우 getCurrentPosition() 메서드를 사용하여 사용자의 현재 위치를 가져옵니다. 그리고 yield를 사용하여 초기 위치 업데이트를 반환한 후, getPositionStream() 메서드를 사용하여 주기적인 위치 업데이트를 받을 수 있습니다. distanceFilter 매개변수는 위치가 변경된 거리를 기준으로 업데이트를 받을 미터 단위 값을 설정합니다.

위치 서비스를 제어하는 방법에 대해 알아보았습니다. 플러터 Geolocator 패키지를 사용하여 위치 권한 확인과 현재 위치 정보 가져오기, 사용자 위치 추적을 할 수 있습니다. 다양한 앱에서 위치 정보가 필요한 경우에 이러한 기능을 활용하여 적절한 위치 서비스를 제공할 수 있습니다.

더 자세한 내용은 플러터 Geolocator 패키지 문서를 참고하시기 바랍니다.