[플러터] Geolocator를 사용하여 현재 위치 정보를 얻는 방법

10583 단어 메모DartFlutter

개요



Flutter를 운용하고 5개월이 지났습니다.
3개월 전부터 폐사에서는 Flutter가 보급되고, 엔지니어 4명이 모두 Flutter를 걸게 되어 왔습니다. 현재는 자사 앱의 새로운 기능 추가와 아키텍처의 도입을 노력하고 있다는 느낌입니다.

이번에는 자사 앱으로 위치 정보를 취득할 필요가 있었기 때문에, 뭔가 라이브러리 없을까라고 조사해 보면 좋은 일이 있었던 것과, 도입에 조금 시간이 걸렸다고, 단순히 현재 위치 그냥 돌려줄 소스코드가 별로 없었기 때문에 그 공유를 합니다.

이번에 할 일



iOS실기로 현재 위치정보를 緯度(Latitude) 経度(Longitude) 로 취득한다

환경



iPhone/iOS



iPhone XR 12.4

Flutter



Flutter 1.9.1Dart 2.3.0

도서관



geolocator 5.1.3

소개



1. pubspec.yaml 에 기재되어 pub get



약속입니다.

pudspec.yaml
 dependencies:
    geolocator: ^5.1.3

2. ios/Runner/info.plist에 permission을 기재한다



iOS doesn't ask for Location permissions 에 기재되어 있는 에러가 발생하고 있으므로, 아무래도 info.plist 에 기재할 필요가 있는 것 같기 때문에 이하와 같이 편집합니다.

info.plist
...
<dict>
    <key>NSLocationAlwaysUsageDescription</key>
    <string>Your location is required for this app</string>
    <key>NSLocationWhenInUseUsageDescription</key>
    <string>Your location is required for this app</string>
    <key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
    <string>Your location is required for this app</string>
...
</dict>

3. 실장해 본다



location.dart
import 'package:flutter/material.dart';
import 'package:geolocator/geolocator.dart';

class LocationSample extends StatefulWidget{
  @override
  _LocationSampleState createState() => _LocationSampleState();
}

class _LocationSampleState extends State<LocationSample> {
  // Location
  Position position; // Geolocator

  @override
  void initState() {
    super.initState();
    _getLocation(context);
  }

  Future<void> _getLocation(context) async {
    Position _currentPosition = await Geolocator()
        .getCurrentPosition(desiredAccuracy: LocationAccuracy.high); // ここで精度を「high」に指定している
    print(_currentPosition);
    setState(() {
      position = _currentPosition;
    });
  }

  @override
  Widget build(BuildContext context) {
    return FutureBuilder<GeolocationStatus>(
      future: Geolocator().checkGeolocationPermissionStatus(),
      builder: 
          (BuildContext context, AsyncSnapshot<GeolocationStatus> snapshot) {
        if (!snapshot.hasData) {
          return const Center(child: CircularProgressIndicator());
        }

        if (snapshot.data == GeolocationStatus.denied) {
          return Text(
            'Access to location denied',
            textAlign: TextAlign.center,
          );
        }

        return Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            crossAxisAlignment: CrossAxisAlignment.center,
            children: <Widget>[
              Text(
                "Location Infomation",
                style: TextStyle(
                  fontSize: 20.0
                ),
              ),
              Text("Your Current Location is :"),
              Text("${position}")
            ],
          ),
        );
      }
    );
  }
}

4. 결과


  • Permission

  • 먼저 iOS 위치 정보의 Permission 처리가 실행됩니다. 우선 "이 앱을 사용하는 동안에만 허용"을 선택합시다.


  • Loading

  • 권한을 선택하면 위치 정보를 가져오는 데 몇 초가 걸립니다. 여기에 null 값이 들어 있습니다.


  • Current Location

  • 몇 초 후, 무사 현재 위치가 취득해, null값이 Lat(Latitude)와 Long(Longitude)로 바뀌었습니다. (표시된 것은 사무실 주변의 정보)
    그 후, 몇 초 후마다 현재 위치를 취득해, 돌려주게 되었습니다.
    라이브러리를 보면 취득할 수 있는 위도 경도는 double 형이므로, 적절히 String 에 가공해 사용할 수 있을 것 같습니다.



    소스 코드는 다음과 같습니다. 자신의 공부도 겸해, 앞으로 구현하는 코드 반영시키는 어플리케이션을 만들었습니다.
    앞으로는 이쪽으로 갱신될 예정입니다.

    보충



    위치 정보를 취득할 수 있는 라이브러리는 이 외에 location 라고 하는 것도 있습니다.
    여기서 도입의 방법을 보면 info.plist 에 Permission 를 기재하는 기술이 있으므로, geolocator 와 같이 위치 정보를 취득하기 위해서는 필수의 기술과 같습니다.
    네이티브 엔지니어 쪽이라면 상식일지도 모릅니다만, 자신은 처음 알았습니다.

    아직 이 라이브러리를 잘 다루고 있는 것은 아니기 때문에, 위치 정보에 관해서는 좀더 파고 가고 싶습니다.
    그리고, 위치 정보의 정밀도에 관해서도 선택을 할 수 있으므로, 시험해 보는 것도 재미있을까 생각합니다.

    정밀도





    안드로이드
    iOS


    lowest
    500m
    3000m

    low
    500m
    1000m

    medium
    100~500m
    100m

    high
    0~100m
    10m

    best
    0~100m
    ~0m

    bestForNavigation
    0~100m
    Optimized for navigation

    좋은 웹페이지 즐겨찾기