Геолокация в Android выдает исключение, когда я ищу город (или что-то еще, а не название страны), отлично работает с названиями стран

Когда я ищу по названию страны, он работает отлично, но когда я ищу город или места, приложение вылетает. Вот код:

  EditText location_tf = (EditText) findViewById (R.id.TFaddress);  Строка location = location_tf.getText (). ToString (); //Toast.makeText(this, location, Toast.LENGTH_SHORT) .show ();  Геокодер gc = новый геокодер (это);  Список  list = gc.getFromLocationName (расположение, 1);  Адрес add = list.get (0);  Строка locality = add.getLocality ();  Toast.makeText (this, locality, Toast.LENGTH_SHORT) .show ();  двойная широта = add.getLatitude ();  двойной lng = add.getLongitude ();  gotoLocation (lat, lng, 4);  

спасибо за помощь, я нашел ваши ответы полезными. Моя проблема решена, я тестировал приложение на китайском ПЗУ MIUI, после установки международного ПЗУ MIUI мой код работает как шарм.

Спасибо.


На основе ответов, предоставленных в этих потоках SO

  • Android Geocoder getFromLocationName всегда возвращает null

  • Геокодер не всегда возвращает значение

  • Геокодер не всегда возвращает значение

Я бы сказал, что Геокодер не всегда возвращает значение. Вам нужно попробовать отправить запрос 3 раза в цикле for. Я должен вернуться хотя бы один раз. Если нет, то это может быть проблема с подключением или другие проблемы, например, сервер не отвечает на ваш запрос.

Вам нужно попробовать что-то вроде ниже

  попробуйте {List 
geoResults = geocoder.getFromLocationName ("", 1); while (geoResults.size () == 0) {geoResults = geocoder.getFromLocationName ("", 1); } if (geoResults.size ()> 0) {Адрес addr = geoResults.get (0); myLocation.setLatitude (addr.getLatitude ()); myLocation.setLongitude (addr.getLongitude ()); }} catch (Exception e) {System.out.print (e.getMessage ());}


Чтобы получить подробную информацию о любом городе или стране, просто используйте определенный здесь api. API в основном — http://maps.googleapis.com/maps/api/geocode/json?address=&sensor=false



/response-native-geolocation

API геолокации расширяет веб-спецификацию геолокации.

В настоящее время в Android используется API android.location. Этот API не рекомендуется Google, поскольку он менее точен и медленнее, чем рекомендованный API служб геолокации Google. Это то, что мы хотим изменить в ближайшем будущем https://github. com/response-native-community/response-native-geolocation/issues/6.

Чтобы использовать новый API служб геолокации Google с React Native, ознакомьтесь с альтернативными библиотеками:

  • response-native-geolocation-service
  • react-native-location

Начало работы

yarn add @ react-native-community/geolocation

или

npm install @ response-native-community/geolocation --save

В основном автоматическая установка (response-native 0.59 и ниже)

response-native ссылка @ response-native-community/geolocation

Ручная установка (react-native 0.59 и ниже)

Вручную связать библиотеку на iOS

Открыть project.xcodeproj в Xcode

Перетащить RNCGeolocation.xcodeproj в свой проект в Xcode (обычно в группе библиотек в Xcode):

Ссылка libRNCGeolocation .a двоичный файл с библиотеками

Щелкните основной файл проекта (тот, который представляет .xcodeproj ), выберите Фазы сборки и перетащите статическую библиотеку из папки Products внутри библиотеки, которую вы импортируете, в Link Binary With Libraries (или используйте + и выберите библиотеку из списка):

Использование CocoaPods

Обновите свой Podfile

  pod 'react-native-geolocation',  путь: '../node_modules/@react-native-community/geolocation'  
Свяжите библиотеку на Android вручную

android/settings.gradle

 include ': react-native-community-geolocation'project (': react-native  -community-geolocation '). projectDir = новый файл (rootProject.projectDir,' ../node_modules/@react-native-community/geolocation/android ') 

а ndroid/app/build.gradle

 dependencies {... проект реализации (': react-native-community-geolocation')} 

android/app/src/main/.../MainApplication.java

Сверху, где импорт:

 import com.reactnativecommunity.geolocation.GeolocationPackage; 

Добавьте класс GeolocationPackage в свой список экспортированных пакетов.

 @Overrideprotected List  getPackages () {return Arrays.asList (new MainReactPackage (), new GeolocationPackage ());} 

Поскольку react-native 0. 60 и выше автоматическое связывание упрощает процесс установки

Конфигурация и разрешения

Проекты только с собственным кодом

Этот раздел применяется только к проектам, созданным с помощью response-native init или к проектам, созданным с помощью expo init или Create React Native App, которые с тех пор были извлечены . Дополнительные сведения об извлечении см. В руководстве по репозиторию Create React Native App.

iOS

Вам необходимо включить NSLocationWhenInUseUsageDescription и NSLocationAlwaysAndWhenInUseUsageDescription в Info.plist , чтобы включить геолокацию при использовании приложения. Если ваше приложение поддерживает iOS 10 и более ранние версии, также требуется ключ NSLocationAlwaysUsageDescription . Если эти ключи отсутствуют в Info.plist , запросы авторизации завершаются немедленно и без уведомления. Геолокация включена по умолчанию, когда вы создаете проект с помощью react-native init .

Чтобы включить геолокацию в фоновом режиме, вам необходимо включить ‘NSLocationAlwaysUsageDescription ‘в Info.plist и добавьте местоположение в качестве фонового режима на вкладке «Возможности» в Xcode.

Android

Чтобы запросить доступ к местоположению, вам необходимо добавьте следующую строку в AndroidManifest.xml вашего приложения:

Android API> = 18 Позиции также будут содержать логическое значение mocked , указывающее, была ли позиция создана из фиктивного провайдера.

Android API> = 23 Требуется дополнительный шаг для проверки и запроса разрешения ACCESS_FINE_LOCATION с помощью PermissionsAndroid API. Невыполнение этого требования может привести к серьезному сбою.

Переход с основного модуля react-native

Этот модуль был создан когда геолокация была отделена от ядра React Native. В качестве полифилла браузера этот API был доступен через глобальный navigator.geolocation — вам не нужно было его импортировать. Чтобы перейти на этот модуль, вам необходимо выполнить приведенные выше инструкции по установке и изменить следующий код:

 navigator.geolocation.setRNConfiguration (config); 

для:

 импорта геолокации из '@ response-native-community/geolocation'; Geolocation.setRNConfiguration (config); 

Если вам нужно согласовать API геолокации с браузером (кроссплатформенные приложения) или вы хотите поддерживать обратную совместимость, рассмотрите возможность добавления следующих строк на корневом уровне, например в верхней части файла App.js (только для react native):

 navigator.geolocation = require ('@ react-native-community/geolocation'); 

Использование

Пример

 импорт геолокации из '@ react-native-community/geolocation'; Геолокация. getCurrentPosition (info => console.log (info)); 

Дополнительные примеры см. в примере проекта.

Методы

Сводка

  • setRNConfiguration
  • requestAuthorization
  • getCurrentPosition
  • watchPosition
  • clearWatch
  • stopObserving

Подробности

setRNConfiguration ()

 geolocation.setRNConfiguration (config); 

Устанавливает конфигурацию параметры, которые будут использоваться во всех запросах местоположения.

Параметры:

Имя Тип Обязательно Описание
config object Да См. ниже.

Поддерживаемые параметры:

  • skipPermissionRequests (логическое значение, только для iOS) — По умолчанию false . Если true , вы должны запросить разрешения перед использованием API геолокации.
  • authorizationLevel (строка, только для iOS) — Либо "whenInUse" , "always" или "auto" . Изменяет, будет ли пользователю запрашиваться разрешение «всегда» или «когда используется» службам определения местоположения. Любое другое значение или auto будет использовать поведение по умолчанию, где уровень разрешений зависит от содержимого вашего Info.plist .

requestAuthorization ()

 geolocation.requestAuthorization (); 

Запросить подходящее разрешение на размещение на основе ключа, настроенного в pList. Если установлен NSLocationAlwaysUsageDescription, он будет запрашивать авторизацию Always, хотя, если установлен NSLocationWhenInUseUsageDescription, он будет запрашивать авторизацию InUse.


getCurrentPosition ()

geolocation.getCurrentPosition(geo_success, [geo_error], [geo_options]); 

Один раз вызывает успешный обратный вызов с последним местоположением info.

Параметры:

Имя Тип Обязательно Описание
geo_success function Yes Вызывается с последней информацией о местоположении.
geo_error function Нет Вызывается при обнаружении ошибки.
geo_options object Нет См. ниже.

Поддерживаемые параметры:

  • timeout (мс) — это положительное значение, представляющее максимальную длину g время (в миллисекундах), которое может использовать устройство для возврата позиции. По умолчанию INFINITY.
  • maximumAge (мс) — положительное значение, указывающее максимальный возраст в миллисекундах возможной кэшированной позиции, которую можно вернуть. Если установлено значение 0, это означает, что устройство не может использовать кэшированную позицию и должно попытаться получить реальную текущую позицию. Если установлено значение Infinity, устройство всегда будет возвращать кешированную позицию независимо от его возраста. По умолчанию — БЕСКОНЕЧНОСТЬ.
  • enableHighAccuracy (bool) — логическое значение, представляющее, использовать GPS или нет. Если установлено значение true, будет запрошена позиция GPS. Если установлено значение false, будет запрошено местоположение WIFI.

watchPosition ()

 geolocation.watchPosition (success, [error], [options]); 

Вызывает обратный вызов успеха всякий раз, когда изменяется местоположение. Возвращает watchId (число).

Параметры:

Имя Тип Требуется Описание
success function Да Вызывается всякий раз расположение меняется.
error function Нет Вызывается при обнаружении ошибки.
options object Нет См. ниже.

Поддерживаемые параметры:

  • timeout (мс) — положительное значение, представляющее максимальную продолжительность времени (в миллисекундах), которое может занять устройство, чтобы вернуть позицию. По умолчанию БЕСКОНЕЧНО.
  • maximumAge (мс) — положительное значение, указывающее максимальный возраст в миллисекундах возможной кэшированной позиции, которую можно вернуть. Если установлено значение 0, это означает, что устройство не может использовать кэшированную позицию и должно попытаться получить реальную текущую позицию. Если установлено значение Infinity, устройство всегда будет возвращать кешированную позицию независимо от его возраста. По умолчанию — БЕСКОНЕЧНОСТЬ.
  • enableHighAccuracy (bool) — логическое значение, представляющее, использовать GPS или нет. Если установлено значение true, будет запрошена позиция GPS. Если установлено значение false, будет запрошено местоположение WIFI.
  • distanceFilter (м) — минимальное расстояние от предыдущего местоположения, которое необходимо преодолеть перед возвратом нового местоположения. Установите значение 0, чтобы не фильтровать местоположения. По умолчанию 100 м.
  • useSignificantChanges (bool) — для возврата местоположений используются собственные API-интерфейсы значительных изменений с низким энергопотреблением. Локации будут возвращены только тогда, когда устройство обнаружит, что было нарушено значительное расстояние. По умолчанию FALSE.

clearWatch ()

 геолокация.  clearWatch (watchID); 

Параметры:

Имя Тип Обязательно Описание
watchID number Yes Идентификатор, возвращенный watchPosition () .

stopObserving()

 geolocation.stopObserving (); 

Прекращает наблюдение за изменениями местоположения устройства. Кроме того, он удаляет все ранее зарегистрированные прослушиватели.

Обратите внимание, что этот метод действует только в том случае, если ранее был вызван метод geolocation.watchPosition (successCallback, errorCallback) .

Contributors

Этот модуль был извлечен из ядра react-native . Чтобы получить полный список участников, обратитесь к https://github.com/react-native-community/react-native-geolocation/graphs/contributors.

License

Библиотека выпущена под лицензией MIT. Для получения дополнительной информации см. ЛИЦЕНЗИЯ .

Оцените статью
clickpad.ru
Добавить комментарий