- Заметки
- Flutter урок по GPS геолокации (перевод урока с дополнениями)
За последние 30 дней: 68 просмотров, 38 посетителей.
Flutter урок по GPS геолокации (перевод урока с дополнениями)
GPS стала стандартной функцией современного смартфона. Обычно используется приложениями, чтобы обнаружить местонахождение устройства.
Это перевод статьи Flutter - GPS Geolocation Tutorial [EN].
Перевод подготовлен Михайловой Марией.
В статье вставлены дополнения и пояснения которых нет в оригинале.
Это руководство покажет вам как получить доступ к местонахождению устройства во Flutter, используя GPS, включая то как получить разрешения, текущее местоположение и постоянное его обновление.
Зависимости
Пакет geolocator (геолакатор) во Flutter предоставляет геолакационные функции. Добавьте его в ваш файл pubspec.yaml и запустите команду packages get (получить пакеты).
В оригинале используется версия geolocator: ^3.0.1, на момент публикации этого перевода, самая последняя версия ^5.0.0. Но для ее работы на Android требуется совершить переход к AndroidX (смотрите как это сделать тут https://flutter.su/note/146).
Без этого перехода - приложение будет вылетать при запросе к методам geolocator.
Разрешения
Вам нужно добавить разрешения в каждую платформу.
Для Android
Нужны разрешения ACCESS_FINE_LOCATION и ACCESS_COARSE_LOCATION.
Добавьте их в AndroidManifest.xml путь к файлу:
<app dir>/android/app/src/main/AndroidManifest.xml
В документации, https://flutter.dev/docs/deployment/android#review-the-app-manifest, указан именно этот путь. Но уже сейчас в новых flutter проектах есть еще несколько файлов AndroidManifest.xml в директории debug и main. В них указаны разрешения на использование сети:
По видимому, документация скоро обновится и будет указано в каком именно манифесте должны быть указаны разрешения.
Сообщение о предоставлении разрешения на использование геолокации.
Для IOS
Нужно NSLocationWhenInUseUsageDescription разрешение. Добавьте его в файл Info.plist.
Пример кода
Ниже представлена структура кода этого руководства. Нам нужно создать экземпляр Geolocator (геолокатора) и сохранить значение последней Position (позиции). Приложение будет использовать значение Position, чтобы показать широту и долготу.
Проверьте разрешения
Если вы добавили правильные разрешения, приложению будет дано разрешение для доступа к местоположению устройства, используя GPS. В Андроид 6.0 и выше, он попросит пользователя дать разрешения. Но если вам нужно проверить есть ли у приложения разрешение на доступ к местоположению, вы сможете это сделать программно.
Чтобы сделать проверку, используйте метод checkGeolocationPermissionStatus который возвращает значение Future.
Как вариант, для iOS, вы можете отдельно выбрать locationAlways и locationWhenInUse, устанавливая locationPermission опциональный параметр, тип которого GeolocationPermission.
Значения:
- GeolocationStatus.denied - если пользователь отклонил разрешение;
- GeolocationStatus.granted - если пользователь согласился.
Получить текущее местоположение
Получить текущее местонахождение очень легко. Просто используйте метод getCurrentPosition, который возвращает Future<Location>. Вы можете использовать опцию desiredAccuracy.
Иногда процесс получения текущего местонахождения может быть не выполнен. К примеру, если пользователь выключает сенсор GPS. Если он был выключен с самого начала, это может быть причиной ошибки, поэтому мы должны ее отследить. Есть также вероятность того что GPS выключен когда процесс поиска локации уже идет. Это может привести к прерыванию процесса, и следовательно, лучше добавить задержку его исполнения.
Ниже приведены описания значений каждого LocationAccuracy.
Название описания lowest (самое низкое).
Местонахождение точно в пределах дистанции в 3000м на iOS и 500м на Android.
- low (низкая) локация точна в пределах 1000м на iOS и 500м на Android.
- medium (средняя) локация точна в пределах 10м на iOS и между 0м и 100м на Android.
- high (высокая) локация точна в пределах 10м на iOS и между 0м и 100м на Android.
- best (лучшая) локация точна в пределах ~0м на iOS и между 0м и 100м на Android.
Точность локации bestForNavigation оптимизирована для iOS и соответствует LocationAccuracy.best на Android.
Трансляция обновления местонахождения
Чтобы получить обновленное местоположение, вы фактически можете поместить код выше в тело цикла. Но существует способ лучше и точнее.
Вы можете использовать getPositionStream, который возвращает Stream<Subscription>.
Вы также можете настроить требуемое значение изменения местоположения перед тем как слушатель будет уведомлен, используя distanceFilter.
Листинг программы
Ниже представлен полный код данного руководства:
В оригинальный код добавлен метод setState() для обновления положения в реальном времени
Можно скопировать этот код и запустить приложение:
Результат работы программы определение местоположения, GPS координаты, на Flutter.