React-native: Геолокация enableHighAccuracy на Android всегда истекает

Созданный на 10 мая 2016  ·  239Комментарии  ·  Источник: facebook/react-native

При разработке Android-приложения во время отладки на моем Android-устройстве, работающем на 6.1, api геолокации всегда возвращает обратный вызов ошибки с сообщением Location request timed out .

navigator.geolocation.getCurrentPosition(
      (position) => {
        console.log(position);
       },
       (error) => {
        console.log(error)
      },
      {enableHighAccuracy: true, timeout: 20000, maximumAge: 10000}
);

Если я переключу параметр enableHighAccuracy на false, api будет работать нормально. В режиме высокой точности таймаут всегда длится столько, сколько я указываю в опции тайм-аута, то есть 20 секунд.

Я пробовал работать с выключенным режимом разработки.

Должен ли работать режим высокой точности в Android?

Geolocation Bug Help Wanted Android Ran Commands Locked

Самый полезный комментарий

установка enableHighAccuracy на true или false для меня не работает.
опускание третьего аргумента для getCurrentPosition для использования значений по умолчанию из собственного модуля работает для меня.

Все 239 Комментарий

@ acapop77 Забыл также упомянуть, что разрешения включаются с помощью:

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

У меня такая же проблема с RN 0.25.1, разница в том, что для меня проблема сохраняется для высокой и низкой точности. Наконец я нашел кое-что, что заставляет его работать, но не является решением.

Вот что сработало для меня - при условии, что вы используете стандартный android avd - эмулятор:

  1. В устройстве эмулятора Android перейдите в «Настройки> Местоположение» (как на реальном устройстве) и установите для режима «Высокая точность».
  2. Вернитесь в приложение.
  3. Нажмите кнопку «Расширенные элементы управления» (обозначена «...»). Затем в разделе «Местоположение» вы увидите данные точки данных GPS и кнопку «Отправить» ниже. Просто нажмите «Отправить» и закройте расширенное меню управления.
  4. Перезагрузите приложение.

У меня это работает - «только один раз». Каждый раз, когда я хочу перезагрузить приложение, мне нужно снова делать 3-4 шага. Но, по крайней мере, так я получаю работу с геолокацией и не получаю ошибку тайм-аута.

Что-то похожее испытываю в 0.24. Несмотря на то, что <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> находится в моем AndroidManifest.xml, я получаю красную ошибку:

«Похоже, у приложения нет разрешения на доступ к местоположению. Добавьте следующую строку ...»

Я не использую эмулятор, а создаю его непосредственно на устройстве.

Изменить - это также происходит в 0.25.1

@ acapop77 @rossthedevigner Я также

@Findiglay То же самое. Я даже попытался выполнить ручную установку .apk, но все равно получил ошибку.

Я пробую обходной путь, в котором я просматриваю манифест разрешений и смотрю, включен ли android.permission.ACCESS_FINE_LOCATION .

У кого-нибудь есть navigator.geolocation == undefined?

У меня сейчас эта проблема на моем устройстве.

Здесь сообщается о различных проблемах. Я не уверен, что все они имеют отношение к конкретной проблеме с enableHighAccuracy.

У меня нет опыта разработки для Android, но я обнаружил, что если я отредактирую LocationModule.java, чтобы жестко запрограммировать LocationOptions boolean highAccuracy = true; и перестроить, мое местоположение вернется правильно. Я не уверен, отличаются ли результаты от результатов, полученных с помощью параметра enableHighAccuracy: false в API геолокации React-Native, но можно с уверенностью предположить, что это работает в режиме высокой точности.

Может ли это означать, что ошибка возникает в мосте между API геолокации и LocationModule?

У меня такая же проблема. Я сделал то же самое, что и @Findiglay, и работал несколько раз, но потом у меня были только таймауты.

Есть идеи, почему это происходит на реальных устройствах? :(

Имея ту же проблему. В настоящее время я запускаю приложение на реальных устройствах, используя RN 0.25.1.

Я должен добавить, что я уже добавил необходимые разрешения Android в манифест разрешений. Но все равно таймауты.

В качестве обходного пути я включил «Разрешить фиктивные местоположения» в настройках Android и установил приложение, которое имитирует GPS (ищите поддельные GPS в магазине). По крайней мере, пока это не будет исправлено, развитие не заблокировано

Я ребята,
Я столкнулся с той же ошибкой, но после нескольких попыток с моими коллегами мы замечаем что-то странное (но нормальное, если вы думаете о GPS).

Если вы выполняете тесты «внутри вашего офиса» с помощью физического устройства, GPS-локатор может быть нарушен из-за внешних вещей, таких как стены, или по той простой причине, что вы пытаетесь выполнить эту операцию «в помещении», и, как правило, это следует выполнять на открытом воздухе. .

Что ж, после этого мы выходим из нашего офиса, мы повторно выполняем тесты, и устройство отвечает как запланировано (мы не получили ошибку Request timed out).

Мое предложение: попробуйте геолокацию, используя для параметра "enableHighAccuracy" значение true, если это не удается (в офисе это может не удастся), повторите попытку с false, это должно сработать, в моем случае это так.

Надеюсь, это поможет.

+1

Та же проблема, независимо enableHighAccuracy того, установлено ли для true или false .
Он работает на эмуляторах GenyMotion, но не на каких-либо реальных устройствах (протестирован на Samsung, Nexus, Mi).
Включено разрешение в AndroidManifest.xml
Код:

                navigator.geolocation.getCurrentPosition(
                    (position) => {
                        console.log(position);
                    },
                    (error) => console.log(new Date(), error),
                    {enableHighAccuracy: true, timeout: 10000, maximumAge: 3000}
                );  

установка enableHighAccuracy на true или false для меня не работает.
опускание третьего аргумента для getCurrentPosition для использования значений по умолчанию из собственного модуля работает для меня.

Та же проблема здесь с LGE Nexus 5 (Android 6.0).
На Android 5.1.1 и 4.3 такой проблемы нет.
В эмуляторе с Android 6.0 такой проблемы нет.
boolean highAccuracy = false; не работает.
РН 0.28.0.

Привет, ребята, я нашел временное исправление - этот пакет https://github.com/lucasferreira/react-native-android-permissions

Какие-нибудь обновления или исправления для этого? Все работает нормально на Simulator и устройствах до 5.0, после этого только тайм-аут, и мне отчаянно нужно исправить уже доступное приложение!

+1

На эту проблему влияет параметр locationMode на устройстве. Когда режим определения местоположения установлен на высокую точность или только на устройство, время ожидания геолокации истекает. Работает правильно, когда режим определения местоположения установлен на экономию заряда батареи

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

navigator.geolocation.getCurrentPosition( (position) => { console.log(position); }, (error) => console.log(new Date(), error), {enableHighAccuracy: true, timeout: 10000, maximumAge: 3000} //removed this );

Я предполагаю, что это связано с: https://productpains.com/post/react-native/add-android-m-permissions-model-support

правильно?

Нет, это было связано с тайм-аутом местоположения

Да, я только что обнаружил, что удаление третьего аргумента кажется исправлением.

Мы еще не полностью протестировали устройство, но похоже, что версия Android 22 с режимом устройства, установленным либо на высокую точность, либо только на устройство, вызовет тайм-аут местоположения, когда третий аргумент включен независимо от настроек. Вроде не влияет на андроид версии 23.

То же самое и с моей стороны, за исключением того, что версия Android 23 работает только с 3-м аргументом, когда для enableHighAccuracy установлено значение false ( true вызывает тайм-аут местоположения). Также протестирован на версиях Android 22, 21, 20 и 19, и кажется, что наличие третьего аргумента вызывает тайм-аут во всех случаях. Удаление этого аргумента кажется единственным надежным решением.

Удаление 3-го аргумента просто заставит меня мгновенно увидеть всплывающее окно «Время ожидания запроса местоположения» вместо того, чтобы ждать, пока истечет время ожидания. Установка enableHighAccuracy в false тоже не работает.

В моем эмуляторе местоположение доступно только тогда, когда я открываю настройки эмулятора и отправляю местоположение (проверьте снимок экрана).

Есть ли способ получить его автоматически?

screen shot 2016-08-21 at 6 42 52 pm

В моем случае установка enableHighAccuracy на false решила проблему.

Имея здесь ту же проблему, как на эмуляторе, так и на устройстве, и пробовал использовать как true, так и false для enableHighAccuracy

Я сразу получаю: «undefined не является объектом (оценка 'navigator.geolocation.getCurrentPosition')»

Я попытался проверить, вернул ли (навигатор) истину,
но если (navigator.geolocation) вернул false.

Кроме того, это делается на устройстве с Android 5.1 OnePlus One. Включен режим разработчика, включены разрешения AndroidManifest, включение / выключение фиктивных местоположений, все.

Кроме того, он, похоже, не запрашивал у меня разрешения на местоположение, несмотря на то, что я удалял приложение на устройстве и папку вывода на моем Mac.

На самом деле я не могу отлаживать удаленно, так как я использую React Realm, и у этой штуки ОГРОМНЫЕ проблемы, которые выворачивают хромированный удаленный отладчик наизнанку.

У меня аналогичная проблема, может приложение не всегда истекает, НО оно делает это много, когда другие приложения геолокации работают нормально каждый раз, когда у приложения с RN очень плохая геолокация.
Я использую RN 0.32, но у меня была такая же проблема с каждой версией, по какой-то причине геолокация в RN очень странная и плохая (по крайней мере, на Android)

Та же проблема, тестирование на реальном устройстве.

Наткнулся на это, и это действительно раздражает: /

У меня такая же проблема на Android 6.0.

+1

Я нашел решение - не добавлять третий параметр и использовать библиотеку, указанную выше (https://github.com/lucasferreira/react-native-android-permissions) в версии Android> = 23, чтобы запросить разрешения Android M.

Только что заметил Разрешения: теперь в RN добавлен Android. Поэтому используйте это, чтобы запросить, если на android> = 23

https://facebook.github.io/react-native/docs/permissionsandroid.html

Но у меня на устройстве Android 5.1.1. На этой версии андроида геолокация должна работать нормально, не так ли?

23 - это 6.0 и выше. Я также обнаружил, что мне не нужно добавлять третий параметр, чтобы он работал со всем.

Мне удалось заставить это работать, но для вас все могло быть иначе. Более новые версии RN (у меня 0.32.1) включают файл с именем MainApplication.java (помимо MainActivity.java). В документации GL React Native Mapbox говорится, что вы должны включить ReactNativeMapboxGLPackage в MainActivity.java, но вы должны сделать это в MainApplication.java, чтобы он выглядел примерно так:

MainApplication.java

`. . .

<strong i="8">@Override</strong>
protected List<ReactPackage> getPackages() {
  return Arrays.<ReactPackage>asList(
      new MainReactPackage(),
      new ReactNativeMapboxGLPackage()
  );
}

};
`

И MainActivity.java останется таким же, как всегда.

Моя версия Android - 23, поэтому я все еще использую разрешения из XML-манифеста

Когда на устройстве активирован GPS, приложение возвращает местоположение в порядке, но если я его выключу, возвращается местоположение: error: No available location provider.

Как я могу заставить устройство определять активное местоположение по GPS?

Это сводит с ума = /

У меня был getCurrentPosition работающий над моим эмулятором Genymotion Android в течение последних нескольких недель, но теперь он снова терпит неудачу.

Я использую виджет GPS Genymotion, чтобы установить местоположение. Я установил Google Maps на эмулятор, и Google Maps может легко определить мое местоположение.

У меня есть все необходимые разрешения, и я даже использую модуль PermissionsAndroid как предложил @sattaman . Похоже, что поведение недетерминировано, потому что сегодня оно работает, а завтра нарушается.

Я использую RN 0.31, и удаление третьего параметра у меня тоже сработало! Настоящее устройство, Nexus 5X, Android 6.

У меня такая же проблема с RN 0.34.1, но удаление третьего параметра может исправить
Установка для enableHighAccuracy значения false не решает эту проблему.

Та же проблема со мной на RN 0.32, пробовал с Android 22 и 23,

enableHighAccuracy в true или false, у меня не работает
удаление третьего параметра вызывает немедленное "тайм-аут запроса местоположения"
однако перезапуск моего устройства работает, но через некоторое время будет сломан,

теперь, чтобы получить местоположение пользователей, я просто использую это:
https://github.com/mauron85/react-native-background-geolocation

@acondense, где вы устанавливаете код для фоновой геолокации, потому что, похоже, он не запускает функцию определения местоположения

Я столкнулся с той же проблемой на RN 0.35 с Android 23 и 24, но отлично работает с Android 22.
Это может быть связано с системой разрешений времени выполнения Android 6.0:
http://stackoverflow.com/questions/32224534/access-fine-location-permission-error-emulator-only

Я использую эту библиотеку, чтобы избежать этой проблемы, и она отлично работает!
https://github.com/yonahforst/react-native-permissions

Удаление третьего параметра исправило это и для меня 💯 💯 💯

Удаление третьего параметра сработало 👍

С самого начала не было так ясно, о каком параметре все говорят, о параметре метода или третьем параметре объекта параметров.

Если быть точным, это третий параметр метода getCurrentPosition , который в конце выглядит примерно так:

navigator.geolocation.getCurrentPosition(
    (position) => {
       ...
    },
    (error) => alert(error.message)
)

Наконец, я пришел со следующим решением (идея, описанная выше):

export const detectCurrentLocation = (successCallback, errorCallback) => {
    let navigatorOptions = {}
    if (Platform.OS === 'android' && Platform.Version === 23) {
        navigatorOptions = {
            enableHighAccuracy: false,
            timeout: 10000,
            maximumAge: 0
        }
    }

    navigator.geolocation.getCurrentPosition(
        position => successCallback(detectedLocation),
        error => errorCallback(error),
        navigatorOptions
    )
}

Он работает на устройствах (проверено на Android 21, 22 и 23), но для Android 23 критически медленный: 5-10 секунд.

Кто-нибудь использовал LocationServices.FusedLocationApi в качестве обходного пути для этой цели в react-native (встроенная реализация в Java-коде для Android)?

enableHighAccuracy: true вообще не работают на android

Я использую этот код для проверки разрешения местоположения на Android 6

requestLocationPermission = async () => {
    try {
      const granted = await PermissionsAndroid.requestPermission(
        PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,
        {
          'title': 'Enable location',
          'message': 'Location is good \o/',
        },
      );

      if (granted) {
        console.log('You can use the location');
        this.getLocation();
      } else {
        console.log('Location permission denied');
      }
    } catch (err) {
      console.warn(err);
    }
  };

@sibelius Это предотвращает Location request timed out ?

используйте мой фрагмент и этот https://github.com/facebook/react-native/issues/7495#issuecomment -259753488

По-прежнему нет исправления для этого? Я перепробовал абсолютно все в этой теме, и у меня ничего не работает, это всегда ошибка тайм-аута, мгновенно или через несколько секунд.

То же самое здесь, комментарий @sattaman исправил это для моего устройства (установка режима определения местоположения на экономию заряда батареи), однако, как сообщить пользователям приложения, чтобы они сделали это!

Либо отключение enableHighAccuracy либо пропуск третьего параметра работает для меня. Однако местоположение по-прежнему выглядит довольно точным.
На iOS нет проблем. (РН 0,39)

RN 0,40 такой же выпуск. Удаление 3-го параметра решает эту проблему.
(Но высокой точности не добьешься)

та же проблема, удалив 3-й параметр, решите ее.

На эмуляторе я должен установить enableHighAccuracy: true и убедиться, что режим определения местоположения установлен на высокую точность. В противном случае время истекает. Я не могу добиться экономии заряда батареи на эмуляторе ни при каких обстоятельствах.

На девайсе я вообще не передаю никаких опций. Если вы так же боретесь с этим, как я - предлагаю попробовать на реальных устройствах. Я тестировал Pixel C (Android 7.1) и Note 4 (Android 6.0.1)

На iOS мне пришлось установить для High Accuracy значение True. Вы можете представить мою функцию получения местоположения на этом этапе ...

Я работаю над RN 0.40 и использую настоящее устройство (Nexus 5), но проблема все еще не решена.

Я пробовал что-нибудь из всех комментариев в этом выпуске.

Кто-нибудь решил проблему другим, не упомянутым здесь способом?

// ОБНОВИТЬ:

Вроде navigator.geolocation.watchPosition работает. Таким образом, использование этого может быть обходным путем, пока не будет исправлен navigator.geolocation.getCurrentPosition.

А пока я напишу собственный модуль и поговорим напрямую с собственным API, потому что для меня важно использовать высокую точность.
API геолокации RN пока кажется нестабильным.

В своем проекте я придумываю некоторые правила.

  1. Настройка устройства Android - Местоположение определяется только устройством, вы НЕ должны устанавливать enableHighAccuracy: true для getCurrentPosition
  2. Настройка - Местоположение - Высокая точность, вы должны установить enableHighAccuracy: true для getCurrentPosition

В соответствии с этими двумя правилами в моем проекте все работает нормально.

@kimochg какая у вас установка для тестирования?

В моем тестировании установка параметра устройства только для местоположения на устройстве приводила к тайм-ауту каждый раз, независимо от геолокации enableHighAccuracy .

Установка настройки устройства на Высокая точность даст мне допустимое местоположение независимо от того, что установлено в enableHighAccuracy .

РЕДАКТИРОВАТЬ
Кажется, что для меня геолокация будет извлекать новое местоположение только в том случае, если я установлю enableHighAccuracy: false и настройку местоположения устройства как Высокая точность. С enableHighAccuracy: true он будет извлекать кешированное местоположение, но время ожидания новой выборки истекает.

Это на React Native 0.40, тестирование на Nexus 5X под управлением Android 7.1.1.

@kulmajaba некоторые, как вы React Native 0.40, тестирование на Nexus 5X под управлением Android 7.1.1
но эмулятор Android здесь, а не настоящее устройство Android

если вы используете эмулятор,
Вы нажимаете кнопку «Расширенные элементы управления» на правой панели эмулятора и отправляете данные GPS?
(кнопка)

@kimochg Ок. Я использую реальное устройство для тестирования, мне нужно будет сравнить поведение эмулятора с ним в следующий раз, когда я буду работать над проектом.

@Ascendance @ Daniel-ltw Я следил за всеми решениями в этом потоке и не мог избавиться от ужасных проблем с navigator.geolocation undefined. Затем я зарегистрировал navigator .

Вот что я получил в ответ:

ProxyComponent
_attachGesture
_cleanScenesPastIndex
_clearTransformations
_completeTransition
_deltaForGestureAction
_detachGesture
_disableScene
_disableTVEventHandler
_doesGestureOverswipe
_eligibleGestures
...

Потом я понял, что это исходит от компонента "Навигатор". При рендеринге маршрутов он использует (route, navigator) . Разумеется, удаление переменной навигатора и повторное ведение журнала дали:

WorkerNavigator
appCodeName
appName
appVersion
geolocation (...)
get geolocation
getValue()
set geolocation
setValue(newValue)
hardwareConcurrency

Надеюсь, это поможет кому-то другому - мне потребовалось много времени, чтобы понять, в чем проблема. : /

@kulmajaba параметр maximumAge исправил для меня все проблемы с кешированием. Установка его в 0 заставит его всегда получать новую позицию.

Для всех, кто борется с проблемой тайм-аута, я читал, что иногда высокоточные GPS-вызовы могут занять некоторое время (более минуты), особенно в помещении, как @RoBYCoNTe указал выше.

Полагаться на вызов с высокой точностью с самого начала может быть не лучшим вариантом, возможно, сначала будет лучше получить вызов с низкой точностью и запустить вызов высокой точности в фоновом режиме. Это, конечно, зависит от ваших потребностей, ждать минутку + звонка не для всех :)

Также учитывая, что RN расширяет веб-спецификацию для геолокации, вы можете найти ответы, связанные с ней, в Интернете, например, метко названный http://stackoverflow.com/questions/3752383/geolocation-is-so-slow-what-im- поступать неправильно

Есть у кого-нибудь твердое решение? Некоторые пользователи не могут даже зарегистрироваться в моем приложении из-за того, что часть регистрации требует от них установки геолокации. Проблема возникает только на некоторых устройствах Android, и я не использую третий параметр. Сводит меня с ума. Люди просто автоматически дают моему приложению 1 звезду обзоров, потому что они не могут установить свою геолокацию, хахаха. >.>

@booboothefool попробуйте использовать параметр options и передать highAccuracy как
ложный. Так результаты будут намного быстрее.

В пн, 20 февраля 2017 г., 9:50 booboothefool [email protected]
написал:

Есть у кого-нибудь твердое решение? Некоторые пользователи даже не могут зарегистрироваться на моем
приложение из-за части регистрации, требующей от них установить свою геолокацию.
Проблема возникает только на некоторых устройствах Android, а у меня нет.
используя 3-й параметр. Сводит меня с ума.

-
Вы получили это, потому что оставили комментарий.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/facebook/react-native/issues/7495#issuecomment-281142941 ,
или отключить поток
https://github.com/notifications/unsubscribe-auth/ADJE_BC-osVA45bcpejEI_paDEBykBs1ks5redJtgaJpZM4Ibete
.

@greyvugrin Хорошо, я

Также на основе этого: https://developer.mozilla.org/en-US/docs/Web/API/PositionOptions

Похоже, это параметры по умолчанию. enableHighAccuracy: false с timeout: Infinity , так разве он уже не должен делать это, если я не предоставлю третий параметр?

@booboothefool, вы правы, что эта ветка сбивает с толку. Насколько я могу судить, люди, которые пропускают параметр options, могли решить свою проблему, потому что что-то еще в настройках влияло на ситуацию.

установка для enableHighAccuracy значения true или false для меня не работает.
опускание третьего аргумента для getCurrentPosition для использования значений по умолчанию из собственного модуля работает для меня.

Таким образом, проблема могла быть в timeout . На геолокацию влияет множество факторов, поэтому получение как можно большего количества информации от людей, у которых происходит сбой, поможет.

Если у вас уже были удалены параметры, и RN действительно по умолчанию использует те же параметры, что и веб, все должно работать нормально. Если у вас все еще есть проблемы, возможно, посмотрите, есть ли у пользователей разрешения на определение местоположения (и вы проверяете это в своем приложении).

Привет @greyvugrin ,

Спасибо за большой совет о разрешениях. Я думаю, это то, чего мне не хватало. После реализации https://github.com/lucasferreira/react-native-android-permissions (я предпочитаю этот API https://facebook.github.io/react-native/docs/permissionsandroid.html) вместе с указанием enableHighAccuracy: false и установив timeout , похоже, теперь это работает для всех.

Мое приложение поднялось с 1 звезды в Google Play Store, когда все хвалили его из-за проблем с геолокацией, до 3,6 звезд, хахаха! 👍

@booboothefool , это отличные новости, рад это слышать !!!

Я перепробовал все предложенные здесь подходы. Не могу получить ничего из getCurrentPosition, кроме тайм-аутов на симуляторе или устройстве на Android. watchPosition работает, но на самом деле не предлагает лучшего UX для пользователя, мне нужно только местоположение пользователя один раз, мне не нужно держать GPS, чтобы расходовать батарею.

Я пытался:

  • enableHighAccuracy: false
  • аргумент удаления параметров
  • проверка и запрос разрешения android> = 23
  • И FINE, и COARSE в манифесте.

Никто не меняет таймауты для getCurrentPosition

Это просто то, что разработчикам эмулятора Android Studio придется исправить / внедрить в будущем, когда у них появится такая возможность.

Однако пока ... Вы можете импортировать большой файл следа GPX и позволить ему воспроизвести со скоростью «1x». Я взял GPX отсюда ... ExpertGPS.com -> ca-trails.gpx
... этот файл длился около 8 минут на скорости "5x", поэтому на скорости "1x" он ДОЛЖЕН длиться около 40 минут.

Загрузите его (или другой, возможно, более крупный файл GPX) в [...] Расширенные параметры -> Местоположение (кнопка «Загрузить GPS / KML» в правом нижнем углу), нажмите кнопку воспроизведения, затем закройте окно ... воспроизведение продолжится. пока не дойдет до конца. Жаль, что нет автоповтора - еще одна функциональная просьба для программистов Android Studio. :-)

Это не правда. У меня такие же таймауты на реальных устройствах.
getCurrentPosition всегда истекает. Часы работают нормально. Тестирование Z5, Nexus 5X
& Pixel, Тайм-аут на начальный вызов getCurrentPosition.

Сб, 4 марта 2017 г., 19:49 Дин Фокс, [email protected] написал:

Разработчики Android Studio Emulator собираются сделать это.
придется исправить / внедрить в будущем, когда у них появится такая возможность.

А пока ... Вы можете импортировать большой файл трассы GPX и позволить
он воспроизводится со скоростью «1x». Я взял GPX отсюда ... ExpertGPS.com ->
ca-trails.gpx
https://www.expertgps.com/data/downloading.asp?file=ca/ca-trails.gpx
... этот файл длился около 8 минут на скорости "5x", поэтому на скорости "1x" он
ДОЛЖЕН длиться около 40 минут.

Загрузите его (или другой, возможно, более крупный файл GPX) в [...] Extended
Параметры-> Местоположение (кнопка «Загрузить GPS / KML» в правом нижнем углу), нажмите кнопку воспроизведения.
кнопку, затем закройте окно ... воспроизведение будет продолжаться до тех пор, пока
конец. Жаль, что автоповтора нет - еще один запрос функции для Android.
Студия программистов. :-)

-
Вы получили это, потому что оставили комментарий.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/facebook/react-native/issues/7495#issuecomment-284172310 ,
или отключить поток
https://github.com/notifications/unsubscribe-auth/AACQ6AoZYXJ02DCmevcLmmF3tuOdg_SEks5ribJHgaJpZM4Ibete
.

Удаление третьего параметра getCurrentLocation сработало для меня на эмуляторе.

{
   timeout: 20000,
    maximumAge: 1000
}

Я просто закодировал трехпроходную возможность. Может быть, перебор, ну да ладно. Вот фрагмент кода (с комментариями) ...

class FindNearMe extends Component {

  constructor(props) {
    super(props);

    this.state = {
      prevLatitude: 0.0,
      prevLongitude: 0.0,
      gotLocation: false,
      locating: false,
      loading: false
    };
  }

  handleGeolocationSuccess = (position) => {

    // Get a response, say we are done locating, even if it is still looking for a fine result.
    this.setState({ locating: false });

    // If we previously failed, we can clear the error if it just happens to still be visible.
    if (!this.state.gotLocation) {
      this.props.navigator.hideLocalAlert();  // Hide possibly open alert.
      this.setState({ gotLocation: true });  // Remove the previous failure state.
    }

    // Only proceed if there is an actual change in location.
    if (this.state.prevLatitude != position.coords.latitude ||
        this.state.prevLongitude != position.coords.longitude) {

      // Overwrite the old location with the new location.
      this.setState({
        prevLatitude: position.coords.latitude,
        prevLongitude: position.coords.longitude,
        loading: true // Only needed if you plan to get content from server.
      });

      // ... DO SOMETHING WITH THE UPDATED LOCATION ...
      // If you used a callback function (success or failure) be sure to include this...
      this.setState({ loading: false });
 };

  // This first, RoughError, means the "enableHighAccuracy: false" time-out occurred.
  handleGeolocationRoughError = (error) => {
    this.props.navigator.showLocalAlert('Attempting to pinpoint your location...', config.errorStyles);
    // Invalidate our current location
    this.setState({ gotLocation: false });
  };

  // This second, FineError, means the "enableHighAccuracy: true" time-out occurred.
  handleGeolocationFineError = (error) => {
    // If we got Rough location, I'm ignoring this. But, if neither rough nor fine succeeded...
    if (!this.state.gotLocation) {
      // ...try once more without the options.
      navigator.geolocation.getCurrentPosition(
        this.handleGeolocationSuccess,
        this.handleGeolocationFinalError
      );
    }
  };

  // This last, FinalError, means nothing worked and we're giving up.
  handleGeolocationFinalError = (error) => {
    if (!this.state.gotLocation) {
      this.props.navigator.showLocalAlert('Could not determine your location, sorry!', config.errorStyles);

      // Let our app know that we are not trying anymore.
      this.setState({ locating: false });
    }
  };

  goToNearMe = () => {
      // Track when we are attempting to get a location update.
      this.setState({ locating: true });

      // Try to get the rough location quickly.
      navigator.geolocation.getCurrentPosition(
        this.handleGeolocationSuccess,
        this.handleGeolocationRoughError,
        {
          enableHighAccuracy: false,
          timeout: 500,  // I have this set for half-second before popping up the alert.
          maximumAge: 0
        }
      );

      // But, also, simultaneously try to get the fine location.
      navigator.geolocation.getCurrentPosition(
        this.handleGeolocationSuccess,
        this.handleGeolocationFineError,
        {
          enableHighAccuracy: true,
          timeout: 7500,  // I have this set for 7.5 seconds, about the length of the first alert's visibility.
          maximumAge: 0
        }
      );
  };

  render() {
    return (
        <Container>
          <LocateMeButton
              onPress={this.goToNearMe}
              loading={this.state.loading || this.state.locating}
          />
          <Header>
            Use Current Location
          </Header>
        </Container>
    );
  }
}

export default FindNearMe;

Я тестировал это только на локальных эмуляторах разработчиков, а не на производстве. Сообщите мне, было ли это полезно для вас.

Я просто подумал ... он, вероятно, отлично сработал бы как двухпроходный, если бы ваш вызов rawError просто использовал версию без параметров ...

  goToNearMe = () => {
      // Track when we are attempting to get a location update.
      this.setState({ locating: true });

      // Try to get the rough location quickly.
      navigator.geolocation.getCurrentPosition(
        this.handleGeolocationSuccess,
        this.handleGeolocationRoughError,
// Just leave this off entirely (but default timeout is Infinity, so you'd never get the first alert!)...
//        {
//          enableHighAccuracy: false,
//          timeout: 500,  // I have this set for half-second before popping up the alert.
//          maximumAge: 0
//        }
// ...or try ujwal-setlur's method of leaving off the enableHighAccuracy portion...
        {
          timeout: 500,
          maximumAge: 0
        }
// NOTE: ujwal-setlur's method did NOT work for my Android emulator.
//             I had to comment out the options object completely for it to not time-out.
      );

      // But, also, simultaneously try to get the fine location.
      navigator.geolocation.getCurrentPosition(
        this.handleGeolocationSuccess,
//        this.handleGeolocationFineError,  // Wouldn't need this, make it your FinalError instead.
        this.handleGeolocationFinalError,
        {
          enableHighAccuracy: true,
          timeout: 7500,  // I have this set for 7.5 seconds, about the length of the first alert's visibility.
          maximumAge: 0
        }
      );
  };

Это заставит телефоны Android с проблемами больше не иметь задержки, но по-прежнему пытаться добиться высокой точности. Тогда вам вообще не понадобится FineError, этот код можно удалить.

  • Да, я знаю, что существует небольшая вероятность того, что попытка "enableHighAccuracy: true" вернется раньше других асинхронных "грубых" результатов (особенно, если таймаут бесконечности) и, таким образом, будет потеряна / перезаписана ... но я сомневаюсь в этом. Если вы действительно хотите быть настолько осторожными, вы можете изменить код, чтобы проверить этот конкретный случай.

Есть ли в этом прогресс?

Алекс, в этой теме есть несколько решений. Что пробовали? Это
также, возможно, стоит создать новый билет, когда у вас будет больше деталей, поскольку
этот поток такой длинный, если ни одно из вышеперечисленных решений не работает.

17 марта 2017 г., 10:29 Алексей Синельников [email protected]
написал:

Есть ли в этом прогресс?

-
Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/facebook/react-native/issues/7495#issuecomment-287419487 ,
или отключить поток
https://github.com/notifications/unsubscribe-auth/ADJE_HLDGQEplAduqm3Zx5L74dv99mnhks5rmsLjgaJpZM4Ibete
.

Как ты. Ни одно из приведенных выше предложений не работает. Единственное решение для меня
получить местоположение на Android, нужно было использовать часы и обновить пользовательский интерфейс, чтобы сообщить
пользователю, что происходит, если функции вашего приложения отвечают на локализацию. Не надо
возиться с getCurrentPosition, он не работает ни на одном из 10 реальных тестов
устройства под управлением различных версий Android 4+

Пт, 17 марта 2017 г., 17:48 Грей Вугрин, [email protected] написал:

Алекс, в этой теме есть несколько решений. Что пробовали? Это
также, возможно, стоит создать новый билет, когда у вас будет больше деталей, поскольку
этот поток такой длинный, если ни одно из вышеперечисленных решений не работает.

17 марта 2017 г., 10:29 Алексей Синельников [email protected]
написал:

Есть ли в этом прогресс?

-
Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
<
https://github.com/facebook/react-native/issues/7495#issuecomment -287419487
,
или отключить поток
<
https://github.com/notifications/unsubscribe-auth/ADJE_HLDGQEplAduqm3Zx5L74dv99mnhks5rmsLjgaJpZM4Ibete

.

-
Вы получили это, потому что оставили комментарий.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/facebook/react-native/issues/7495#issuecomment-287424598 ,
или отключить поток
https://github.com/notifications/unsubscribe-auth/AACQ6DgWuUzw4hj7rmr8LDzcRHjEheIcks5rmsdSgaJpZM4Ibete
.

Иногда это работает, иногда нет. Я пробовал ВСЕ решения, указанные выше, и пока нет надежного решения. Это действительно сводит меня с ума :(

Есть ли какой-либо собственный модуль, который воспроизводит функцию, такую ​​как getCurrentPosition? Я ищу другое репо, потому что не могу писать Java-код.

watchPosition имеет проблему, когда местоположение не включено. Он никогда не выдает таймаут, хотя я установил тайм-аут = 1000

На getCurrentPosition будет сгенерирован тайм-аут, поэтому я могу вызвать диалоговое окно Location, чтобы включить GPS. Но теперь я перехожу к getCurrentPosition

РЕДАКТИРОВАТЬ:
Я перепробовал все варианты и теперь знаю, в чем проблема. Я могу заставить его работать, если удалить третьи параметры и установить режим местоположения либо на высокую точность, либо на экономию заряда батареи. Иначе ничего не получится. Я не знаю, как сказать пользователю выбрать «Высокая точность» или «Экономия заряда батареи» вместо «Только устройство», потому что у каждого поставщика есть разные способы доступа к этому меню.

Выше есть комментарий о добавлении enableHighAccuracy: false в третьи параметры, но это не сработало для параметров High Accuracy, Battery Saving или Device Only. Я считаю, что третьи параметры геолокации бесполезны для реального устройства.

location-mode-100621707-large

В моем случае удаление maximumAge решило проблему.

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

@nigelnindo, что вы имеете в виду "Нативная реализация"? внутри RN или прямо в Android?

@ L3V147H4N прямо в Android. Есть пара библиотек, которые вы можете использовать для этого, но я видел, что большинство из них несовместимо с последними версиями RN. Если это вызывает достаточный интерес, я не против потратить некоторое время на создание простого модуля, который поможет решить проблемы геолокации на Android, описанные в этой теме.

Возможно, вы можете проверить https://github.com/mauron85/react-native-background-geolocation#getlocationssuccess -fail

Это нативная реализация, и мне она нравится.

Думаю, почти все в этой теме были бы очень благодарны @nigelnindo
https://github.com/nigelnindo

В пн, 3 апреля 2017 г., в 17:34 Найджел Ниндо написал на [email protected] :

@ L3V147H4N https://github.com/L3V147H4N прямо в Android. Есть
пару библиотек, которые вы можете использовать для этого, но я видел, что большинство
несовместимы с последними версиями RN. Если достаточно
интерес к этому, я не против потратить некоторое время на создание простого модуля
чтобы помочь решить проблемы с геолокацией на Android, описанные в этой ветке.

-
Вы получили это, потому что оставили комментарий.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/facebook/react-native/issues/7495#issuecomment-291198134 ,
или отключить поток
https://github.com/notifications/unsubscribe-auth/AACQ6BwArzmfCk3TXfiRMp7kpdwMLM81ks5rsR-hgaJpZM4Ibete
.

Разочарование ... Я пытаюсь использовать navigator.geolocation.getCurrentPosition, но получаю сообщение об ошибке:
Истекло время ожидания запроса местоположения. Для Android iOS работает нормально.
Я попытался установить для enableHighAccuracy значение True / False, удалив третий аргумент, добавил в AndroidManifest разрешения COURSE и FINE для определения местоположения.

Android SDK 23, инструменты сборки 25.0.0
Реагировать 16.0.0-alpha.6
РН 0,43,3

Спасибо за вашу помощь!

Добро пожаловать в ветку Дуглас, к сожалению getCurrentPosition не
надежно на Android, как вы обнаружили.
Взгляните на некоторые решения ранее в потоке, используя
watchPosition вместо

Спасибо @raldred.
watchPosition вроде работает, благодарю за помощь!

@douglaswissett , пожалуйста. Надеюсь, что скоро появится надежное решение для getCurrentPosition .

Могу ли я использовать watchPosition затем clearWatch сразу после получения географической позиции? У меня проблемы с этим, потому что clearWatch можно вызвать только на componentDidMount

@pewh да. Это то, чем я занимаюсь.
Также navigator.geolocation.clearWatch можно вызвать в любое время.
Просто сохраните ссылку на watchID в вашем компоненте, который возвращается вызываемым watchPosition

Из документов, которые я читал на https://facebook.github.io/react-native/docs/geolocation.html , я понятия не имею, как получить this.watchID внутри обратного вызова watchPosition . Мой вариант использования - триггер clearWatch сразу после получения нового значения.

@pewh вот моя реализация. Это не идеально, но работает.
https://gist.github.com/raldred/b08cf60712eb87d81f05437444dff4ae

@raldred пробовал ваше решение и все остальные, ничего не работает

Какие-нибудь решения по этому поводу? попробуйте все здесь, и ничего не работает, пожалуйста, помогите! если вы можете поделиться некоторыми фрагментами или чем-то еще

@ gerard0315 вы добились успеха, решив это?

Похоже, у меня работает настоящий Android-телефон

Загрузите Outlook для iOS https://aka.ms/o0ukef


От: Хорхе Альмонасид [email protected]
Отправлено: вторник, 9 мая 2017 г., 14:29:56
Кому: facebook / react-native
Копия: Уджвал Сетлур; Комментарий
Тема: Re: [facebook / react-native] Геолокация 'enableHighAccuracy' на Android всегда истекает (# 7495)

Какие-нибудь решения по этому поводу? попробуйте все здесь, и ничего не работает, пожалуйста, помогите! если вы можете поделиться некоторыми фрагментами или чем-то еще

-
Вы получили это, потому что оставили комментарий.
Ответьте на это письмо напрямую, просмотрите его на GitHub https://github.com/facebook/react-native/issues/7495#issuecomment-300307037 или отключите поток https://github.com/notifications/unsubscribe-auth/ AFkMXWcokXoYDpsw28UaiUSDtCvRpE3Rks5r4NrUgaJpZM4Ibete .

Я уже поделился своими фрагментами, которые ДЕЙСТВИТЕЛЬНО работают на реальных устройствах, работающих под управлением
Android 4-7.

Вторник, 9 мая 2017 г., 22:29 Хорхе Альмонасид, [email protected] написал:

Какие-нибудь решения по этому поводу? попробуйте все здесь, и ничего не работает,
пожалуйста помоги! если вы можете поделиться некоторыми фрагментами или чем-то еще

-
Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/facebook/react-native/issues/7495#issuecomment-300307037 ,
или отключить поток
https://github.com/notifications/unsubscribe-auth/AACQ6HSlN8YS_jE6NY9w2vuk7Hv4Wjwfks5r4NrSgaJpZM4Ibete
.

В настоящее время получить обновление (в эмуляторе Android) можно только при одновременном изменении всех параметров (долгота, широта, высота). Если поменять только один или два - nothing works .

В том, как React-Native обрабатывает местоположение на Android, есть врожденный недостаток. (В iOS эта проблема отсутствует, iirc)

String provider = highAccuracy ? LocationManager.GPS_PROVIDER : LocationManager.NETWORK_PROVIDER;

LocationManager.GPS_PROVIDER is best for outdoors when you have a clear view of the sky

в то время как

LocationManager.NETWORK_PROVIDER is best for indoors, since it uses networks (and cell towers?)

На самом деле вам нужны оба / все провайдеры, если вы хотите сверхточное местоположение. Затем вы хотите сравнить точность, временную метку и принять более точное и свежее местоположение.

Это можно сделать двумя способами:

В React:

Установите две переменные watchID -> watchIDGPS и watchIDNetwork . Затем настройте двух наблюдателей, один с enableHighAccuracy=true и enableHighAccuracy=false это вернет и поставщика GPS, и поставщика сети (сеть будет более точной в помещении)

Проблема способа React в том, что он делает это в потоке JS; Это может привести к зависанию вашего приложения на устройствах с нехваткой ресурсов. Тем не менее это работает.

На родном языке:

Вы захотите переписать LocationModule.java как настраиваемый модуль, чтобы обрабатывать поставщиков по вашему выбору и сообщать местоположение обратно в mLocationListener независимо от того, какой это поставщик. Пока React-Native не исправит эту «проблему».

@ralred , Спасибо за сниппет, а что AndroidPermissions объект

Я перепробовал все решения, все не удалось ....
внезапно вспомнил, что в моем приложении есть модуль карты, карта baidu, карта Китая (map.baidu.com), например карта Google, она может получать маркеры и текущее местоположение !!! Наконец-то у меня получилось ~

вы можете искать его на github, react-native-baidu-map

импорт {
MapView, // вид карты (мне не нужно)
MapTypes, // введите как 2D или 3D (мне не нужно)
Геолокация // api о местоположении (мне нужно)
} из 'react-native-baidu-map';

componentDidMount () {
Geolocation.getCurrentPosition ()
.then (data => {
Alert.alert (JSON.stringify (data.latitude), JSON.stringify (data.longitude))
})
}

Я не знаю, можно ли работать в другой стране, просто подумав, используя некоторые приложения для карт, вы можете попробовать react-native-maps или другие карты ...

Ничего не работает, watchPosition даже на Android вызывать не будет, iOS работает отлично. Это уже RN v0.45.0 (я сейчас на 0.44.0) и все еще не решено? Давай!

@rexlow
Тоже ничего не работает, я использую версию 0.44. вы пробовали обновиться до v0.45?

@VietDucPhan Это только что сработало, совершенно случайно 😓. По-прежнему на уровне 0,44,0

@rexlow Отлично . Теперь мне нужна только удача, чтобы поразить меня.

Вы пробовали просто удалить структуру параметров? Это единственное, что у меня сработало.

Загрузите Outlook для iOS https://aka.ms/o0ukef


От: viet_duc_phan [email protected]
Отправлено: Воскресенье, 18 июня 2017 г., 23:26:15
Кому: facebook / react-native
Копия: Уджвал Сетлур; Комментарий
Тема: Re: [facebook / react-native] Геолокация 'enableHighAccuracy' на Android всегда истекает (# 7495)

@rexlow https://github.com/rexlow О, хорошо для вас. Теперь мне нужна только удача, чтобы поразить меня.

-
Вы получили это, потому что оставили комментарий.
Ответьте на это письмо напрямую, просмотрите его на GitHub https://github.com/facebook/react-native/issues/7495#issuecomment-309349488 или отключите поток https://github.com/notifications/unsubscribe-auth/ AFkMXYI2vukJgcTLkBeNdXdclgFbgo1sks5sFhSHgaJpZM4Ibete .

@rexlow @ ujwal-setlur Просто хочу сообщить вам, что удача ударила по мне. это работает и совершенно случайно. Ничего не менял.

Вы пробовали на реальном устройстве?

Вторник, 20 июня 2017 г., 19:18 viet_duc_phan, [email protected] написал:

@rexlow https://github.com/rexlow @ ujwal-setlur
https://github.com/ujwal-setlur Просто хочу, чтобы вы знали, что
удача ударила по мне. это работает и совершенно случайно. Я не менял
что-нибудь.

-
Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/facebook/react-native/issues/7495#issuecomment-309843462 ,
или отключить поток
https://github.com/notifications/unsubscribe-auth/AACQ6OVyeCsOgd-qevP9CrP9XJMhwaxsks5sGAz3gaJpZM4Ibete
.

@raldred Всегда проверял на реальных устройствах.

@VietDucPhan, можете ли вы настроить пример, который воспроизводит проблему?

Вт, 20 июня 2017 г., 20:52 viet_duc_phan, [email protected] написал:

@raldred https://github.com/raldred Всегда тестировалась на реальных устройствах.

-
Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/facebook/react-native/issues/7495#issuecomment-309870269 ,
или отключить поток
https://github.com/notifications/unsubscribe-auth/AACQ6N5SVbYeDEeY9FRnTQSrvpLwKL5aks5sGCLmgaJpZM4Ibete
.

@raldred исходный отчет в этой цепочке имеет фрагмент кода:

navigator.geolocation.getCurrentPosition(
      (position) => {
        console.log(position);
       },
       (error) => {
        console.log(error)
      },
      {enableHighAccuracy: true, timeout: 20000, maximumAge: 10000}
);

Для меня это тоже не удается. Единственный способ решить эту проблему - не включать аргумент options:

navigator.geolocation.getCurrentPosition(
      (position) => {
        console.log(position);
       },
       (error) => {
        console.log(error)
      }
);

@dreallday прав, Fused API, который объединяет информацию от поставщиков с магией.

Я обнаружил, что response-native-fused-location действительно полезен для запросов местоположения на Android.

@raldred Привет, извини, я недавно не проверял почту, но она снова не работает.

@ derman232 Будет ли

@rexlow, извините, не знаю ответа на этот вопрос, это не та функция, которая мне нужна для моего приложения.

Просто поделитесь своим мнением о том, как я решил эту проблему:

  • Проблема в том, что android> = 6.0 требует предоставления разрешений во время выполнения
  • В этом вопросе stackoverflow есть более подробная информация: вопрос
  • Я использовал модуль PermissionsAndroid от React Native, чтобы получить разрешения

Теперь все работает.

Привет,
Ничего не работает. Все перепробовала.
Пожалуйста, порекомендуйте.
Спасибо

Я действительно хотел бы помочь людям решить эту проблему.
У нас есть 3 нативных приложения, которые используют местоположение в реальном времени. QA'd на более чем 30 реальных Android-устройствах, от Gingerbread до Nougat.
Все работает нормально на протяжении всего пользовательского тестирования, с тех пор у нас не было сообщений о проблемах от реальных пользователей.

@adriancuco, не могли бы вы поделиться своей реализацией и манифестом, чтобы мы могли попытаться помочь.

  • Версия РН?
  • С какими версиями Android у вас возникают проблемы?
  • С какими устройствами у вас проблемы?

Будет сложность с вашей реализацией или конфигурацией устройства, нужно выяснить, что это такое.

ралдред

Сожалею. Моя вина!
Перед тем, как убить себя, я решил проверить настройки местоположения на своем телефоне, как я читал пару дней назад, и на нем только что был включен GPS. ; (
Итак, я включил GPS, Wi-Fi и т. Д. И все остальное, и теперь все работает нормально.
Действительно ценю это.
большое спасибо

Есть обновления по этой проблеме?

По-прежнему нет решения.


От: adriancuco [email protected]
Отправлено: вторник, 4 июля 2017 г., 14:44:28
Кому: facebook / react-native
Копия: Маруэн САЯРИ; Комментарий
Тема: Re: [facebook / react-native] Геолокация 'enableHighAccuracy' на Android всегда истекает (# 7495)

ралдред

Сожалею. Моя вина!
Перед тем, как убить себя, я решил проверить настройки местоположения на своем телефоне, как я читал пару дней назад, и на нем только что был включен GPS. ; (
Итак, я включил GPS, Wi-Fi и т. Д. И все остальное, и теперь все работает нормально.
Действительно ценю это.
большое спасибо

-
Вы получили это, потому что оставили комментарий.
Ответьте на это письмо напрямую, просмотрите его на GitHub https://github.com/facebook/react-native/issues/7495#issuecomment-312881724 или отключите поток https://github.com/notifications/unsubscribe-auth/ AD79YGcm507EtBxrFHHJkEc-OBvRsjKmks5sKkG7gaJpZM4Ibete .

@ m-sayari, ты собираешься дать нам немного больше информации, чтобы помочь.

  • Версия RN
  • Целевая версия сборки Android
  • Версия устройства Android
  • Устройства, на которых возникает эта проблема.

Это будет что-то конкретное для вашей реализации / настройки, вызывающее проблему. Как я уже говорил ранее, работает ли он без проблем в нескольких живых приложениях.

Решено здесь! RN 0.45.1 с использованием Redmi 4A с Android 6.

У меня была эта проблема с вызовом navigator.geolocation.getCurrentPosition () внутри componentDidMount ()
Вместо getCurrentPosition просто вызовите watchPosition () с теми же параметрами.

@raldred
Версия RN
0,46
Целевая версия сборки Android
api 22
Версия устройства Android
6.0.1
Устройства, на которых возникает эта проблема.
Нексус 5

Вызов getCurrentLocation без третьего параметра options решает мою проблему. У меня не работает установка enableHighAccuracy как false

Привет @raldred , та же проблема, что и другие, о RN 0.47.

  • Версия RN: 0.47
  • Целевая версия сборки Android, оставшаяся по умолчанию для RN:
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 22
  • Версия устройства Android: 6.0.1, 7.0
  • Устройства, на которых возникает эта проблема:

    • Nexus 5 с Android 6.0.1

    • Xiaomi Redmi 3S с Android 6.0.1

    • Эмулятор Android с Android 7.0

getCurrentPosition работает нормально, когда я устанавливаю режим определения местоположения «Только устройство» в настройках устройства, но перестает работать ( Location request timed out ), когда режим установлен на «Высокая точность».

Мне нужно опустить третий параметр, чтобы getCurrentPosition работал хотя бы в режиме Device Only:

    navigator.geolocation.getCurrentPosition(setLocation);

Я предположил, что это сработало для меня, хотя еще не тестировал с другим случаем.
Итак, глядя на мои варианты, я понял, что есть два элемента, которые конфликтуют сами по себе maximumAge и enableHighAccuracy , я думаю, что эти два варианта одинаковы, но немного по-разному, в то время как максимальный возраст гарантирует, что вы получить последнюю геолокацию на основе ваших настроек, даже если точность низкая, enableHighAccuracy гарантирует, что вы получите самое актуальное и точное местоположение, у меня была такая же проблема со следующими параметрами.
{enableHighAccuracy: true, timeout: 20000, maximumAge: 60000} пока я не уберу максимальный возраст и не оставлю enableHighAccuracy надеюсь, что это кому-то поможет.

Я только что построил response-native из master, чтобы проверить, исправляет ли фиксация 7e11bad86fd21ce1a8408218e66ce85993d9db69 эту проблему. К сожалению, я все еще получаю ту же ошибку, что и раньше.

@olieidel Watch position действительно работает, также убедитесь, что ваше устройство предоставило приложению доступ к определению местоположения и что ваша служба определения местоположения включена.

@olieidel Вы можете проверить, есть ли у вашего приложения доступ к разрешениям на доступ к местоположению, с помощью следующего API, PermissionsAndroid , вы сначала должны проверить, а затем спросить, не предоставлено ли оно.

@mrbarde спасибо за быстрый ответ!

Ах, после целого дня отладки, вот мои выводы и подходящее решение:
RN 0.46.4, устройство: Nexus 5X, API 25

Режим определения местоположения: только устройство

  • getCurrentPosition , enableHighAccuracy: true : работает, когда доступен сигнал GPS, иначе таймаут
  • getCurrentPosition , enableHighAccuracy: false : не работает (тайм-аут). вероятно, требуются службы определения местоположения (режим определения местоположения! = только устройство).
  • watchPosition , enableHighAccuracy: true : работает, когда сигнал GPS доступен, иначе таймаут
  • watchPosition , enableHighAccuracy: false : не работает

Режим локации: высокая точность

  • getCurrentPosition , enableHighAccuracy: true : работает, когда сигнал GPS доступен, иначе таймаут. Может возвращать более старое местоположение, в зависимости от вашей настройки maximumAge .
  • getCurrentPosition , enableHighAccuracy: false : работает через 5-6 секунд (как уже сообщалось).
  • watchPosition , enableHighAccuracy: true : работает, когда сигнал GPS доступен, иначе таймаут
  • watchPosition , enableHighAccuracy: false : работает

Резюме
Если выбран режим «Только устройство», вы всегда должны иметь сигнал GPS. Во всех остальных случаях вам потребуются службы определения местоположения (режим определения местоположения! = Только устройство).
Я полагаю, что это все ожидаемое поведение API местоположения, и я только что обнаружил, что эквивалент земли не является плоским, однако это ад отлаживать, если у вас есть устройство, настроенное с режимом местоположения == Только устройство эмулятор, недавно настроенное устройство), и вы сидите в комнате, где нет сигнала GPS. В этом случае вы получите только таймауты.

Обходной путь
Как уже было описано в этом потоке, я также использовал два слушателя watchPosition с разными значениями для enableHighAccuracy и просто взял первое значение обоих, а затем удалил их. Играя с этим подходом, у меня создалось впечатление, что оба слушателя действительно возвращают одни и те же местоположения, но моя дневная отладочная способность исчерпана ...
Это предполагает, что ваш режим определения местоположения не только для устройства.

@olieidel Конечно, и мне интересно, почему никто не использует реагирующий собственный API геолокации напрямую. Если он бесполезен или просто не работает, я думаю, что целесообразно заменить его на navigator.geolocation поскольку это работает чудеса, попробуйте сделать запрос на перенос с вашим обходным путем, чтобы узнать, понравится ли он Facebook. И спасибо, что приложили все усилия, чтобы копать глубже.

Мне потребовалось время, чтобы постоянно воспроизводить эту проблему.

У меня есть эта проблема только на телефонах Samsung с Android 5.1 и 6.0, когда для режима определения местоположения установлено значение «Высокая точность» и используется API текущего положения, когда я нахожусь в помещении без сигнала GPS. Он отлично работает на телефонах Oppo или на улице с четким сигналом GPS даже при включенном режиме «Высокая точность».

Вскоре я протестирую некоторые из решений, предложенных в этой ветке.

@mrbarde просто для пояснения: я использовал navigator.geolocation . :)

@olieidel Я знаю, просто navigator.geolocation а не Geolocation Api.

Привет, ребята, понял, что на Android у вас может быть разрешение на доступ к местоположению, но пользователь отключил определение местоположения в настройках ОС. Поэтому время вызова navigator.getCurrentPosition() все равно истечет.

Вот фрагмент кода Java с двумя методами. checkIfLocationAvailable который проверяет, включено ли у пользователя местоположение в настройках или нет. requestUserToActivateLocation предложит пользователю включить определение местоположения.

package location;

import android.Manifest;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Intent;
import android.content.IntentSender;
import android.content.pm.PackageManager;
import android.location.Location;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.content.ContextCompat;
import android.text.TextUtils;
import android.util.Log;

import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.PendingResult;
import com.google.android.gms.common.api.ResultCallback;
import com.google.android.gms.common.api.Status;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.location.LocationSettingsRequest;
import com.google.android.gms.location.LocationSettingsResult;
import com.google.android.gms.location.LocationSettingsStates;
import com.google.android.gms.location.LocationSettingsStatusCodes;



/**
 * Created by nigelnindo on 11/28/16.
 */
public class LocationBridge extends ReactContextBaseJavaModule implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {
    public LocationBridge(ReactApplicationContext reactContext) {
        super(reactContext);
    }

    public GoogleApiClient googleApiClient;

    <strong i="10">@Override</strong>
    public String getName() {
        return "LocationBridge";
    }

    <strong i="11">@ReactMethod</strong>
    public void checkIfLocationAvailable(final Promise promise){

        int locationMode = 0;
        String locationProviders;
        boolean isAvailable = false;

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
            try {
                locationMode = Settings.Secure.getInt(getReactApplicationContext().getContentResolver(), Settings.Secure.LOCATION_MODE);
            } catch (Settings.SettingNotFoundException e) {
                e.printStackTrace();
            }

            isAvailable = (locationMode != Settings.Secure.LOCATION_MODE_OFF);
        } else {
            locationProviders = Settings.Secure.getString(getReactApplicationContext().getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
            isAvailable = !TextUtils.isEmpty(locationProviders);
        }

        boolean coarsePermissionCheck = (ContextCompat.checkSelfPermission(getReactApplicationContext(), Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED);
        boolean finePermissionCheck = (ContextCompat.checkSelfPermission(getReactApplicationContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED);

        boolean finalResult = (isAvailable && (coarsePermissionCheck || finePermissionCheck));

        Log.e("FINAL RESULT", Boolean.toString(finalResult));

        promise.resolve(Boolean.toString(finalResult));

    }

    <strong i="12">@ReactMethod</strong>
    public void requestUserToActivateLocation(final Promise promise){

        Log.e("LOCATION_BRIDGE:", "called activate location function");

        if (googleApiClient == null) {
            Log.e("LOCATION_BRIDGE: ", "googleApiClient is null");
            googleApiClient = new GoogleApiClient.Builder(getReactApplicationContext())
                    .addApi(LocationServices.API)
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this).build();
            googleApiClient.connect();
        }

        LocationRequest locationRequest = LocationRequest.create();
        locationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
        locationRequest.setInterval(30 * 1000);
        locationRequest.setFastestInterval(5 * 1000);
        LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
                .addLocationRequest(locationRequest);

        //**************************
        builder.setAlwaysShow(true); //this is the key ingredient
        //**************************

        Log.e("LOCATION_BRIDGE", "Created builder");

        PendingResult<LocationSettingsResult> result =
                LocationServices.SettingsApi.checkLocationSettings(googleApiClient, builder.build());
        result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
            <strong i="13">@Override</strong>
            public void onResult(LocationSettingsResult result) {
                Log.e("LOCATION_BRIDGE: ", "onResult callback invoked");
                final Status status = result.getStatus();
                final LocationSettingsStates state = result.getLocationSettingsStates();
                switch (status.getStatusCode()) {
                    case LocationSettingsStatusCodes.SUCCESS:
                        Log.e("LOCATION_BRIDGE: ", "Location settings satisfied");
                        // All location settings are satisfied. The client can initialize location
                        // requests here.
                        promise.resolve("true");
                        break;
                    case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                        Log.e("LOCATION_BRIDGE", "Location resolution required");
                        // Location settings are not satisfied. But could be fixed by showing the user
                        // a dialog.
                        try {
                            // Show the dialog by calling startResolutionForResult(),
                            // and check the result in onActivityResult().
                            status.startResolutionForResult(
                                    getCurrentActivity(), 1000);
                            promise.resolve("awaiting");
                        } catch (IntentSender.SendIntentException e) {
                            Log.e("LOCATION_BRIDGE", "could not send intent");
                            promise.reject("LOCATION_BRIDGE", "could not send intent");
                        }
                        break;
                    case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                        Log.e("LOCATION_BRIDGE", "location settings are unavailable");
                        // Location settings are not satisfied. However, we have no way to fix the
                        // settings so we won't show the dialog.
                        promise.reject("LOCATION_BRIDGE", "settings change is not available");
                        break;
                }
            }
        });

    }

    <strong i="14">@Override</strong>
    public void onConnected(<strong i="15">@Nullable</strong> Bundle bundle) {
        Log.e("LOCATION_BRIDGE", "CONNECTED");
    }

    <strong i="16">@Override</strong>
    public void onConnectionSuspended(int i) {
        Log.e("LOCATION_BRIDGE", "SUSPENDED");
    }

    <strong i="17">@Override</strong>
    public void onConnectionFailed(<strong i="18">@NonNull</strong> ConnectionResult connectionResult) {
        Log.e("LOCATION_BRIDGE", "CONNECTION FAILED");
        Log.e("LOCATION_BRIDGE", connectionResult.toString());
        if (connectionResult.hasResolution()){
            try {
                connectionResult.startResolutionForResult(getCurrentActivity(), 1);
            } catch (IntentSender.SendIntentException e) {
                e.printStackTrace();
            }
        }
        else{
            Log.e("LOCATION_BRIDGE","CONNECTION FAILURE HAS NO RESOLUTION");
        }
    }
}

С тех пор, как я начал использовать это, у меня не было проблем с местоположением в Android. Надеюсь, это кому-то поможет.

Конечно, вам нужно добавить compile 'com.google.android.gms:play-services-location:x.x.x' в свой app/build.gradle и создать собственный модуль, как описано здесь . Не уверен, что этой функциональности достаточно для создания автономной библиотеки npm.

Привет, @nigelnindo, на самом деле есть React Native API для PermissionsAndroid ,
вы можете убедиться, что пользователь включил разрешение на определение местоположения для приложения
У меня была та же проблема, на которую вы указали, поэтому для ее решения я сделал следующее.

Сначала я проверил, предоставил ли пользователь приложению доступ к местоположению устройств.

PermissionsAndroid
.check("android.permission.ACCESS_FINE_LOCATION")
.then((granted) => {
    if(granted){
        // do something
        return;
    }
    // do something else
}).catch((err) => {
    // handle error
});

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

PermissionsAndroid
.request("android.permission.ACCESS_FINE_LOCATION")
.then((resp) => {
    if(resp == "granted"){
        _self._watchLocation();
    }else{
        this.props.watchLocSuccess();
    }
    // set state
    _self.setState({
        requestLocation: false
    });
    // 
}).then((err) => {
    // handle error
});

Это помогло мне, и теперь у меня нет проблем с местоположением, надеюсь, это поможет кому-то там.

Привет @mrbarde , просто чтобы добавить, я использую библиотеку PermissionsAndroid в дополнение к фрагменту выше. Как я упоминал ранее:

Привет, ребята, понял, что на Android у вас может быть разрешение на доступ к местоположению, но пользователь отключил определение местоположения в настройках ОС.

Другими словами, ваше приложение может иметь разрешение на доступ к местоположению, полученному с помощью PermissionsAndroid , но если пользователь отключил местоположение либо с помощью ярлыков в строке состояния, либо перейдя к Settings -> Location -> Off то getCurrentPosition() call все равно будет истекать. Это помогает в этом крайнем случае.

@nigelnindo yh , тогда я действительно предложу ваше решение, вы можете сделать пиар с этим? Я имею в виду, что это действительно могло бы сэкономить много времени, я использую внешний пакет, чтобы справиться с этим, так как я не могу писать Java, хотя мне действительно хотелось бы, чтобы у меня было время изучить его. Если бы это было официально в React, я бы предпочел это, я скептически отношусь к тому, чтобы полагаться на сторонние библиотеки для действительно важных вещей, таких как это, я беспокоюсь о согласованности.

попробуйте изменить (Android) TargetSdkVersion на build.gradle (app) под 23 (16-22) . и будет работать!

потому что нам нужно разрешение на использование из файла AndroidManifest. и файл AndroidManifest вызывается только в SDK до 23 (16–22).

и не забудьте добавить:

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

Не удаляйте параметр maxAge!

Если вы это сделаете, модуль GPS вернет последний кешированный результат, пока не получит фактическое положение со спутников. Это может быть позиция, кэшированная в другом приложении, далеко от вашего фактического местоположения. И если вы пытаетесь сохранить какой-то трек, ваши первые несколько точек могут показывать положение далеко от вашего фактического положения.

@pavelpashkovsky Можете ли вы предоставить факты или официальные документы,

@rexlow Я только что описал результат своих тестов, потому что около недели назад я столкнулся с той же проблемой и нашел эту тему.

У меня было около 30 тестов. И у меня было 3-4 случая с неправильным положением первые 1-5 секунд (пока GPS не обнаружил сигнал спутников)

@pavelpashkovsky Теперь я тоже столкнулся с той же проблемой. Хотя в моем конфиге есть maximumAge: 1000 . Похоже, он кэширует предыдущее местоположение, как вы сказали.

@rexlow Вы правы. В вашем случае GPS сохраняет позицию последнюю 1 секунду.

Но лучший результат я получил с максимальным возрастом: 0, когда GPS не сохраняет никаких результатов и всегда пытается получить фактическое положение (или ошибку, если не может получить положение со спутников).

Я могу подтвердить, что удаление максимального значения может вызвать проблемы на телефоне Oppo, который я тестировал. Он будет использовать очень старый кеш.

Это происходило со мной все время. Оказывается, мое разрешение на геолокацию было отключено в App Info -> Permissions. Интересно, почему это произошло, но кажется, что эти разрешения отменяют те, которые мы запрашиваем во время выполнения. Возможно, у кого-то еще есть эта проблема

привет (извините за мой английский).
Думаю, увеличение максимального возраста решит проблему.

RN 0.48 Геолокационный документ:
API геолокации расширяет веб-спецификацию: https://developer.mozilla.org/en-US/docs/Web/API/Geolocation

и согласно:
https://developer.mozilla.org/en-US/docs/Web/API/PositionOptions/enableHighAccuracy
&
https://developer.mozilla.org/en-US/docs/Web/API/PositionOptions/timeout
и особенно :
https://developer.mozilla.org/en-US/docs/Web/API/PositionOptions/maximumAge

в сценарии с этими параметрами:
{enableHighAccuracy: true, timeout: 10000, maximumAge: 30000}

Чип GPS устройства пытается подключиться к спутникам. если соединение установлено в период тайм-аута (10000 мс), широта и долгота будут возвращены без каких-либо ошибок, как сказал @RoBYCoNTe : issuecomment-220580494, но если соединение GPS не удалось или тайм-аут, устройство пытается вернуть кэшированные широту и долготу с максимальным возрастом, который установлен в варианты (30000 мс). если что-то существует, будет возвращен код ошибки 3, возвращенный с ошибкой тайм-аута в теме.

Я думаю, что лучшим решением будет увеличение тайм-аута (не менее 25000 мс) для подключения и специально увеличенное максимальное время (не менее 3600000 мс = 1 час)!

{enableHighAccuracy: true, timeout: 25000, maximumAge: 3600000} у меня сработало

_emulator config_: в течение периода ожидания вы должны отправить информацию о виртуальном местоположении (широту и долготу) через меню Location в настройках эмулятора. (это будет имитировать спутниковое соединение)

{ enableHighAccuracy: true, timeout: 60000, maximumAge: 1200 } у меня сработало. Для меня дело было не в максимальном возрасте, а в том, сколько времени я был готов ждать.

(Только для Android)
На мой взгляд, эта проблема не является ошибкой.
В React Native геолокация работает следующим образом:

  • высокая точность означает местоположение GPS
  • Когда отключено, он получает местоположение от сетевого провайдера.
  • maximumAge позволяет вам не получать каждый раз новую позицию (что требует затрат времени и энергии), а полагаться на кешированную позицию

Обычно поставщик GPS работает медленнее, чем поставщик сети, и не всегда работает в зависимости от вашего местоположения (если GPS не может связаться с телефоном, вы получите тайм-аут). Сетевой провайдер быстрее, доступнее, но, как компромисс, точность невысока (худшее, что у меня было, было 2000 метров).

Если у вас есть тайм-аут с использованием высокой точности, это означает, что вы не можете связаться с GPS.
В этом случае рассмотрите возможность отключения его по умолчанию и обновляйте местоположение по мере того, как оно становится все более точным. Ваши пользователи в этом случае ждать не будут.

В моем случае я реализовал своих собственных наблюдателей, сравнивая местоположение и всегда возвращая более точные. Проблема с реализацией RN по умолчанию заключается в том, что она полагается либо на поставщика GPS, либо на поставщика сети, но не дает компромисса для обоих. Вам, вероятно, придется работать над этим либо на JS, либо на Native.

Надеюсь, это помогло.

Проверено только на Android.

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

  • Если вы запускаете свое приложение через эмулятор Android, вы должны указать параметры, иначе оно не сработает.
navigator.geolocation.getCurrentPosition(
    (position) => {
        this.setState({currentLocation: {lat: position.coords.latitude, lng: position.coords.longitude}})
    }, (error) => {
        alert("Geolocation error: "+error.message);
    },
    {enableHighAccuracy: true, timeout: 20000, maximumAge: 0}
);

Я просто использую расширенные элементы управления, чтобы отправить желаемое местоположение в приложение.

  • Если вы запускаете свое приложение на реальных мобильных телефонах, вы должны опустить параметры, иначе оно не сработает.
navigator.geolocation.getCurrentPosition(
    (position) => {
        this.setState({currentLocation: {lat: position.coords.latitude, lng: position.coords.longitude}})
    }, (error) => {
        alert("Geolocation error: "+error.message);
    }
);

Это будет ваше текущее местоположение

У нас такая же проблема!

Будет ли исправление этого в ближайшем будущем выпуске?

Я пробовал некоторые из предложенных решений ( пример , пример , пример и пример ), и ни одно из них не решило проблему. Но я должен сказать, что не нашел никаких ссылок для следующего сценария:

Приложение

  • Android 6.x
  • Реагировать 16.1.0
  • React-Native 16.50.3

Сценарий использования

  • В телефоне Android _нет SIM-карты_, они принадлежат _ компании _ и могут подключаться только к WIFI.

Я все еще получаю ошибку Geolocation timed out, code 3 ...

Кто-нибудь решил это?

_Update_ (13.11.2017):

Я решил это (по крайней мере, временно), установив Settings >> Privacy >> Location >> Mode на High accuracy

Привет.
Я нашел хорошее решение!
Сначала прочтите мой предыдущий комментарий по этой проблеме: # issuecomment-331830285

Решение:
Сначала вызовите navigator.geolocation.getCurrentPosition с: {enableHighAccuracy: true, timeout: 60000, maximumAge: 0} как PositionOptions , это вернет реальную текущую позицию.
если истекло время ожидания предыдущего запроса, тогда вызовите navigator.geolocation.getCurrentPosition с: {enableHighAccuracy: false, timeout: 30000, maximumAge: 3600000} как PositionOptions , это вернет позицию LowAccuracy в качестве запасного
образец кода:

const GeoHightAccuracy = () => {
  return new Promise((resolve, reject) => {
    navigator.geolocation.getCurrentPosition(
      (locHightAccuracy)=>{
        resolve(locHightAccuracy)
      },
      (error)=>{
        GeoLowAccuracy()
        .then((locLowAccuracy)=>{resolve(locLowAccuracy)})
        .catch((err)=>{reject(err)});
      },
      {enableHighAccuracy: true, timeout: 60000, maximumAge: 0}
    )
  });
};
const GeoLowAccuracy = () => {
  return new Promise((resolve, reject) => {
    navigator.geolocation.getCurrentPosition(
      (locLowAccuracy)=>{
        resolve(locLowAccuracy)
      },
      (error)=>{
        reject(error)
      },
      {enableHighAccuracy: false, timeout: 15000, maximumAge: 3600000}
    )
  });
};



md5-4cb745c8e66bae2435e8bf78ce42a9c0



GeoHightAccuracy()
.then(locationData => console.log(locationData))
.catch(error => console.log(error));

Надеюсь быть полезным.

У меня такая же проблема!
Мне не удается заставить navigator.geolocation работать на моем реальном устройстве Android.

Я считаю, что тут поправлять нечего, геолокация работает как положено. Прочтите мой пост выше.

@Rewieer , Спасибо за ответ!

Я использую этот код для тестирования navigator.geolocation в своем приложении.

var options = {
  enableHighAccuracy: true,
  timeout: 5000,
  maximumAge: 5000
};

function success(pos) {
  var crd = pos.coords;
  alert(crd.latitude + " " + crd.longitude);
};

function error(err) {
  alert('ERROR(' + err.code + '): ' + err.message);
};

navigator.geolocation.getCurrentPosition(success, error, options);

Я всегда получаю ERROR(3): Location request timed out .
используя любую комбинацию опций.
Я вижу синюю точку своего местоположения на карте, и GPS работает нормально, но я не могу определить местоположение или заставить navigator.geolocation работать программно.

Возможные проблемы:

  • плохая конфигурация симулятора / телефона
  • не в зоне покрытия GPS (например, плохо работает в зданиях или на улице с большими зданиями)
  • слишком ранние тайм-ауты

В этом случае использование сетевого местоположения работает лучше. Вы пытались получить текущую позицию без параметров? (который будет использовать сетевую инфраструктуру для получения позиции)

Я использую настоящее устройство Android (версия 5.1)
Я могу определить свою позицию с помощью response-native-maps (правильное положение синей точки на карте внутри моего приложения) + Я могу использовать приложение Google Maps и перейти к своей позиции (GPS работает).
Я использую большой тайм-аут, переключаю enableHighAccuracy на true и false, удаляю параметры ... и т. Д. всем не удалось получить navigator.geolocation для получения данных.

Вы запачкали руки на Android с собственным API?

2017-11-16 15:19 GMT + 01: 00 Бадис Мерабет [email protected] :

Я использую настоящее устройство Android (версия 5.1)
Я могу определить свою позицию с помощью react-native-maps (правильный синий
положение точки на карте в моем приложении) + Я могу использовать приложение Google Maps и
перейти на мою позицию (GPS работает).
Я использую большой тайм-аут, переключаю enableHighAccuracy на true и false,
удалить параметры ... и т. д. все не смогли получить navigator.geolocation, чтобы получить
данные.

-
Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/facebook/react-native/issues/7495#issuecomment-344935653 ,
или отключить поток
https://github.com/notifications/unsubscribe-auth/ALuPm5XL1tNLCniOMR4YAMI4ZC2fKxrsks5s3ESBgaJpZM4Ibete
.

Да @Rewieer , согласен, причина ошибок - плохие настройки.

В эмуляторе мы должны отправить широту и долготу через настройки эмулятора до тайм-аута!

Мое решение # issuecomment-331830285 сначала пытается получить реальную текущую позицию через GPS и спутниковое соединение, и, если запрос истек (или при любой другой ошибке), пытается использовать сетевую инфраструктуру для получения позиции с низкой точностью .

@Rewieer Я никогда не работал с собственным API Android. Я занимаюсь только разработкой на JavaScript.

@badis пришлите, пожалуйста, свой код и журнал ошибок.

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

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

Работая с react-native, вы должны знать кое-что о базовой нативной среде, потому что такие проблемы случаются со мной довольно часто, работая с React-Native.
Фактически лучший способ (с точки зрения пользователя) - получить приблизительное значение при запуске и исправить его по ходу, потому что GPS может занять некоторое время в зависимости от вашего местоположения и положения ближайших спутников. Я знаю, что сетевое расположение может показаться очень грубым, но я думаю, не все живут в Сан-Франциско :)

@Rewieer @hoorsa
Вот демонстрационный код, в котором я тестирую функции: https://github.com/badis/mobile-react-native
Взгляните на страницу карты.
Я просто хочу знать, правильный ли код и работает ли он на кого-то другого.
После этого я попробую на своей стороне проверить, не связана ли проблема с настройками и местоположением моего устройства.

Спасибо вам всем !

@badis вы добавили <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> в файл AndroidManifest.xml своего приложения?

@badis У меня вчера была такая же проблема. Это сработает, если вы просто удалите последний аргумент (я понимаю, что это не идеально), как предлагается в https://github.com/facebook/react-native/issues/7495#issuecomment -228730196

Какие параметры по умолчанию для Android? может это поможет решить эту проблему

Я думаю, мы используем эти значения по умолчанию (из проверки LocationModule.java):

{
enableHighAccuracy: false, // Не использовать GPS
maximumAge: Double.POSITIVE_INFINITY, // Принять любое кешированное местоположение
тайм-аут: Long.MAX_VALUE,
distanceFilter: 100
}

Также мы сталкиваемся с той же ошибкой определения местоположения. Отключение третьего параметра работает в режимах «Высокая точность» и «Экономия заряда батареи». Тем не менее, Device only каждый раз выходит из строя. enableHighAccuracy в true не работает независимо от того, в какой режим мы установили устройство.

Использует ли эта штука вообще FusedLocationProviderClient , как предлагает сделать сайт Android Dev?

Отключение 3-го параметра работает для режимов «Высокая точность» и «Экономия заряда батареи».

@mkpietrzyk, значит, исключение options решило эту проблему за вас в этих двух режимах?

@natterstefan

да, для Android я использовал параметры по умолчанию ... но наличие почти бесконечного тайм-аута и максимального возраста для моего приложения - своего рода убийца приложений, поскольку мне нужно знать, где мои пользователи, чтобы проверить некоторые условия.

используя решение @hoorsa, здесь также работает проверка gps. Тем не менее, это все равно очень сложно для gps, и иногда он не отвечает на highAccuracy ... поэтому я не считаю, что он работает так хорошо, но эй, вроде как работает.

У меня та же проблема, когда мне нужно установить тайм-аут до смехотворно большого количества времени для его работы, но пользователям нужно будет получить доступ к информации раньше. При первом создании приложения я могу в течение полсекунды зарегистрировать, что разрешения на доступ к точному местоположению действительны. Реализация точного определения местоположения просто не работает должным образом на Android.
Для справки пробовал с параметрами и без них. Даже без каких-либо дополнительных опций он все равно иногда не может загрузить местоположение. Тестирование проводилось на One Plus One

У меня также проблема с тайм-аутом.

RN .50.3

Пробовал, вызов API с параметром maximumAge и без него:

{enableHighAccuracy: true, timeout: 10000},

Я также завершаю этот вызов запросом на разрешение, так что это не проблема:

РазрешенияAndroid.request (
РазрешенияAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,

На устройстве включен режим высокой точности.
У манифеста правильные разрешения.

На моем Galaxy S7 - локацию решает нормально.
На моем Pixel 2 - время ожидания истекает после 10-секундного тайм-аута в месте, где нет сигнала GPS.
В эмуляторе - время ожидания истекает после 10-секундного тайм-аута, ЕСЛИ я не перехожу на вкладку местоположения в расширенных элементах управления и не нажимаю «ОТПРАВИТЬ», чтобы отправить местоположение.

Похоже, что navigator.geolocation.getCurrentPosition НЕ работает, когда нет сигнала GPS, даже если есть более старое местоположение, кэшированное из другого приложения, которое ранее использовало местоположение ..

Я собираюсь обойти это, попробовав высокую точность, а затем отказавшись от высокой точности, если это не удастся, так же, как это сделал

У меня та же проблема, что и у @jacksontbryan , но getCurrentPosition действительно использует кешированное местоположение, если maximumAge опущено.

Кажется, он отлично работает на Galaxy S7, но не на моем LG G6. На LG время ожидания почти всегда истекает, если установлен параметр maximumAge. Если maximumAge не установлен, используется старое местоположение.

Изменить: похоже, что вообще не работает аргумент параметров.

Всем рекомендую использовать реализацию собственного нативного модуля на Android для получения стабильных результатов. Его довольно легко реализовать, вы получите гораздо больший контроль над GPS и вам не придется беспокоиться о том, что ваше приложение не работает на некоторых устройствах.

    public Location getBestLastKnownPosition(Context context) {
        LocationManager locationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
        List<String> providers = locationManager.getProviders(true);
        Location bestLocation = null;
        for (String provider : providers) {
            Location l = locationManager.getLastKnownLocation(provider);
            if (l == null) {
                continue;
            }
            if (bestLocation == null || l.getAccuracy() < bestLocation.getAccuracy()) {
                // Found best last known location: %s", l);
                bestLocation = l;
            }
        }

        if (bestLocation == null) {
            locationManager.requestSingleUpdate(new Criteria(), this, null);
        }
        return bestLocation;
    }

    private static WritableMap locationToMap(Location location) {
        WritableMap map = Arguments.createMap();
        WritableMap coords = Arguments.createMap();
        coords.putDouble("latitude", location.getLatitude());
        coords.putDouble("longitude", location.getLongitude());
        coords.putDouble("altitude", location.getAltitude());
        coords.putDouble("accuracy", location.getAccuracy());
        coords.putDouble("heading", location.getBearing());
        coords.putDouble("speed", location.getSpeed());
        map.putMap("coords", coords);
        map.putDouble("timestamp", location.getTime());
        map.putString("provider", location.getProvider());

        if (android.os.Build.VERSION.SDK_INT >= 18) {
            map.putBoolean("mocked", location.isFromMockProvider());
        }

        return map;
    }

    <strong i="6">@ReactMethod</strong>
    public void getCurrentPosition(Callback successCallback, Callback errorCallback){
        Location l = getBestLastKnownPosition(this.getReactApplicationContext());
        if (l == null){
            errorCallback.invoke("Failed to retrieve current location");
            return;
        }
        successCallback.invoke(locationToMap(l));
    }

    private static class LocationOptions {
        private final long timeout;
        private final double maximumAge;
        private final boolean highAccuracy;
        private final float distanceFilter;

        private LocationOptions(
                long timeout,
                double maximumAge,
                boolean highAccuracy,
                float distanceFilter) {
            this.timeout = timeout;
            this.maximumAge = maximumAge;
            this.highAccuracy = highAccuracy;
            this.distanceFilter = distanceFilter;
        }

        private static LocationOptions fromReactMap(ReadableMap map) {
            // precision might be dropped on timeout (double -> int conversion), but that's OK
            long timeout =
                    map.hasKey("timeout") ? (long) map.getDouble("timeout") : Long.MAX_VALUE;
            double maximumAge =
                    map.hasKey("maximumAge") ? map.getDouble("maximumAge") : Double.POSITIVE_INFINITY;
            boolean highAccuracy =
                    map.hasKey("enableHighAccuracy") && map.getBoolean("enableHighAccuracy");
            float distanceFilter = map.hasKey("distanceFilter") ?
                    (float) map.getDouble("distanceFilter") :
                    10;

            return new LocationOptions(timeout, maximumAge, highAccuracy, distanceFilter);
        }
    }

    <strong i="7">@ReactMethod</strong>
    public void watchPosition(ReadableMap options, Callback successCallback, Callback errorCallback){
        LocationOptions opts = LocationOptions.fromReactMap(options);
        LocationManager locationManager = (LocationManager)this.getReactApplicationContext().getSystemService(Context.LOCATION_SERVICE);
        Criteria criteria = new Criteria();
        if (opts.highAccuracy) {
            criteria.setAccuracy(Criteria.ACCURACY_FINE);
        }
        String bestProvider = locationManager.getBestProvider(criteria, true);

        locationManager.requestLocationUpdates(bestProvider, 1000, opts.distanceFilter, this);
    }

    <strong i="8">@Override</strong>
    public void onLocationChanged(Location location) {
        if (location == null) return;

        this.getReactApplicationContext()
                .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
                .emit("locationChanged", locationToMap(location));
    }

@Buthrakaur Я пытаюсь создать собственный модуль для вашего фрагмента, но не могу заставить его работать, потому что не удалось выполнить сборку. Я опубликовал свою суть https://gist.github.com/pewh/1fd64c8f0b3797ef2b7a7046b5a5f974 и надеюсь, что кто-нибудь любезно внесет исправления в мою суть. Большое спасибо и счастливого Рождества!

Вызов navigator.geolocation.getCurrentPosition без каких-либо параметров решил проблему для меня. Я передаю только обратные вызовы успеха и ошибки.

Проверено на реальном устройстве с Android 5.1.

@ginex Вы уверены, что данные новые? Когда я это делаю, иногда получаю данные за час. (Там написано, что я там, где был час назад).

Это действительно нужно исправить!

Привет

Я тоже столкнулся с той же проблемой. Я получаю ошибку тайм-аута на некоторых устройствах. Я увеличил тайм-аут с 2 секунд до 10 минут, но, не дожидаясь 10 минут, это просто выдает мне ошибку.

Я также пробовал использовать enableHighAccuracy: false. В этом случае я могу получить местоположение (кроме режима устройства).

Я также пробовал без передачи параметров. Я могу получить местоположение и в этом случае, но кроме режима устройства.

Я также пробовал пройти максимальное время, но безрезультатно.
Это мой код-

getCurrentPosition () {
navigator.geolocation.getCurrentPosition (
(позиция) => {
console.log ('получить позицию');
this.location = {
долгота: position.coords.longitude,
широта: position.coords.latitude,
ошибка: нуль,
};
},
(ошибка) => {
console.log ('ошибка получения позиции', ошибка);
this.location = {
долгота: ноль,
широта: ноль,
ошибка: error.message,
};
},
{
enableHighAccuracy: true,
тайм-аут: 600000
},
);
}

Если кто-то из вас использует skipPermissionsRequest, а geoLocation истекает время ожидания - см. # 17487

Привет

@ngandhy - Нет, я не использую skipPermissionRequests: true. а minSdkVersion - 16

У меня те же проблемы, что и у всех вас, я пробовал каждую комбинацию, которую люди упоминают для Android, и решил ее с помощью этой реакции-родного-фона-геолокации, и мы можем получить сохраненные местоположения и даже местоположения GPS, и эти местоположения будут очень точными.

@badis
Ваше решение сработало для меня - спасибо!

Мой метод до исправления:

getUserLocationHandler() { navigator.geolocation.getCurrentPosition(position => { console.log(position.coords.latitude, position.coords.longitude); }, err => { console.log(err); } }

Мой метод после вашего исправления:

getUserLocationHandler() { navigator.geolocation.getCurrentPosition(position => { console.log(position.coords.latitude, position.coords.longitude); }, err => { console.log(err); }, {enableHighAccuracy: false, timeout: 15000, maximumAge: 3600000}); }

Я просто тестирую этот код, и это может быть решением:
https://www.abidibo.net/blog/2017/11/23/geolocation-react-native/

У этой проблемы тоже есть решение?

Я столкнулся с этой проблемой некоторое время, и единственное «решение», которое работает стабильно, - это отключить «enableHighAccuracy». Проблема в том, что он затем использует вашу сеть вместо GPS для определения вашего местоположения, что теряет тонну точности.

Многие другие решения поначалу кажутся работоспособными, но я обнаружил, что это обычно связано с использованием кэшированной позиции, и если вы перезагрузите телефон и запустите приложение, оно все равно не сработает.

Сегодня я нашел этот пакет, который использует API объединенных местоположений Google для местоположений Android и возвращается к реализации React Native по умолчанию для iOS (я не являюсь автором этого пакета, но ему спасибо за его создание):

https://www.npmjs.com/package/react-native-geolocation-service

Я пока только немного протестировал его, но, похоже, он работает хорошо.

@globetro Спасибо! Я тоже это проверил, и, похоже, все работает нормально!

@globetro Спасибо.
React-native-geolocation-service - лучшее решение.

@globetro Я тоже успешно использовал этот плагин. Это должно быть объединено, чтобы реагировать на нативную функцию в качестве функции геолокации по умолчанию!

response-native-geolocation-service мне не помогает :(

Спасибо @globetro, пакет * react -native-geolocation-service * работал отлично, было бы неплохо добавить его в качестве основного компонента в react native.

Вы действительно хотите иметь два слушателя местоположения (что дорого), один с высокой точностью, а другой - нет.

то вы хотите сравнить, что более точно и новее, чем ваше «текущее» местоположение.


Это «временное» решение, оно действительно должно быть реализовано на стороне RN, поэтому оно использует разрешения COARSE и FINE, если включена highAccuracy.

Я исправил эту проблему, вот компонент, который я создал с помощью обещания:
https://gist.github.com/a3diti/5466f7309752cbb2e63ecefff6365bb9
В android я удалил maximumAge , сохранил enableHighAccuracy до true и добавил проверку прав доступа из компонента RN PermissionsAndroid .

@ a3diti Вы проверили это в реальном мире? Местоположение можно кэшировать.

@ a3diti Если они не

Почему бы не объединить код, используемый здесь https://www.npmjs.com/package/react-native-geolocation-service, в ядро?

Я столкнулся с той же проблемой «Тайм-аут запроса». После НИОКР я пытаюсь «перезагрузить» устройство, а затем после получения местоположения и его нормальной работы.

Пожалуйста, проверьте мой код.

componentDidMount = () => {
navigator.geolocation.getCurrentPosition (
(позиция) => {
const initialPosition = JSON.stringify (позиция);
this.setState ({initialPosition});
},
(ошибка) => предупреждение (сообщение об ошибке),
{enableHighAccuracy: false, timeout: 20000, maximumAge: 1000, distanceFilter: 1}

  );
  this.watchID = navigator.geolocation.watchPosition((position) => {
     const lastPosition = JSON.stringify(position);
     this.setState({ lastPosition });
     Alert.alert("Location change",lastPosition);

  });

}

Любая причина, по которой люди все еще борются с этим и не используют

https://www.npmjs.com/package/react-native-geolocation-service

как предлагалось ранее? У меня он отлично работает.

У других это не работает?

Добавил это в файл AndroidManifest.xml, и он работает!

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

Эй, ребята,

Я попытался использовать службу response -native-geolocation-service, как было предложено @globetro, но это

@ Patrick-Bayer Я использую его в своем приложении в Google Play, где он работает, но моя разрабатываемая версия теперь сразу дает сбой по неизвестной причине. Похоже, что и у меня сбой вызывает response-native-geolocation-service.

Fatal Exception: java.lang.VerifyError: Verifier rejected class com.google.android.gms.location.FusedLocationProviderClient: void com.google.android.gms.location.FusedLocationProviderClient.<init>(android.app.Activity) failed to verify: void com.google.android.gms.location.FusedLocationProviderClient.<init>(android.app.Activity): [0x8] register v2 has type Precise Reference: com.google.android.gms.common.api.internal.zzg but expected Precise Reference: com.google.android.gms.common.api.internal.zzcz

Сообщите мне, если найдете решение.

@oakis У меня

  1. Обновите Gradle и измените версию в
dependencies {
        classpath 'com.android.tools.build:gradle:3.1.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }

  1. Добавьте "google ()" в репозитории в вашем android / build.gradle

Иногда даже после добавления <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> в свой AndroidManifest.xml это может не сработать.
Быстрое решение

  1. Вы можете явно запросить информацию о местоположении пользователя, когда он монтирует первый экран вашего приложения, например
    try { const granted = await PermissionsAndroid.request( PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION ) if (granted == PermissionsAndroid.RESULTS.GRANTED) { // WHATEVER WAY YOU WANT THEM TO KNOW THAT THEY HAVE GRANTED THE PERMISSION //MAY BE USING BASIC ALERT OR TOASTANDROID } else { //SAME AS ABOVE } } catch (error) { //catch the error alert(error); }
  2. Никогда не устанавливайте enableHighAccuracy как false, вместо этого удалите maximumAge и увеличьте свой timeOut . Что-то вроде {enableHighAccuracy: true, timeout: 100000,} подойдет.

Надеюсь, это кому-то поможет.

Для меня установка enableHighAccuracy в true работает с API 23, хотя мне нужно установить false в API 26.
(это единственные, на которых я тестирую)

РЕДАКТИРОВАТЬ: В итоге я установил службу response

Привет,

У меня была такая же проблема, и вот другое решение.

Я добавил ниже тег uses-feature в AndroidManifest.xml, и, похоже, приложение отлично работает с highAccuracy: true

<uses-feature android:name="android.hardware.location.gps" />

Кажется, если вы установите highAccuracy: high , React Native будет использовать GPS_PROVIDER вместо NETWORK_PROVIDER. И, как говорится в документе разработчиков Android, приложение, ориентированное на API 21 или выше, должно включать этот тег в AndroidManifest.xml, чтобы использовать GPS_PROVIDER.

Внимание! Если ваше приложение нацелено на Android 5.0 (уровень API 21) или выше, вы должны объявить, что ваше приложение использует аппаратную функцию android.hardware.location.network или android.hardware.location.gps в файле манифеста, в зависимости от того, приложение получает обновления местоположения от NETWORK_PROVIDER или от GPS_PROVIDER. Если ваше приложение получает информацию о местоположении из любого из этих источников поставщика местоположения, вам необходимо объявить, что приложение использует эти аппаратные функции в манифесте вашего приложения. На устройствах под управлением версий до Android 5.0 (API 21) запрос разрешения ACCESS_FINE_LOCATION или ACCESS_COARSE_LOCATION включает подразумеваемый запрос на аппаратные функции определения местоположения. Однако при запросе этих разрешений автоматически не запрашиваются аппаратные функции определения местоположения в Android 5.0 (уровень API 21) и выше.

https://developer.android.com/guide/topics/location/strategies#Permission

Я не знаю, почему вам не нужно включать android.hardware.location.network в AndroidManifest.xml при установке highAccuracy: false что подразумевает, что LocationManager использует NETWORK_PROVIDER и, следовательно, тег требуется в соответствии с документом.

Надеюсь, это решение сработает для вас.

Я провел несколько экспериментов, и кажется, что тайм-аут может быть связан с тем, включены ли на устройстве службы определения местоположения Google.
Я заметил, что когда я включаю на устройстве службы определения местоположения, в окне предупреждения появляется вопрос: «Повысить точность определения местоположения?». с текстом, поясняющим, что службы определения местоположения Google будут работать в фоновом режиме, а также отправлять данные о местоположении в Google. Обычно это происходит на новом устройстве или эмуляторе, потому что большинство из нас уже включили это на наших обычных устройствах.

9vgfb

Когда этот параметр не включен, устройству необходимо получать новое местоположение почти каждый раз, когда вы его запрашиваете (контролируется настройками maximumAge ). Если вы какое-то время не запрашивали местоположение, и значения timeout недостаточно для получения нового местоположения, navigator.geolocation.getCurrentPosition просто вернет тайм-аут.

Я также видел, как это разрешается, открыв карты Google на устройстве один раз (которое снова получает новое местоположение).

Опять же, не утверждая, что это правильное объяснение / решение, просто добавляю свои наблюдения в эту ветку

Я мог наблюдать только за изменениями местоположения на Android с помощью response-native-fused-location

Кто-нибудь заинтересован в апстриме изменений одного из предложенных модулей в ядро?

Несколько дней назад я опубликовал функцию react-native-cross-geolocation, которая совместима с модулем геолокации RN, но использует наиболее эффективный Google Location API для Android. Из-за этого я не думаю, что мой модуль является кандидатом на его интеграцию в ядро ​​RN, но он доступен всем, кто хочет его использовать.

react-native-geolocation-service Этот пакет использует объединенный api местоположения и отлично работает для определения положения или даже для отслеживания положения. @hramos и @reyalpsirc, пожалуйста, попробуйте.

Местоположение слияния

Я перепробовал почти все, и оказалось, что это противоречиво. Я нашел кое-что, что может быть полезно.

Включение высокой точности означает определение местоположения через сеть gps + (услуги оператора связи). После проверки разрешений на уровне приложения на моем устройстве были отключены разрешения службы оператора связи. Включение его и удаление третьего параметра из navigator.geolocation.getCurrentPosition () у меня работает.
Пытаться
-Перейдите в Настройки вашего устройства -> Безопасность и местоположение -> Местоположение -> Разрешения на уровне приложения.
-Включение разрешения на местоположение для Carrier Services
-Удалить конфиг местоположения (третий параметр) из getCurrentPosition
-Перезагрузите устройство

Надеюсь это поможет!

Не уверен, актуально ли это. Но один пример https://snack.expo.io/SkJqg8gYm. После настройки кода код все время попадает в блок catch. Затем я узнал, что всякий раз, когда возникает исключение javascript, оно автоматически выбрасывается. Из-за этого был выполнен блок catch. Затем я убедился, что при вызове этой функции ошибок не произойдет. Я думаю, что в подобных случаях необходимо применять машинописный текст, чтобы предотвратить ошибки во время выполнения.

{enableHighAccuracy: true, timeout: 10000, maximumAge: 0}
что я нашел, если пропустить второй параметр или дать менее 10000 значений, что дает ошибку

попробуйте указать все три параметра, как указано выше, решит мою проблему хотя бы в эмуляторе

Попробуйте добавить эти разрешения в свой _AndroidManifest.xml_ :

<_uses-permission i = "6" />
<_uses-permission i = "8" />
<_permission_ i = "10" /> _android: name = "android.permission.ACCESS_COARSE_LOCATION" _
_android: protectionLevel = "подпись" _ />
<_permission_ i = "13" /> _android: name = "android.permission.ACCESS_FINE_LOCATION" _
_android: protectionLevel = "подпись" _ />

Привет, я столкнулся с той же проблемой «тайм-аут запроса». Я пробовал все возможные решения, указанные выше, которые не могли работать для меня, но недавно я нашел один модуль, который преодолевает эту проблему.
https://www.npmjs.com/package/react-native-geolocation-service
Это сработало для меня .....

@vishalTechnoFreek , также существует геолокация с реагированием на родную и перекрестную адресацию .

Он полностью совместим с текущей геолокацией RN, но с использованием нового API Google. С этим API вам не нужно беспокоиться о том, какой режим использовать, служба автоматически определяет лучший вариант.

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

В моем случае то, что упомянул @manurana о (загрузке и) открытии приложения Google Maps, а затем возвращении на Expo, помогло.

Я работаю с Genymotion и Android 5.

Кроме того, для пользователей Genymotion для правильного чтения позиции необходимо открыть окно карты Genymotion; в противном случае это будет работать, но с местоположением Geny по умолчанию

установка enableHighAccuracy на true или false для меня не работает.
опускание третьего аргумента для getCurrentPosition для использования значений по умолчанию из собственного модуля работает для меня.

Спасатель 👍 это сработало для меня.

Я ребята,
Я столкнулся с той же ошибкой, но после нескольких попыток с моими коллегами мы замечаем что-то странное (но нормальное, если вы думаете о GPS).

Если вы выполняете тесты «внутри вашего офиса» с помощью физического устройства, GPS-локатор может быть нарушен из-за внешних вещей, таких как стены, или по той простой причине, что вы пытаетесь выполнить эту операцию «в помещении», и, как правило, это следует выполнять на открытом воздухе. .

Что ж, после этого мы выходим из нашего офиса, мы повторно выполняем тесты, и устройство отвечает как запланировано (мы не получили ошибку Request timed out).

Мое предложение: попробуйте геолокацию, используя для параметра "enableHighAccuracy" значение true, если это не удается (в офисе это может не удастся), повторите попытку с false, это должно сработать, в моем случае это так.

Надеюсь, это поможет.

У меня та же проблема, но установка enableHighAccuracy на false для меня не работает. Так что это решение, которое кажется идеальным, мне не подходит.

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

import retry from 'retry'
if (granted === PermissionsAndroid.RESULTS.GRANTED) {
  const operation = retry.operation({ retries: 2 });
  operation.attempt(() => {
    navigator.geolocation.getCurrentPosition(
      (response) => { resolve(response) },
      (error) => {
        if (operation.retry(error)) {
          return;
        }
        reject(error)
     },
     { timeout: 2000, enableHighAccuracy: true, maximumAge: 100 },
   );
 })
} else {
  reject(new Error('Location access denied'))
}

https://www.npmjs.com/package/react-native-geolocation-service
Этот пакет решил для меня проблему.
Практически все вышеперечисленные предложения у меня не сработали.

Привет, Гость, я разгадываю загадку, случилось так, что когда мы запрашиваем местоположение в первый раз и используем "maximunAge", у нас не кэшируется предыдущее местоположение, поэтому есть ошибка, убедитесь, что в самый первый раз, когда мы запрашиваем местоположение без "максимального возраста"

простой ответ - выйти с того места, где вы находитесь, и отправиться в открытое пространство, а затем повторить попытку.

Это простая наука.

На услуги GPS влияют толстые стены и автомобили.

Это сработало для меня. Не нужно ничего редактировать !!!

В моем случае удаление maximumAge решило проблему.

Большое спасибо! Работа!

Привет,
Ни одно из решений у меня не работает.
Я использую navigator.geolocation, используя только {enableHighAccuracy: false} в качестве третьего параметра.
В iOS он работает нормально, а в Android не работает на некоторых устройствах.
Я проверил Android 7, 8, 9. Он не работает в телефоне Lenovo с Android 7. Но работает с другими устройствами с Android 7.

У кого-нибудь есть обходной путь для решения этой проблемы.
Любое предложение заметно.

благодаря

@akhilsanker может попробовать библиотеку, например, -native-fused-location

Привет @reyalpsirc!

Спасибо за ответ. Очень признателен за ваше время.
В iOS нет проблем, и он отлично работает на большинстве устройств Android. Я ограничен во времени, и, как вы предложили, будет сложно использовать новую библиотеку.
Есть ли у вас другой способ решения этой проблемы?
Спасибо за ваше время.

Спасибо.

Извините, @akhilsanker , все, что я сделал, это использовал React Native Geolocation для iOS и FusedLocation для Android.

установка maximumAge:0 сработала для меня:
{ enableHighAccuracy: true, timeout: 60000, maximumAge:0 }
может быть, @GersonM прав ...

Модуль геолокации удален из RN в мастере и не будет доступен в версии 0.60. Используйте https://github.com/react-native-community/react-native-geolocation и сообщайте о проблемах там. Спасибо

Это 2019 год, попробовал 3 разные локальные библиотеки, ни одна из них не работает для Android. Удивительный.

Это 2019 год, попробовал 3 разные локальные библиотеки, ни одна из них не работает для Android. Удивительный.

React-native-geolocation-service работает нормально.

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

см . комментарий <permission> __ и__ <uses-permission>

https://www.npmjs.com/package/react-native-geolocation-service
Этот пакет решил для меня проблему.
Практически все вышеперечисленные предложения у меня не сработали.

Спасибо!

Была ли эта страница полезной?
0 / 5 - 0 рейтинги