[flutter] 플러터 geolocator를 이용한 위치 기반 비상 연락처 애플리케이션 개발 방법

이번에는 플러터(Flutter)와 Geolocator를 이용하여 위치 기반 비상 연락처 애플리케이션을 개발하는 방법에 대해 알아보겠습니다. Geolocator는 플러터에서 위치 정보를 쉽게 가져올 수 있는 패키지로, GPS, Wi-Fi 또는 기지국 정보를 사용하여 사용자의 위치를 파악할 수 있습니다.

개요

우리는 이 애플리케이션을 통해 사용자의 위치 정보를 수집하고, 이를 기반으로 가까운 비상 연락처를 표시할 것입니다. 또한 사용자가 긴급한 상황에 대비하여 비상 연락처를 선택할 수 있도록 할 것입니다. 이를 위해 다음과 같은 단계로 진행해보겠습니다.

  1. 필요한 패키지 가져오기
  2. 위치 권한 요청하기
  3. 현재 위치 가져오기
  4. 주변 비상 연락처 표시하기
  5. 비상 연락처 선택 기능 추가하기

1. 필요한 패키지 가져오기

먼저, pubspec.yaml 파일에 Geolocator 패키지를 추가해야 합니다. 다음과 같이 dependencies 섹션에 아래 코드를 추가해주세요:

dependencies:
  geolocator: ^7.6.2

그리고 패키지를 가져오기 위해 터미널에서 다음 명령어를 실행해주세요:

flutter pub get

2. 위치 권한 요청하기

플러터에서 위치 정보를 사용하기 위해서는 사용자로부터 위치 권한을 요청해야 합니다. 이를 위해서는 AndroidManifest.xml 파일과 Info.plist 파일에 권한을 추가해야 합니다.

Android

AndroidManifest.xml 파일을 열고 다음 코드를 태그 안에 추가해주세요:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

iOS

Info.plist 파일을 열고 다음 코드를 태그 안에 추가해주세요:

<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Your description here</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>Your description here</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Your description here</string>
<key>NSLocationUsageDescription</key>
<string>Your description here</string>

위 코드에서 Your description here 부분에는 해당 권한을 사용하기 위한 설명을 입력해야 합니다.

3. 현재 위치 가져오기

이제 위치 권한을 요청했으니, Geolocator를 사용하여 현재 위치를 가져오는 기능을 구현해보겠습니다.

import 'package:geolocator/geolocator.dart';

void getCurrentLocation() async {
  bool serviceEnabled;
  LocationPermission permission;

  // 위치 서비스 사용 가능 여부 확인
  serviceEnabled = await Geolocator.isLocationServiceEnabled();
  if (!serviceEnabled) {
    return;
  }

  // 위치 권한 요청
  permission = await Geolocator.checkPermission();
  if (permission == LocationPermission.deniedForever) {
    return;
  }

  if (permission == LocationPermission.denied) {
    permission = await Geolocator.requestPermission();
    if (permission != LocationPermission.whileInUse &&
        permission != LocationPermission.always) {
      return;
    }
  }

  // 현재 위치 가져오기
  Position currentPosition = await Geolocator.getCurrentPosition(
      desiredAccuracy: LocationAccuracy.medium);

  // 위치 정보 출력
  print('Current Position: ${currentPosition.latitude}, ${currentPosition.longitude}');
}

위 코드를 실행하면 현재 위치의 위도(latitude)와 경도(longitude)가 출력됩니다.

4. 주변 비상 연락처 표시하기

이제 사용자의 위치를 얻을 수 있으므로, 이를 기반으로 주변의 비상 연락처를 표시하는 기능을 구현해보겠습니다.

import 'package:geolocator/geolocator.dart';

void getEmergencyContacts() async {
  // 현재 위치 가져오기
  Position currentPosition = await Geolocator.getCurrentPosition(
      desiredAccuracy: LocationAccuracy.medium);

  // 주변 비상 연락처 찾기
  List<Placemark> placemarks = await placemarkFromCoordinates(
      currentPosition.latitude, currentPosition.longitude);

  // 주소 정보 출력
  for (Placemark placemark in placemarks) {
    print('Address: ${placemark.thoroughfare} ${placemark.subThoroughfare}, ${placemark.locality}');
  }
}

위 코드를 실행하면 현재 위치를 기반으로 주변의 비상 연락처의 주소 정보가 출력됩니다.

5. 비상 연락처 선택 기능 추가하기

마지막으로, 사용자가 비상 시 선택할 수 있는 비상 연락처 선택 기능을 추가해보겠습니다. 이는 애플리케이션 화면과 사용자 인터페이스(UI)에 따라 다르게 구현될 수 있습니다. 아래 코드는 간단한 예시로, 버튼을 클릭하면 사용자가 선택한 비상 연락처를 출력합니다.

import 'package:flutter/material.dart';

class EmergencyContactsPage extends StatelessWidget {
  final List<String> emergencyContacts = ['엄마', '아빠', '형'];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Emergency Contacts'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: () {
                showEmergencyContactDialog(context);
              },
              child: Text('Select Emergency Contact'),
            ),
          ],
        ),
      ),
    );
  }

  void showEmergencyContactDialog(BuildContext context) {
    showDialog(
      context: context,
      builder: (BuildContext context) {
        return AlertDialog(
          title: Text('Select Emergency Contact'),
          content: SingleChildScrollView(
            child: ListBody(
              children: emergencyContacts.map((e) => Text(e)).toList(),
            ),
          ),
        );
      },
    );
  }
}

위 코드를 실행하면 “Select Emergency Contact” 버튼을 클릭하면 다이얼로그가 나타나고, 사용자가 비상 연락처를 선택할 수 있습니다.

이제 여러분은 플러터 Geolocator를 이용하여 위치 기반 비상 연락처 애플리케이션을 개발하는 방법에 대해 알게 되었습니다. 이를 응용하여 더 다양한 기능을 추가해보세요!

참고 자료