[플러터] Geolocator를 사용하여 현재 위치 정보를 얻는 방법
개요
Flutter를 운용하고 5개월이 지났습니다.
3개월 전부터 폐사에서는 Flutter가 보급되고, 엔지니어 4명이 모두 Flutter를 걸게 되어 왔습니다. 현재는 자사 앱의 새로운 기능 추가와 아키텍처의 도입을 노력하고 있다는 느낌입니다.
이번에는 자사 앱으로 위치 정보를 취득할 필요가 있었기 때문에, 뭔가 라이브러리 없을까라고 조사해 보면 좋은 일이 있었던 것과, 도입에 조금 시간이 걸렸다고, 단순히 현재 위치 그냥 돌려줄 소스코드가 별로 없었기 때문에 그 공유를 합니다.
이번에 할 일
iOS실기로 현재 위치정보를 緯度(Latitude)
経度(Longitude)
로 취득한다
환경
iPhone/iOS
iPhone XR 12.4
Flutter
Flutter 1.9.1
Dart 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.dartimport '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. 결과
iOS실기로 현재 위치정보를
緯度(Latitude)
経度(Longitude)
로 취득한다환경
iPhone/iOS
iPhone XR 12.4
Flutter
Flutter 1.9.1
Dart 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.dartimport '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. 결과
dependencies:
geolocator: ^5.1.3
...
<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>
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}")
],
),
);
}
);
}
}
먼저 iOS 위치 정보의 Permission 처리가 실행됩니다. 우선 "이 앱을 사용하는 동안에만 허용"을 선택합시다.
권한을 선택하면 위치 정보를 가져오는 데 몇 초가 걸립니다. 여기에 null 값이 들어 있습니다.
몇 초 후, 무사 현재 위치가 취득해, 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
Reference
이 문제에 관하여([플러터] Geolocator를 사용하여 현재 위치 정보를 얻는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Kata_Oka/items/4340c5591e319206958f
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여([플러터] Geolocator를 사용하여 현재 위치 정보를 얻는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Kata_Oka/items/4340c5591e319206958f텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)