React-native: Androidのジオロケーション「enableHighAccuracy」は常にタイムアウトします

作成日 2016年05月10日  ·  239コメント  ·  ソース: facebook/react-native

Androidアプリの開発中、6.1で実行されているAndroidデバイスでデバッグしている間、geolocationapiは常にメッセージ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

最も参考になるコメント

enableHighAccuracytrueまたはfalseいずれかに設定しても機能しません。
ネイティブモジュールのデフォルト値を使用するためにgetCurrentPosition番目の引数を省略すると、うまくいきます。

全てのコメント239件

@ acapop77権限が次を使用して有効になっていることにも言及するのを忘れました:

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

RN 0.25.1でも同じ問題がありますが、違いは、高精度と低精度で問題が続くことです。 ついに私はそれを機能させる何かを見つけましたが、解決策ではありません。

これが私のために働いたものです-あなたがストックアンドロイドavdを使用すると仮定して-エミュレーター:

  1. Androidエミュレーターデバイスで、(実際のデバイスの場合と同様に)[設定]> [場所]に移動し、[モード]を[高精度]に設定します。
  2. アプリケーションに戻ります。
  3. 「拡張コントロール」ボタン(「...」で表されます)を押します。 次の[場所]セクションには、GPSデータポイントデータと下の[送信]ボタンが表示されます。 「送信」をクリックして、拡張コントロールメニューを閉じるだけです。
  4. アプリケーションをリロードします。

これは私にとってはうまくいきます-「1回限りのベース」で。 アプリをリロードするたびに、3〜4ステップを繰り返す必要があります。 しかし、少なくともこの方法で、Geolocationを機能させ、タイムアウトエラーは発生しません。

0.24でも同様のことが発生しています。 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />がAndroidManifest.xmlにあるのに、次のような赤いエラーが表示されます。

「アプリに場所にアクセスする権限がないようです。次の行を追加してください...」

私はエミュレーターを使用しておらず、代わりにデバイスに直接ビルドしています。

編集-これは0.25.1でも発生します

@ acapop77 @rossthedevignerまた、 SamsungS6デバイスに直接ビルドしています。

@Findiglayここでも同じです。 手動で.apkをインストールしようとしても、エラーが発生しました。

パーミッションマニフェストをループしてandroid.permission.ACCESS_FINE_LOCATIONが有効になっているかどうかを確認する回避策を試しています。

navigator.geolocation == undefinedを持っている人はいますか?

現在、デバイスでこの問題が発生しています。

ここで報告されているさまざまな問題があります。 すべてがenableHighAccuracyの特定の問題に関連しているかどうかはわかりません。

Android開発の経験はありませんが、LocationModule.javaを編集してLocationOptions boolean highAccuracy = true;をハードコーディングして再構築すると、現在地が正しく返されることがわかりました。 結果がReact-Nativegeolocation APIの設定enableHighAccuracy: falseで受け取った結果と異なるかどうかはわかりませんが、これが高精度モードで動作していると想定しても安全です。

これは、Geolocation APIとLocationModuleの間のブリッジでバグが発生していることを意味しますか?

同じ問題が発生しています。 @Findiglayが提案したのと同じことを数回行いましたが、タイムアウトしか発生しませんでした。

これが実際のデバイスで発生する理由はありますか? :(

同じ問題を抱えています。 私は現在、RN 0.25.1を使用して、実際のデバイスでアプリを実行しています。

必要なAndroid権限を権限マニフェストにすでに追加していることを追加する必要があります。 しかし、それでもタイムアウトします。

回避策として、Androidの設定で[モックの場所を許可する]を有効にし、gpsをモックするアプリをインストールしました(ストアで偽のgpsを探してください)。 少なくともこれが修正されるまで、開発はブロックされません

みんな、
私は同じエラーに直面していましたが、同僚と何度か再試行した後、何か奇妙なことに気づきました(ただし、GPSについては正常です)。

物理デバイスを使用して「オフィス内」でテストを実行する場合、GPSロケーターは壁などの外部のもの、またはこの操作を「屋内」で実行しようとしているという単純な理由によって妨害される可能性があり、通常、これは屋外で実行する必要があります。

さて、この後、私たちはオフィスから出て、テストを再実行し、デバイスは計画どおりに応答します(リクエストのタイムアウトエラーは受信されません)。

私の提案は次のとおりです。trueに設定された「enableHighAccuracy」を使用してジオロケーションを試してください。これが失敗した場合(オフィスでは失敗する可能性があります)、falseで再試行します。私の場合は機能するはずです。

これがお役に立てば幸いです。

+1

enableHighAccuracytrueまたは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}
                );  

enableHighAccuracytrueまたはfalseいずれかに設定しても機能しません。
ネイティブモジュールのデフォルト値を使用するためにgetCurrentPosition番目の引数を省略すると、うまくいきます。

LGE Nexus 5(Android 6.0)でも同じ問題が発生します。
Android 5.1.1および4.3では、このような問題はありません。
Android 6.0のエミュレーターでは、このような問題はありません。
boolean highAccuracy = false;は機能しません。
RN0.28.0。

やあみんな、私は一時的な修正を見つけました-このパッケージhttps://github.com/lucasferreira/react-native-android-permissions

これに対する更新または修正はありますか? シミュレーターと5.0より前のデバイスではすべて正常に動作し、その後はタイムアウトするだけです。すでに利用可能なアプリの修正がどうしても必要です。

+1

この問題は、デバイスのlocationMode設定の影響を受けます。 ロケーションモードが高精度またはデバイスのみに設定されている場合、ジオロケーションはタイムアウトします。 ロケーションモードがバッテリー節約に設定されている場合は正しく機能します

私は同じ問題を抱えていました、私はパントを取り、3番目の引数を削除しました。 そして、その現在機能しています。

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

私はこれが関連していると思います//productpains.com/post/react-native/add-android-m-permissions-model-support

正しい?

いいえ、それはロケーションタイムアウトの問題ではありませんでした

はい、3番目の引数を削除することは修正のようです。

まだ完全なデバイステストは行っていませんが、デバイスモードが高精度またはデバイスのみに設定されているAndroidバージョン22では、設定に関係なく3番目の引数が含まれていると、場所がタイムアウトする原因になるようです。 Androidバージョン23には影響しないようです。

私の側でも同じ経験がありますが、Androidバージョン23はenableHighAccuracyfalse設定されている場合にのみ3番目の引数で機能します( trueは場所をタイムアウトさせます)。 また、Androidバージョン22、21、20、19でテストされており、3番目の引数が存在すると、すべての場合にタイムアウトが発生するようです。 その引数を削除することが唯一の信頼できる修正のようです。

3番目の引数を削除すると、タイムアウトが完了するまで待つのではなく、「ロケーションリクエストがタイムアウトしました」というポップアップがすぐに表示されます。 enableHighAccuracyをfalseに設定しても、機能しません。

私のエミュレーターでは、ロケーションは、エミュレーター設定を開いてロケーションを送信した場合にのみ使用できます(スクリーンショットを確認してください)。

自動的に取得する方法はありますか?

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

私の場合、 enableHighAccuracyfalseすると問題が解決しました。

ここでエミュレータとデバイスの両方で同じ問題が発生し、enableHighAccuracyに対してtrueとfalseの両方で試行されました

「未定義はオブジェクトではありません( 'navigator.geolocation.getCurrentPosition'を評価しています)」と完全に取得します。

trueを返したif(navigator)をチェックしてみましたが、
しかし、if(navigator.geolocation)がfalseを返しました。

また、Android 5.1 OnePlusOneのデバイスでこれを実行します。 開発者モードが有効で、AndroidManifestの権限が含まれ、モックの場所のオン/オフ、すべて。

また、デバイスのアプリとMacの出力フォルダーを削除したにもかかわらず、場所のアクセス許可を求められなかったようです🤔。

React Realmを使用しているため、実際にリモートでデバッグすることもできません。そのため、Chromeリモートデバッガーを裏返しにするという大きな問題があります。

私にも同様の問題があります。アプリが常にタイムアウトするとは限りませんが、RNを使用するアプリのジオロケーションが非常に悪い場合は常に、他のジオロケーションアプリが正常に機能するため、多くの場合にタイムアウトします。
私はRN0.32を使用していますが、すべてのバージョンで同じ問題が発生しました。何らかの理由で、RNのジオロケーションは非常に奇妙で貧弱です(少なくともAndroidでは)

ここでも同じ問題があり、実際のデバイスでテストしています。

これに遭遇すると、これは本当に迷惑です:/

Android6.0でも同じ問題が発生しています。

+1

解決策は、3番目のパラメーターを追加せず、Androidバージョン> = 23で上記のリンクされたライブラリ(https://github.com/lucasferreira/react-native-android-permissions)を使用してAndroidMのアクセス許可を要求することであることがわかりました。

発見されたばかりのPermissionsAndroidがRNに追加されました。 したがって、これを使用して、Android> = 23の場合にリクエストします

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

しかし、私は私のデバイスにAndroid5.1.1を持っています。 このv。Androidでは、Geolocationは正常に機能する必要がありますね。

23は6.0以降です。 また、すべてで機能するために、3番目のパラメーターを追加する必要がないこともわかりました。

私はこれをうまく機能させることができましたが、あなたにとっては違うかもしれません。 RNの新しいバージョン(私のものは0.32.1)には、MainApplication.java(MainActivity.javaのほか)というファイルが含まれています。 React Native Mapbox GL Docsには、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位置に強制するにはどうすればよいですか?

これは腹立たしいです= /

過去数週間、Genymotion AndroidエミュレーターでgetCurrentPosition使用していましたが、現在は再び失敗しています。

GenymotionのGPSウィジェットを使用して場所を設定しています。 エミュレータにGoogleマップをインストールしましたが、Googleマップで現在地を正しく読み取ることができます。

私は必要なすべての権限を持っており、 @ sattamanが提案したようなPermissionsAndroidモジュールも使用しています。 ある日は機能し、次の日は機能しないという点で、動作は非決定論的であるように思われます。

私はRN0.31を使用しており、3番目のパラメーターを削除してもうまくいきました。 実際のデバイス、Nexus 5X、Android6。

RN 0.34.1でも同じ問題がありますが、3番目のパラメーターを削除すると修正できます
enableHighAccuracyをfalseに設定しても、この問題は解決しません

RN 0.32で私と同じ問題が発生し、Android 22および23で試してみましたが、

enableHighAccuracyをtrueまたはfalseに設定しても、機能しません
3番目のパラメータを削除すると、すぐに「ロケーションリクエストタイムアウト」が発生します
ただし、デバイスを再起動すると機能しますが、しばらくすると壊れます。

今、ユーザーの場所を取得するには、これを使用します:
https://github.com/mauron85/react-native-background-geolocation

@acondenseロケーション機能を実行していないように見えるため、background-geolocationのコードをどこに設定しますか

Android23および24のRN0.35でも同じ問題が発生しましたが、Android22では正常に機能します。
これは、Android6.0ランタイム権限システムに関連している可能性があります。
http://stackoverflow.com/questions/32224534/access-fine-location-permission-error-emulator-only

私はこの問題を回避するためにこのライブラリを使用していますが、問題なく動作します。
https://github.com/yonahforst/react-native-permissions

3番目のパラメーターを削除すると、私も修正されました💯💯💯

3番目のパラメータの削除は機能しました👍

誰もが話しているパラメータ、メソッドパラメータ、またはオプションオブジェクトの3番目のパラメータは最初からそれほど明確ではありませんでした。

正確には、これはgetCurrentPositionメソッドの3番目のパラメーターであり、最後に次のようになります。

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(Android用のJavaコードでネイティブに実装)で使用しましたか?

enableHighAccuracy: trueはAndroidではまったく機能しません

このコードを使用して、Android6の位置情報の許可を確認しています

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エラーが防止されますか?

これに対する修正はまだありませんか? 私はこのスレッドで絶対にすべてを試しましたが、何も機能しません。即座に、または数秒後に、常にタイムアウトエラーになります。

ここでも同じですが、 @ sattamanのコメントでデバイスの修正が行われました(ロケーションモードをバッテリー節約に設定)が、アプリのユーザーにそのようなことを行うように指示する方法!

enableHighAccuracy無効にするか、3番目のパラメーターを省略するとうまくいきます。 ただし、場所はまだかなり正確に見えます。
iOSでは問題ありません。 (RN 0.39)

RN0.40同じ問題。 3番目のパラメーターを削除すると解決します。
(ただし、高精度は得られません)

同じ問題、3番目のパラメータを削除すると解決します。

エミュレーターでは、 enableHighAccuracy: trueを設定し、ロケーションモードが高精度に設定されていることを確認する必要があります。 それ以外の場合はタイムアウトします。 どのような状況でも、エミュレーターでバッテリーを節約できません。

デバイスでは、オプションをまったく渡しません。 私のようにこれに苦労している場合は、実際のデバイスで試してみることをお勧めします。 Pixel C(Android 7.1)とNote 4(Android 6.0.1)でテストしました

iOSでは、高精度をTrueに設定する必要がありました。 この時点で私のgetlocation関数を想像できます...

私はRN0.40に取り組んでいて、実際のデバイス(Nexus 5)を使用していますが、まだ問題があります。

私はこの号のすべてのコメントから何でも試しました。

ここに記載されていない他の方法で問題を解決した人はいますか?

//更新:

navigator.geolocation.watchPosition機能しているようです。 したがって、navigator.geolocation.getCurrentPositionが修正されるまでは、これを使用することが回避策になる可能性があります。

今のところ、高精度を使用することが重要であるため、ネイティブモジュールを作成し、ネイティブAPIと直接対話します。
RNのジオロケーションAPIは今のところ不安定なようです。

私のプロジェクトでは、いくつかのルールを理解しています。

  1. Androidデバイスの設定-ロケーションだけで、あなたは、デバイス設定しないでくださいされてenableHighAccuracy: true getCurrentPositionへ
  2. 設定-場所の高精度で、あなたが設定する必要がありますenableHighAccuracy: true getCurrentPositionへ

これらの2つのルールに従って、私のプロジェクトでは問題なく動作します

@kimochgテストの設定は何ですか?

私のテストでは、ロケーションのデバイス設定をデバイスのみに設定すると、ジオロケーションenableHighAccuracyが何であるかに関係なく、毎回タイムアウトになります。

デバイス設定を高精度に設定すると、 enableHighAccuracyが何に設定されているかに関係なく、有効な場所が得られます。

編集
私にとって、Geolocationは、 enableHighAccuracy: falseとデバイスの場所の設定を高精度に設定した場合にのみ、新しい場所を取得するようです。 enableHighAccuracy: trueすると、キャッシュされた場所をフェッチしますが、新しいフェッチはタイムアウトします。

これはReactNative 0.40で、Android7.1.1を実行しているNexus5Xでテストしています

@kulmajabaをReactNative 0.40として、Android7.1.1を実行している
しかし、ここではAndroidエミュレーターであり、実際のAndroidデバイスではありません

エミュレーターを使用している場合、
エミュレータの右バーにある[拡張コントロール]ボタンをクリックして、GPSデータを送信しますか?
(「...」ボタン)

@kimochgわかりました。 テストには実際のデバイスを使用しています。次回プロジェクトに取り組むときは、エミュレーターの動作をそれと比較する必要があります。

@Ascendance @ Daniel-ltwこのスレッドのすべての解決策に従いましたが、恐ろしいnavigator.geolocationの未定義の問題を解決できませんでした。 次に、 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に設定すると、常に新しい位置を取得するように強制されます。

タイムアウトの問題に苦しんでいる他の人のために、 @ RoBYCoNTeが上で指摘したように、特に屋内の場合、高精度のGPS通話に時間がかかることがあることを読みました(1分以上)。

最初から高精度の通話に依存するのは最善ではないかもしれません。最初に低精度の通話を取得し、バックグラウンドで高精度の通話を開始する方がよいでしょう。 もちろん、これはあなたのニーズに依存します、1分+電話を待つことはすべての人のためではありません:)

また、RNがジオロケーションのWeb仕様を拡張していることを考えると、適切な名前のhttp://stackoverflow.com/questions/3752383/geolocation-is-so-slow-what-im-のように、それに関連する回答をWeb上で見つけることができます。

誰かが固溶体を持っていますか? 一部のユーザーは、登録の一部でジオロケーションを設定する必要があるため、私のアプリに登録することさえできません。 この問題は一部のAndroidデバイスでのみ発生しており、3番目のパラメーターを使用していません。 私を狂わせる。 私のアプリに1つ星のレビューを自動的に与えるだけで、地理的位置を設定できなくなります。 >。>

@booboothefoolは、optionsパラメーターを使用して、highAccuracyを次のように渡します。
false。 その方が結果ははるかに高速です。

月、2017年2月20日には、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

これらがデフォルトのオプションのようです。 enableHighAccuracy: falsetimeout: Infinityなので、3番目のパラメーターを指定しない場合は、すでにそれを行っているべきではありませんか?

@booboothefoolあなたはこのスレッドが混乱していることについて正しいです。 私の知る限り、optionsパラメーターを省略している人は、設定内の他の何かが物事に影響を与えていたため、問題を解決した可能性があります。

enableHighAccuracyをtrueまたはfalseに設定しても機能しません。
getCurrentPositionの3番目の引数を省略して、ネイティブモジュールのデフォルト値を使用することは私にとってはうまくいきます。

したがって、問題はtimeout可能性があります。 ジオロケーションには多くの要因が関係しているので、クラッシュしている人々からできるだけ多くの情報を入手することが役立ちます。

すでにオプションが削除されていて、RNが実際にデフォルトでwebと同じパラメータになっている場合は、正常に機能しているはずです。 それでも問題が解決しない場合は、ユーザーが場所のアクセス許可を有効にしているかどうかを確認してください(アプリで確認しています)。

ねえ@greyvugrin

権限についての大きなヒントをありがとう。 それが私が欠けていたものだと思います。 https://github.com/lucasferreira/react-native-android-permissions(https://facebook.github.io/react-native/docs/permissionsandroid.htmlよりもこのAPIの方が好きです)を実装した後、 enableHighAccuracy: falseを指定しますtimeoutを設定すると、今では誰にとってもうまくいくようです。

私のアプリはGooglePlayストアの1つ星から、ジオロケーションの問題でみんながゴミ箱に入れて3.6つ星になりました。 👍

@booboothefoolそれはとても素晴らしいニュースです、それを聞いてうれしいです!!!

ここで提案されているすべてのアプローチを試しました。 getCurrentPositionから何も取得できませんが、Androidのシミュレーターまたはデバイスでタイムアウトします。 watchPosition機能しますが、実際にはユーザーに最適なUXを提供しません。ユーザーの位置情報が必要なのは1回だけで、GPSでバッテリーを浪費し続ける必要はありません。

私はもう試した:

  • enableHighAccuracy:false
  • オプション引数の削除
  • 許可を確認して要求するandroid> = 23
  • マニフェストのFINEとCOARSEの両方。

getCurrentPositionのタイムアウトを変更するものはありません

これは、Android Studio Emulatorの開発者が、将来機会があれば修正/実装する必要があるものです。

ただし、それまでの間...大きなGPXトレイルファイルをインポートして、「1倍」の速度で再生させることができます。 ここからGPXを取得しました...
...このファイルは「5x」の速度で約8分間持続したため、「1x」の速度では約40分間持続する必要があります。

それ(または別のおそらくより大きなGPXファイル)を[...]拡張オプション->場所(右下のGPS / KMLボタンをロード)にロードし、再生ボタンを押してからウィンドウを閉じます...再生を続けますそれが終わりに達するまで。 残念ながら、自動リピートはありません。AndroidStudioプログラマー向けのもう1つの機能リクエストです。 :-)

それは真実ではない。 実際のデバイスでも同じタイムアウトが発生します。
getCurrentPositionは常にタイムアウトします。 時計は正常に動作します。 Z5、Nexus5Xのテスト
&Pixel、getCurrentPositionの最初の呼び出しですべてタイムアウト。

2017年3月4日土曜日、19:49 Deen Foxx、 notifications @ github.comは次のように書いています。

これは、Android StudioEmulatorの開発者がやろうとしていることです。
将来、機会があれば修正/実装する必要があります。

ただし、それまでの間...大きなGPXトレイルファイルをインポートして、
「1倍」の速度で再生します。 ここからGPXを取得しました... ExpertGPS.com->
ca-trails.gpx
https://www.expertgps.com/data/downloading.asp?file=ca/ca-trails.gpx
...このファイルは「5x」の速度で約8分間続いたので、「1x」の速度で
約40分続く必要があります。

それ(または別のおそらくより大きなGPXファイル)を[...]拡張にロードします
[オプション]-> [場所](右下にある[GPS / KMLを読み込む]ボタン)、再生ボタンを押す
ボタンをクリックし、ウィンドウを閉じます...それが当たるまで再生を続けます
終わり。 残念ながら、自動リピートはありません。Androidのもう1つの機能リクエストです。
スタジオプログラマー。 :-)


あなたがコメントしたのであなたはこれを受け取っています。
このメールに直接返信し、GitHubで表示してください
https://github.com/facebook/react-native/issues/7495#issuecomment-284172310
またはスレッドをミュートします
https://github.com/notifications/unsubscribe-auth/AACQ6AoZYXJ02DCmevcLmmF3tuOdg_SEks5ribJHgaJpZM4Ibete

getCurrentLocationへの3番目のパラメーターを削除すると、エミュレーターで機能しました。

{
   timeout: 20000,
    maximumAge: 1000
}

3パスの可能性をコーディングしました。 多分少しやり過ぎかもしれませんが、まあ。 これがコードスニペット(コメント付き)です...

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;

私はこれをローカルの開発エミュレーターでのみテストし、本番環境ではテストしていません。 これがお役に立てば幸いです。

私はちょうど考えていました... roughError呼び出しがオプションのないバージョンを使用するだけであれば、おそらく2パスとして完全に機能します...

  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」の試行が他の非同期の「大まかな」結果よりも前に返され(特にタイムアウトがInfinityの場合)、失われたり上書きされたりする可能性がわずかにあることはわかっていますが、疑わしいです。 本当に慎重になりたい場合は、その特定のケースをテストするためにコードを変更できます。

これに関する進展はありますか?

アレックス、このスレッドにはいくつかの解決策があります。 何を試しましたか? それ
詳細がわかったら、新しいチケットを作成する価値があるかもしれません。
上記の解決策のいずれも機能しない場合、このスレッドは非常に長くなります。

金、2017年3月17日には、10:29アレックスSinelnikov [email protected]
書きました:

これに関する進展はありますか?


あなたが言及されたのであなたはこれを受け取っています。
このメールに直接返信し、GitHubで表示してください
https://github.com/facebook/react-native/issues/7495#issuecomment-287419487
またはスレッドをミュートします
https://github.com/notifications/unsubscribe-auth/ADJE_HLDGQEplAduqm3Zx5L74dv99mnhks5rmsLjgaJpZM4Ibete

あなたのような。 上記の提案はどれも機能しません。 私にとっての唯一の解決策
Androidで場所を取得するには、時計を使用し、UIを更新して通知します
アプリの機能がlocatで応答した場合に何が起こっているかをユーザーに知らせます。 しないでください
getCurrentPositionに煩わされると、10個の実際のテストのいずれでも機能しません
さまざまなAndroidバージョン4以降を実行しているデバイス

2017年3月17日金曜日、17:48 Gray Vugrin、 notifications @ github.comは次のように書いています。

アレックス、このスレッドにはいくつかの解決策があります。 何を試しましたか? それ
詳細がわかったら、新しいチケットを作成する価値があるかもしれません。
上記の解決策のいずれも機能しない場合、このスレッドは非常に長くなります。

金、2017年3月17日には、10:29アレックスSinelnikov [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'では、タイムアウトがスローされるため、ロケーションダイアログをトリガーしてGPSを有効にできます。 しかし今、私は「getCurrentPosition」から移動します

編集:
私はすべてのバリエーションを試しましたが、問題がどこにあるかがわかりました。 私は、remove第三のparamsSET場所モードならば、それは、高精度またはバッテリー節約のいずれかに作業することができます。 それ以外の場合は、機能していません。 ベンダーごとにこのメニューにアクセスする方法が異なるため、デバイスのみではなく高精度またはバッテリー節約を選択するようにユーザーに指示する方法がわかりません。

3番目のパラメータにenableHighAccuracy: falseを追加するという上記のコメントがありますが、高精度、バッテリー節約、またはデバイスのみのオプションでは機能しませんでした。 ジオロケーションの3番目のパラメータは実際のデバイスには役に立たないと思います。

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

月、2017年4月3日には午後5時34分にナイジェルNindoの[email protected]書きました:

@ L3V147H4Nhttps ://github.com/L3V147H4NAndroidで直接。 がある
これに使用できるライブラリがいくつかありますが、ほとんどのライブラリを見てきました
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に設定し、3番目の引数を削除してみましたが、AndroidManifestにCOURSEとFINEの両方の場所のアクセス許可が追加されました。

Android SDK 23、ビルドツール25.0.0
React 16.0.0-alpha.6
RN 0.43.3

ご協力いただきありがとうございます!

スレッドダグラスへようこそ、残念ながらgetCurrentPositionはそうではありません
あなたが発見したようにAndroidで信頼できます。
スレッドの早い段階で使用しているソリューションのいくつかを見てください
代わりにwatchPosition

@raldredに感謝します。
watchPositionは機能しているようです、助けてくれてありがとう!

@douglaswissettどういたしまして。 うまくいけば、すぐにgetCurrentPosition堅牢なソリューションがあります。

私が使用することができますwatchPositionその後、 clearWatch直後地理位置を取得しますか? clearWatchcomponentDidMountしかclearWatchないため、これを行うのに問題があります

@pewhはい。 それが私がしていることです。
また、 navigator.geolocation.clearWatchはいつでも呼び出すことができます。
watchPositionへの呼び出しによって返されるコンポーネントのwatchIDへの参照を保持するだけです

https://facebook.github.io/react-native/docs/geolocation.htmlで読んだドキュメントから、 watchPositionコールバック内でthis.watchIDを取得する方法がわかりません。 私のユースケースは、新しい値を受け取った直後にclearWatchトリガーすることです。

@pewhこれが私の実装です。 完璧ではありませんが、機能します。
https://gist.github.com/raldred/b08cf60712eb87d81f05437444dff4ae

@raldredはあなたの解決策を試しましたが、他の人の解決策は何も機能しません

これについての解決策はありますか? ここですべてを試してみてください。何も機能しないようです。助けてください。 スニペットなどを共有できる場合

@ gerard0315これを解決するのに成功しましたか?

それは私にとって実際のAndroid携帯で動作するようです

iOS用のOutlookを入手するhttps://aka.ms/o0ukef


差出人:ホルヘアルモナシッド[email protected]
送信日:2017年5月9日火曜日14:29:56
宛先:facebook / react-native
Cc:Ujwal Setlur; コメント
件名:Re:[facebook / react-native] Androidのジオロケーション 'enableHighAccuracy'は常にタイムアウトします(#7495)

これについての解決策はありますか? ここですべてを試してみてください。何も機能しないようです。助けてください。 スニペットなどを共有できる場合


あなたがコメントしたのであなたはこれを受け取っています。
このメールに直接返信するか、GitHub https://github.com/facebook/react-native/issues/7495#issuecomment-300307037で表示するか、スレッドをミュートしますhttps://github.com/notifications/unsubscribe-auth/ AFkMXWcokXoYDpsw28UaiUSDtCvRpE3Rks5r4NrUgaJpZM4Ibete

実行中の実際のデバイスで機能するスニペットをすでに共有しています
Android4-7。

2017年5月9日火曜日、22:29 Jorge Almonacid、 notifications @ github.comは次のように書いています。

これについての解決策はありますか? ここですべてを試してみてください。何も機能しないようです。
助けてください! スニペットなどを共有できる場合


あなたが言及されたのであなたはこれを受け取っています。
このメールに直接返信し、GitHubで表示してください
https://github.com/facebook/react-native/issues/7495#issuecomment-300307037
またはスレッドをミュートします
https://github.com/notifications/unsubscribe-auth/AACQ6HSlN8YS_jE6NY9w2vuk7Hv4Wjwfks5r4NrSgaJpZM4Ibete

現在、すべてのパラメーター(経度、緯度、高度)を同時に変更した場合にのみ、(Androidエミュレーターで)更新を取得できます。 1つまたは2つだけ変更した場合- 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?)

実際には、超正確な位置が必要な場合は、両方/すべてのプロバイダーが必要です。 次に、精度とタイムスタンプを比較し、より正確で新鮮な場所を受け入れます。

これを行うには2つの方法があります。

React:

2つのwatchID変数-> watchIDGPSwatchIDNetworkます。 次に、2つのウォッチャーをセットアップします。1つはenableHighAccuracy=trueenableHighAccuracy=falseこれによりGPSプロバイダーとネットワークプロバイダーの両方が返されます(ネットワークは屋内でより正確になります)

Reactの方法の問題は、JSスレッドでこれを実行していることです。 これにより、リソースが不足しているデバイスでアプリがフリーズする可能性があります。 それにもかかわらず、それは機能します。

ネイティブの場合:

LocationModule.javaをカスタムモジュールとして書き直して、選択したプロバイダーを処理し、プロバイダーがどのプロバイダーであるかに関係なく、場所をmLocationListener報告することをお勧めします。 React-Nativeがこの「問題」を修正するまで。

@ralred 、スニペットをありがとう、しかしAndroidPermissionsオブジェクトは何ですか?

私はすべての解決策を試しましたが、すべて失敗しました...。
突然私のアプリには地図モジュール、百度地図、グーグルマップのような中国の地図(map.baidu.com)があり、マーカーと現在地を取得できることを思い出しました!!! いよいよ出来ました〜

github、react-native-baidu-mapで検索できます

インポート{
MapView、//マップビュー(私は必要ありません)
MapTypes、// 2Dまたは3Dとして入力します(必要ありません)
Geolocation //場所に関するAPI(必要)
} from'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は完全に機能します。 すでにRNv0.45.0(現在0.44.0を使用しています)ですが、まだ解決されていませんか? いい加減にして!

@rexlow
何もうまく機能しません。バージョン0.44を使用しています。 v0.45にアップデートしようとしましたか?

@VietDucPhanちょうど今、完全にランダムに機能しました😓。 まだ0.44.0

@rexlowああ、いいね。 今、私は自分を攻撃するために運が必要なだけです。

オプション構造を削除してみましたか? それが私のために働いた唯一のことです。

iOS用のOutlookを入手するhttps://aka.ms/o0ukef


投稿者:viet_duc_phan [email protected]
送信日:2017年6月18日日曜日午後11時26分15秒
宛先:facebook / react-native
Cc:Ujwal Setlur; コメント
件名:Re:[facebook / react-native] Androidのジオロケーション 'enableHighAccuracy'は常にタイムアウトします(#7495)

@rexlowhttps ://github.com/rexlowおやおや。 今、私は自分を攻撃するために運が必要なだけです。


あなたがコメントしたのであなたはこれを受け取っています。
このメールに直接返信するか、GitHub https://github.com/facebook/react-native/issues/7495#issuecomment-309349488で表示するか、スレッドをミュートしますhttps://github.com/notifications/unsubscribe-auth/ AFkMXYI2vukJgcTLkBeNdXdclgFbgo1sks5sFhSHgaJpZM4Ibete

@rexlow @ ujwal-setlur運が私を襲ったことを皆さんに知らせたいだけです。 それは機能していて、完全にランダムです。 何も変更しませんでした。

実際のデバイスで試しましたか?

2017年6月20日火曜日、19:18 viet_duc_phan、 notifications @ github.comは次のように書いています。

@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問題を再現する例を設定できますか?

2017年6月20日火曜日、20:52 viet_duc_phan、 notifications @ github.comは次のように書いています。

@raldredhttps ://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は正しいです、 FusedAPIを使用する方がよいでしょう。

私はreact-native-fused-locationがAndroidで位置情報をリクエストするのに本当に役立つ

@raldredこんにちは、申し訳ありませんが、最近メールをチェックしていませんが、再び機能していません。

@ derman232アプリがバックグラウンドに移行したときにreact-native-fused-locationは機能しますか?

@rexlow申し訳ありませんが、その答えはわかりません。アプリに必要な機能ではありません。

この問題をどのように解決したかについての私の意見を述べるだけです:

  • 問題は、android> = 6.0では実行時に権限を付与する必要があることです
  • このstackoverflowの質問には詳細があります:質問
  • ReactNativeのPermissionsAndroidモジュールを使用して権限を取得しました

これですべてが機能します。

こんにちは、
何も機能しません。 私はすべてを試しました。
お知らせ下さい。
THX

私は本当に人々のためにこれを解決するのを手伝いたいです。
ロケーションライブを使用する3つのReactNativeアプリがあります。 GingerbreadからNougatまでを実行している30以上の実際のAndroidデバイスでQAを行いました。
ユーザーテスト全体を通してすべて正常に機能します。それ以来、ライブユーザーからの問題の報告はありません。

@adriancucoは、実装とマニフェストを共有して、さらに支援できるようにしてください。

  • RNのバージョン?
  • どのAndroidバージョンで問題が発生していますか?
  • どのデバイスで問題が発生していますか?

実装やデバイス構成には複雑さが伴います。それが何であるかを理解することが重要です。

raldred、

ごめんなさい。 私のせい!
自殺する前に、数日前に読んだ携帯電話の位置設定を確認することにしました。GPSが有効になっているだけです。 ;(
だから私はGPS、Wifiなどすべてを有効にしました、そして今それはうまく働いています。
心から感謝する。
どうもありがとう

この問題に関する更新はありますか?

まだ解決策はありません。


投稿者:adriancuco [email protected]
送信日:2017年7月4日火曜日14:44:28
宛先:facebook / react-native
Cc:マロウエンさやり; コメント
件名:Re:[facebook / react-native] Androidのジオロケーション 'enableHighAccuracy'は常にタイムアウトします(#7495)

raldred、

ごめんなさい。 私のせい!
自殺する前に、数日前に読んだ携帯電話の位置設定を確認することにしました。GPSが有効になっているだけです。 ;(
だから私はGPS、Wifiなどすべてを有効にしました、そして今それはうまく働いています。
心から感謝する。
どうもありがとう


あなたがコメントしたのであなたはこれを受け取っています。
このメールに直接返信するか、GitHub https://github.com/facebook/react-native/issues/7495#issuecomment-312881724で表示するか、スレッドをミュートしますhttps://github.com/notifications/unsubscribe-auth/ AD79YGcm507EtBxrFHHJkEc-OBvRsjKmks5sKkG7gaJpZM4Ibete

@ m-sayariあなたは私たちに助けるためにもう少し情報を与えるつもりです。

  • RNバージョン
  • Androidビルドターゲットバージョン
  • Androidデバイスバージョン
  • この問題が発生しているデバイス。

それらは、問題の原因となる実装/セットアップに固有のものになります。 以前のように、複数のライブアプリで問題なく動作しています。

ここで解決しました! Android6でRedmi4Aを使用するRN0.45.1。

componentDidMount()内でnavigator.geolocation.getCurrentPosition()を呼び出すときにこの問題が発生しました
getCurrentPositionの代わりに、同じパラメーターを使用してwatchPosition()を呼び出すだけです。

@raldred
RNバージョン
0.46
Androidビルドターゲットバージョン
api 22
Androidデバイスバージョン
6.0.1
この問題が発生しているデバイス。
ネクサス5

3番目のパラメーター「options」を指定せずにgetCurrentLocationを呼び出すと、問題が解決します。 'enableHighAccuracy'をfalseに設定しても機能しません

こんにちは@ raldred

  • RNバージョン:0.47
  • AndroidビルドターゲットバージョンはRNのデフォルトのままです:
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 22
  • Androidデバイスバージョン:6.0.1、7.0
  • この問題が発生しているデバイス:

    • Nexus5とAndroid6.0.1

    • Xiaomi Redmi3SとAndroid6.0.1

    • Android7.0を搭載したAndroidエミュレーター

getCurrentPositionは、デバイス設定で「デバイスのみ」のロケーションモードを設定すると正常に機能しますが、モードが「高精度」に設定すると機能しなくなります( Location request timed out )。

少なくともデバイスのみのモードでgetCurrentPosition機能させるには、3番目のパラメーターを省略する必要があります。

    navigator.geolocation.getCurrentPosition(setLocation);

私はこれを想定しました、そしてそれは私のために働きました、しかし別のケースでテストしていません。
だから私のオプションを見て、 maximumAgeenableHighAccuracyと競合する2つのアイテムがあることがわかりました。これらの2つのオプションは少し異なる方法で同じだと思いますが、最大年齢はあなたを確実にします精度が低くても、設定に基づいて最新のジオロケーションを取得します。 enableHighAccuracyを使用すると、最新かつ正確な位置を取得できます。次のオプションでも同じ問題が発生していました。
{enableHighAccuracy: true, timeout: 20000, maximumAge: 60000} 、最大年齢を削除してenableHighAccuracyを残すまで、これが誰かに役立つことを願っています。

commit 7e11bad86fd21ce1a8408218e66ce85993d9db69でこの問題が修正されるかどうかを試すために、masterからreact-nativeをビルドしました。 残念ながら、以前と同じエラーが発生します。

@olieidelウォッチの位置は実際に機能します。また、デバイスがアプリケーションへの位置情報アクセスを許可していること、および位置情報サービスが有効になっていることを確認してください。

@olieidel次のAPI、 PermissionsAndroidを使用して、アプリが位置情報のアクセス許可にアクセスできるかどうかを確認できます。最初に確認してから、

@mrbarde迅速な返信ありがとうございます!

ああ、一日のデバッグの後、ここに私の発見と関連する回避策があります:
RN 0.46.4、デバイス:Nexus 5X、API 25

ロケーションモード:デバイスのみ

  • getCurrentPositionenableHighAccuracy: true :GPS信号が利用可能な場合に機能し、それ以外の場合はタイムアウト
  • getCurrentPositionenableHighAccuracy: false :機能しません(タイムアウト)。 おそらく位置情報サービスが必要です(位置情報モード!=デバイスのみ)。
  • watchPositionenableHighAccuracy: true :GPS信号が利用可能な場合に機能し、それ以外の場合はタイムアウト
  • watchPositionenableHighAccuracy: false :機能しません

ロケーションモード:高精度

  • getCurrentPositionenableHighAccuracy: true :GPS信号が利用可能な場合に機能し、それ以外の場合はタイムアウトします。 maximumAge設定によっては、古い場所が返される場合があります。
  • getCurrentPositionenableHighAccuracy: false :5〜6秒後に機能します(すでに報告されています)。
  • watchPositionenableHighAccuracy: true :GPS信号が利用可能な場合に機能し、それ以外の場合はタイムアウト
  • watchPositionenableHighAccuracy: false :動作します

概要
ロケーションモードがデバイスのみの場合は、常にGPS信号があることを期待する必要があります。 それ以外の場合はすべて、位置情報サービスが必要です(位置情報モード!=デバイスのみ)。
私はこの場所のAPIのすべての期待される動作であると仮定し、私はちょうどあなたが場所モードに設定し、デバイスを持っている場合は、フラット、しかし、これはデバッグに地獄があるされていない地球の同等のものを発見した==デバイスのみ(エミュレーター、新しく構成されたデバイス)、gps信号が利用できない部屋に座っています。 その場合、タイムアウトのみが発生します。

回避策
このスレッドですでに説明したように、 enableHighAccuracy値が異なる2つのwatchPositionリスナーも使用し、両方の最初の値を取得してから削除します。 このアプローチをいじってみると、両方のリスナーが実際には同じ場所を返すという印象を受けましたが、その日のデバッグ許容度は使い果たされています...
これは、ロケーションモードがデバイスのみではないことを前提としています。

@olieidel確かに、 navigator.geolocationに置き換えるのが適切だと思います。不思議なことに、回避策を使用してプルリクエストを作成し、Facebookがそれを気に入ってくれるかどうかを確認してください。 そして、さらに深く掘り下げてくれてありがとう。

この問題を一貫して再現するのに少し時間がかかりました。

この問題は、位置情報モードが「高精度」に設定され、GPS信号のない屋内にいるときに現在位置APIを使用しているAndroid5.1および6.0を搭載したSamsung電話でのみ発生します。 Oppo電話や、「高精度」モードがオンの場合でも、GPS信号がクリアな屋外でも問題なく動作します。

このスレッドで提案されているソリューションのいくつかをまもなくテストします。

@mrbarde明確にするために:私はnavigator.geolocation 。 :)

@olieidel知っていますが、ドキュメントにはGeolocation Apiではなくnavigator.geolocationが反映されている必要があります。

こんにちは皆さん、Androidでは場所にアクセスする権限があるかもしれませんが、ユーザーはOS設定から場所をオフにしていることに気づきました。 したがって、 navigator.getCurrentPosition()を呼び出すとタイムアウトになります。

これは、2つのメソッドを持つ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に追加し、ここで説明するようにネイティブモジュールを作成する必要があり

こんにちは@nigelnindo実際にはPermissionsAndroidと呼ばれるReactNativeAPIがあります。
ユーザーがアプリの位置情報権限を有効にしていることを確認できます
あなたが指摘したのと同じ問題があったので、それを解決するために私がしたことは次のとおりでした。

最初に、ユーザーがアプリにデバイスの場所へのアクセスを許可しているかどうかを確認しました

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では場所にアクセスする権限があるかもしれませんが、ユーザーはOS設定から場所をオフにしていることに気づきました。

つまり、アプリはPermissionsAndroidで取得した場所にアクセスする権限を持つことができますが、ユーザーがステータスバーのショートカットから、またはSettings -> Location -> Offにアクセスして場所をオフにした場合はgetCurrentPosition()呼び出しは引き続きタイムアウトします。 これは、そのエッジケースに役立ちます。

@nigelnindo yhその場合、私は本当にあなたの解決策を提案します、あなたがこれでPRをすることは可能ですか? つまり、Javaを作成できないため、外部パッケージを使用してこれを処理することで、時間を大幅に節約できます。ただし、学習する時間があればいいのにと思います。 これが正式にReactに含まれている場合は、このような本当にコアなものをサードパーティのライブラリに依存することに懐疑的になり、一貫性について心配します。

23(16-22)の下のbuild.gradle(アプリ)で(Android) TargetSdkVersionを変更してみてください。 そしてそれはうまくいくでしょう!

なぜなら、AndroidManifestファイルからの使用許可が必要だからです。 AndroidManifestファイルは23(16-22)のSDKでのみ呼び出されます。

そして追加することを忘れないでください:

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

maxAgeパラメータを削除しないでください!

そうした場合、GPSモジュールは、衛星から実際の位置を取得するまで、最後にキャッシュされた結果を返します。 実際の位置から遠く離れた別のアプリにキャッシュされている可能性があります。 また、トラックを保存しようとすると、最初のいくつかのポイントが実際の位置から遠く離れた位置を示す場合があります。

@pavelpashkovskyあなたの主張をもらえますか?

@rexlow約1週間前に同じ問題に直面し、このトピックを見つけたので、テストの結果について説明しました。

私は約30回のテストを受けました。 そして、最初の1〜5秒で位置が間違っている3〜4件のケースが発生しました(GPSが衛星信号を検出するまで)

@pavelpashkovsky私も同じ問題に直面しています。 設定にmaximumAge: 1000がありますが。 あなたが言ったように、以前の場所をキャッシュしているように見えます。

@rexlowその通りです。 あなたの場合、GPSは最後の1秒間位置を維持します。

しかし、maximumAge:0で得られた最良の結果は、gpsが結果を保存せず、常に実際の位置を取得しようとする場合(または衛星から位置を取得できない場合はエラー)です。

最大値を削除すると、私がテストしたOppo電話でも問題が発生する可能性があることを確認できます。 非常に古いキャッシュを使用します。

それはずっと私に起こっていました。 アプリ情報->権限でジオロケーション権限がオフになっていることがわかりました。 なぜそれが起こったのだろうかと思いますが、それらの許可は実行時に要求する許可を上書きしているようです。 おそらく他の誰かもこの問題を抱えています

こんにちは(私の英語でごめんなさい)。
maximumAgeを増やすと問題が解決すると思います。

RN 0.48ジオロケーションドキュメント:
Geolocation APIは、Web仕様を拡張します: https

によると:
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チップが衛星に接続しようとします。 @RoBYCoNTeが言ったように、タイムアウト期間(10000ミリ秒)に接続が確立された場合、緯度と経度はエラーなしで返されます: issuecomment-220580494しかし、GPS接続が失敗したかタイムアウトした場合、デバイスはキャッシュされた緯度と経度を、オプション(30000ミリ秒)。 何かが存在する場合は返され、そうでない場合はエラーコード3が返され、件名にタイムアウトエラーが表示されます。

接続のタイムアウト(少なくとも25000ミリ秒)を増やし、maximumAge (少なくとも3600000ミリ秒= 1時間)を

{enableHighAccuracy: true, timeout: 25000, maximumAge: 3600000}は私のために働いた

_emulator config_:タイムアウト期間中に、エミュレータ設定の[場所]メニューから仮想の場所情報(緯度と経度)を送信する必要があります。 (これは衛星接続をエミュレートします)

{ enableHighAccuracy: true, timeout: 60000, maximumAge: 1200 }は私のために働いた。 私にとって、それは最大年齢ではなく、私が喜んで待っていた時間の長さでした。

(Androidのみ)
この問題は私の意見ではバグではありません。
React Nativeでは、ジオロケーションは次のように機能します。

  • highAccuracyはGPSロケーションを意味します
  • 無効にすると、ネットワークプロバイダーから場所を取得します
  • maximumAgeを使用すると、毎回新しい位置をフェッチするのではなく(バッテリーと時間がかかります)、キャッシュされた位置に依存できます。

基本的に、GPSプロバイダーはネットワークプロバイダーよりも低速であり、場所によっては常に機能するとは限りません(GPSが電話に到達できない場合は、タイムアウトになります)。 ネットワークプロバイダーはより高速でアクセスしやすくなっていますが、トレードオフとして精度が低くなっています(最悪の場合は2000メートルでした)。

highAccuracyを使用してタイムアウトが発生した場合は、GPSで到達できないことを意味します。
この場合、デフォルトで無効にすることを検討し、正確さが増すにつれて場所を更新してください。 この場合、ユーザーは待つことはありません。

私の場合、私は自分のウォッチャーを実装し、場所を比較して、常により正確に返しました。 デフォルトのRN実装の問題は、GPSプロバイダーまたはネットワークプロバイダーのいずれかに依存しているが、両方のトレードオフを返さないことです。 あなたはおそらくJSかネイティブのどちらかでそれを解決しなければならないでしょう。

お役に立てば幸いです。

Androidでのみテスト済み。

私はそれを次のケースで動作させることができ、ロケーションが有効になっていることを確認しました:

  • Android Emulatorを介してアプリを実行している場合は、オプションを入力する必要があります。そうしないと失敗します。
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
  • React 16.1.0
  • React-Native 16.50.3

使用シナリオ

  • Androidフォンには_SIMカードがありません_。それらは_会社所有_であり、WIFIへの接続のみが許可されています。

それでもGeolocation timed out, code 3エラーが発生します...

誰かがこれを解決しましたか?

_更新_(2017-11-13):

Settings >> Privacy >> Location >> ModeHigh 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)を使用しています
react-native-maps(アプリ内の地図上の青い点の正しい位置)を使用して自分の位置を特定できます+ google mapsアプリを使用して自分の位置に移動できます(GPSは機能します)。
大きなタイムアウトを使用して、enableHighAccuracyをtrueとfalseに切り替え、オプションを削除しています...など。 すべてがデータを取得するためのnavigator.geolocationの取得に失敗しました。

ネイティブAPIを使用してAndroidで手を汚しましたか?

2017年11月16日15時19分GMT + 01:00 Badis Merabet [email protected]

私は実際のAndroidデバイス(バージョン5.1)を使用しています
react-native-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と衛星接続を介して実際の現在位置を取得しようとし、要求がタイムアウトした場合(またはその他のエラー)、ネットワーク関連のインフラストラクチャを使用してLowAccuracy位置を取得しようとします。

@RewieerAndroidネイティブAPIを使用したことはありません。 私はJavaScript開発のみを行っています。

@badisは、コードとエラーログを送信してください。

@badis
RN Doc:
場所へのアクセスをリクエストするには、アプリのAndroidManifest.xmlに次の行を追加する必要があります。

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

react-nativeを使用する場合、そのような問題はReact-Nativeを使用する場合に非常に多く発生するため、基礎となるネイティブ環境について少し知っておく必要があります。
GPSは自分の位置や近くの衛星の位置によっては時間がかかる場合があるため、実際の最善の方法(ユーザーごと)は、開始時に近似値を取得し、それを修正することです。 ネットワークの場所は本当にラフに見えるかもしれませんが、誰もがサンフランシスコに住んでいるわけではないと思います:)

@Rewieer @hoorsa
これが私が機能のテストを行うデモコードです: https
地図ページをご覧ください。
コードが正しく、他の誰かのために機能しているかどうかを知りたいだけです。
その後、デバイスの設定と場所に問題があるかどうかを確認します。

皆さん、ありがとうございました !

@badisはアプリのAndroidManifest.xmlに<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />を追加しましたか?

@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
}

また、同じ場所のエラーが発生しています。3番目のオプションパラメータを無効にすると、「高精度」モードと「バッテリー節約」モードで機能します。 それでも、デバイスのみが毎回失敗しています。 enableHighAccuracyをtrueに設定すると、デバイスを設定したモードに関係なく失敗します。

Android Devサイトが示唆しているように、これはFusedLocationProviderClientを利用しているのでしょうか?

3番目のオプションパラメータを無効にすると、「高精度」モードと「バッテリー節約」モードで機能します。

@mkpietrzykなのでoptions省略すると、これら2つのモードで解決しましたか?

@natterstefan

ええ、Androidの場合、デフォルトのパラメーターを使用しました...しかし、ユーザーがいくつかの条件をチェックする場所を知る必要があるため、アプリにほぼ無限のタイムアウトとmaximumAgeを設定することはちょっとアプリキラーです。

ここで@hoorsaソリューションを使用してgpsをチェックすることもできます。 それでも、それはとにかくgpsにとって非常にトリッキーであり、高精度で応答しないことがあります...それが私がそれがうまく機能するとは思わない理由ですが、ちょっと、ちょっとうまくいきます。

私は同じ問題を抱えています。タイムアウトが機能するために途方もなく長い時間を設定する必要がありますが、ユーザーはより早く情報にアクセスする必要があります。 アプリを最初に作成したとき、0.5秒以内に細かい場所にアクセスするための権限が有効であることをログに記録できます。 ファインロケーションの実装は、Androidでは正しく機能しません。
参考までに、パラメータあり/なしで試してみました。 追加のオプションがなくても、場所の読み込みに失敗することがあります。 テストはOnePlusOneで行われました

このタイムアウトの問題も発生しています。

RN .50.3

maximumAgeパラメーター使用して、または使用

{enableHighAccuracy:true、タイムアウト:10000}、

また、この呼び出しを許可要求でラップしているので、問題はありません。

パーミッションAndroid.request(
権限Android.PERMISSIONS.ACCESS_FINE_LOCATION、

デバイスで高精度モードが有効になっています。
マニフェストには正しい権限があります。

私のギャラクシーS7では-それは場所をうまく解決します。
私のPixel2-では、gps信号がない場所で10秒のタイムアウト後にタイムアウトします。
エミュレーターの場合-展開されたコントロールの[場所]タブに移動し、[送信]をクリックして場所を送信しない限り、10秒のタイムアウト後にタイムアウトになります。

以前にlocation。を使用していた別のアプリケーションからキャッシュされた古い場所がある場合でも、gps信号がない場合、navigator.geolocation.getCurrentPositionは機能しないようです。

これを回避するには、高精度を試し、@ olieidelのように失敗した場合は、高精度にフェイルオーバーします。

@jacksontbryanと同じ問題がありますが、 maximumAgeが省略されている場合、 getCurrentPositionキャッシュされた場所を使用

Galaxy S7では問題なく動作するようですが、私のLGG6では動作しません。 LGでは、maximumAgeが設定されている場合、ほぼ常にタイムアウトになります。 maximumAgeが設定されていない場合は、古い場所が使用されます。

編集:options引数を完全に省略したように見えます。

安定した結果を得るには、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を呼び出すと、問題が解決しました。 成功とエラーのコールバックのみを渡します。

Android5.1を搭載した実際のデバイスでテスト済み。

@ginexデータが新しいものでよろしいですか? そうすると、1時間前のデータが表示されることがあります。 (それは私が1時間前にいた場所だと言っています)。

これは本当に修正する必要があります!

こんにちは

私も同じ問題に直面しています。 一部のデバイスでタイムアウトエラーが発生します。 タイムアウトを2秒から10分に増やしましたが、10分待たずに、エラーがスローされます。

enableHighAccuracy:falseも試してみました。 この場合、私は場所を取得することができます(デバイスモードを除く)。

パラメータを渡さずに試しました。 この場合も、デバイスモードを除いて、場所を取得できます。

また、maximumAgeを渡そうとしましたが、結果がありません。
これは私のコードです-

getCurrentPosition(){
navigator.geolocation.getCurrentPosition(
(位置)=> {
console.log( '位置を取得');
this.location = {
経度:position.coords.longitude、
緯度:position.coords.latitude、
エラー:null、
};
}、
(エラー)=> {
console.log( 'get position error'、error);
this.location = {
経度:null、
緯度:null、
エラー:error.message、
};
}、
{{
enableHighAccuracy:true、
タイムアウト:600000
}、
);
}

skipPermissionsRequestを使用していて、geoLocationがタイムアウトしている場合-#17487を参照してください

こんにちは

@ ngandhy-いいえ、「skipPermissionRequests」:trueを使用していません。 minSdkVersionは16です

私は皆さんと同じ問題を抱えています。Androidについて言及しているすべての組み合わせを試し、このreact-native-background-geolocationで解決すると、保存された場所や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の代わりにネットワークを使用して現在地を特定することです。これにより、精度が大幅に低下します。

他のソリューションの多くは最初は機能しているように見えますが、通常はキャッシュされた位置を使用していることが原因であり、電話を再起動してアプリを起動しても失敗することがわかりました。

今日、Androidロケーション用のGoogleの融合ロケーションAPIを使用し、iOS用のデフォルトのReact Native実装にフォールバックするこのパッケージを見つけました(私はこのパッケージの作成者ではありませんが、作成してくれたことを称賛しています):

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

これまで少しだけテストしましたが、うまく機能しているようです。

@globetroありがとう! 私もこれをチェックしました、そしてうまくいくようです!

@globetroありがとうございます。
react-native-geolocation-serviceが最良のソリューションです。

@globetro私もこのプラグインで成功しました。 これは、デフォルトのジオロケーション機能としてreact-nativeにマージする必要があります!

react-native-geolocation-serviceは私を助けません:(

@globetroに感謝します。パッケージ* react-native-geolocation-service *は完全に機能しました。これを、reactnativeのコアコンポーネントとして追加するのは良いことです。

本当に2つのロケーションリスナー(高価です)が必要です。1つはhighAccuracyを実行し、もう1つは実行しません。

次に、「現在の」場所よりも正確で新しい場所を比較します。


これは「一時的な」ソリューションです。これは実際にはRN側で実装する必要があるため、highAccuracyが有効になっている場合は、COARSE権限とFINE権限の両方を使用します。

この問題を修正しました。promiseを使用して作成したコンポーネントは次のとおりです。
https://gist.github.com/a3diti/5466f7309752cbb2e63ecefff6365bb9
Androidでは、 maximumAge削除し、 enableHighAccuracytrue 、RN PermissionsAndroidコンポーネントから権限チェックを追加しました。

@ a3diti実世界でテストしましたか? 場所をキャッシュできます。

@ a3diti最新のreact-nativeリリースで何かを修正しない限り、Androidでは常に機能するとは限りません。 再起動後、実際のAndroidデバイスで起動してみてください。 タイムアウトだけでなく、位置の更新を取得するには20秒以上かかる可能性があります。

ここhttps://www.npmjs.com/package/react-native-geolocation-serviceで使用されているコードをコアにマージしないのはなぜですか?

同じ「リクエストタイムアウトの問題」に直面しています。R&Dの後、デバイスを「再起動」しようとします。その後、場所とその動作に問題がありません。

私のコードを確認してください。

componentDidMount =()=> {
navigator.geolocation.getCurrentPosition(
(位置)=> {
const initialPosition = JSON.stringify(position);
this.setState({initialPosition});
}、
(エラー)=> alert(error.message)、
{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" />

やあみんな、

@globetroが提案するようにreact-native-geolocation-serviceを使用しようとしましたが、アプリがすぐにクラッシュします。 何か案は?

@ Patrick-Bayer Google Playのアプリで使用していますが、不明な理由で開発バージョンがすぐにクラッシュします。 私にとってもクラッシュを引き起こしているのはreact-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. android / build.gradleのリポジトリに「google()」を追加します

AndroidManifest.xmlに<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />を追加した後でも、うまくいかない場合があります。
クイック回避策

  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代わりに削除し、虚偽であることをmaximumAgeと、あなたの増加timeOut{enableHighAccuracy: true, timeout: 100000,}ようなもので十分です。

これが誰かの助けになることを願っています。

私の場合、enableHighAccuracyをtrueに設定すると、API 23で機能しますが、API26ではfalseに設定する必要があります。
(私がテストしているのはそれだけです)

編集: react-native-geolocation-serviceをインストール

こんにちは、

私は同じ問題を抱えていました、そしてここに別の解決策があります。

以下のuses-featureタグをAndroidManifest.xmlに追加しましたが、アプリはhighAccuracy: true正常に動作しているようです

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

highAccuracy: highを設定すると、ReactNativeはNETWORK_PROVIDERではなくGPS_PROVIDERを使用するようです。 また、Android Developersのドキュメントに記載されているように、GPS_PROVIDERを使用するには、API21以降を対象とするアプリでAndroidManifest.xmlにこのタグを含める必要があります。

注意:アプリが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

highAccuracy: falseを設定するときにAndroidManifest.xmlにandroid.hardware.location.networkを含める必要がない理由がわかりません。これは、LocationManagerがNETWORK_PROVIDERを使用するため、ドキュメントによるとタグが必要であることを意味します。

このソリューションがあなたのために働くことを願っています。

いくつかの実験を行いましたが、タイムアウトは、デバイスでGoogleの位置情報サービスが有効になっているかどうかに関係しているようです。
デバイスで位置情報サービスをオンにすると、「位置情報の精度を向上させますか?」という警告ボックスが表示されることに気付きました。 Googleの位置情報サービスがバックグラウンドで実行されることを説明するテキストとともに、位置データをGoogleに送信します。 これは通常、新しいデバイスまたはエミュレーターで発生します。これは、ほとんどの人が通常のデバイスでこれをすでに有効にしているためです。

9vgfb

これが有効になっていない場合、デバイスは、要求するたびに新しい場所を取得する必要があります( maximumAge設定によって制御されます)。 しばらく場所を尋ねておらず、 timeout値が新しい場所を取得するのに十分でない場合、 navigator.geolocation.getCurrentPositionはタイムアウトを返すだけです。

私はまた、デバイスでグーグルマップを一度開くことによってこれが解決されるのを見ました(これは再び新しい場所を取得します)。

繰り返しますが、これが正しい説明/解決策であると主張するのではなく、このスレッドに私の観察を追加するだけです

私はreact-native-fused-locationを使用してAndroidで場所の変更を監視することしかできませんでした

提案されたモジュールの1つからコアに変更をアップストリームすることに興味がある人はいますか?

数日前、RNジオロケーションモジュールと互換性がありますが、Android用の最も効率的なGoogle LocationAPIを使用するreact-native-cross-geolocationを公​​開しました。 そのため、私のモジュールはRNコアに統合する候補ではないと思いますが、それを使用したい人は誰でも利用できます。

react-native-geolocation-serviceこのパッケージは、融合されたロケーションAPIを使用しており、位置を取得したり、位置を監視したりするために正常に機能しています。 @hramos@reyalpsircを試してみてください。

@hramosの融合場所は

私はほとんどすべてを試しましたが、一貫性がないことがわかりました。 私は役に立つかもしれない何かを見つけました。

高精度を実現するということは、gps + network(キャリアサービス)を介して場所を見つけることを意味します。 アプリレベルの権限を確認したところ、デバイスでキャリアサービスのロケーション権限が無効になっています。 それを有効にして、navigator.geolocation.getCurrentPosition()から3番目のパラメーターを削除するとうまくいきます。
試してみてください
-デバイスの[設定]-> [セキュリティと場所]-> [場所]-> [アプリレベルの権限]に移動します
-CarrierServicesのロケーション許可を有効にする
-getCurrentPositionからlocationconfig(3番目のパラメーター)を削除します
-デバイスを再起動します

お役に立てれば!

関連性があるかどうかはわかりません。 しかし、 https://snack.expo.io/SkJqg8gYmの一例です

{enableHighAccuracy: true, timeout: 10000, maximumAge: 0}
2番目のパラメーターをスキップするか、10000未満の値を指定すると、エラーが発生することがわかりました。

上記のように3つのパラメーターすべてを指定してみてください。少なくともエミュレーターで問題が解決します。

_AndroidManifest.xml_にこの権限を追加してみてください:

<_uses-permission i = "6" />
<_uses-permission i = "8" />
<_permission_ i = "10" /> _android:name = "android.permission.ACCESS_COARSE_LOCATION" _
_android:protectionLevel = "signature" _ />
<_permission_ i = "13" /> _android:name = "android.permission.ACCESS_FINE_LOCATION" _
_android:protectionLevel = "signature" _ />

こんにちは私は同じ問題「リクエストタイムアウト」に直面していました。上記の解決策をすべて試しましたが、うまくいきませんでしたが、最近、この問題を解決するモジュールを1つ見つけました。
https://www.npmjs.com/package/react-native-geolocation-service
これは私のために働いた.....

@vishalTechnoFreekはreact-native-cross-geolocationも存在します。

現在のRNジオロケーションと完全に互換性がありますが、新しいGoogleAPIを使用しています。 このAPIを使用すると、使用するモードを気にする必要がなく、サービスは自動的に最適なオプションを検出します。

もう1つの利点は、RNがこの問題を修正したときに、必要に応じてアプリに影響を与えることなく問題を削除できることです。

私の場合、Google Mapsアプリを(ダウンロードして)開いてからExpoに戻ることについて@manuranaに言及したことで、うまくいきました。

GenymotionとAndroid5を使用しています。

また、Genymotionユーザーの場合、位置を正しく読み取るには、Genymotionのマップウィンドウを開く必要があります。 それ以外の場合は機能しますが、デフォルトのGenyの場所を使用します

enableHighAccuracytrueまたはfalseいずれかに設定しても機能しません。
ネイティブモジュールのデフォルト値を使用するためにgetCurrentPosition番目の引数を省略すると、うまくいきます。

命の恩人👍これは私のために働いた。

みんな、
私は同じエラーに直面していましたが、同僚と何度か再試行した後、何か奇妙なことに気づきました(ただし、GPSについては正常です)。

物理デバイスを使用して「オフィス内」でテストを実行する場合、GPSロケーターは壁などの外部のもの、またはこの操作を「屋内」で実行しようとしているという単純な理由によって妨害される可能性があり、通常、これは屋外で実行する必要があります。

さて、この後、私たちはオフィスから出て、テストを再実行し、デバイスは計画どおりに応答します(リクエストのタイムアウトエラーは受信されません)。

私の提案は次のとおりです。trueに設定された「enableHighAccuracy」を使用してジオロケーションを試してください。これが失敗した場合(オフィスでは失敗する可能性があります)、falseで再試行します。私の場合は機能するはずです。

これがお役に立てば幸いです。

同じ問題に直面していますが、 enableHighAccuracyfalseしてもうまくいきません。 したがって、完璧に見えるこのソリューションは私にはうまくいきません。

複数のリクエストで同様の問題に直面しました(現在の場所を使用を継続的に選択)ロケーションリクエストの再試行を追加しました。 正確な問題ではありませんが、誰かを助けるかもしれません。

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」を使用すると、以前の場所がキャッシュされていないため、バグがあります。最初に場所を尋ねるときは必ず確認してください。場所は「maximunAge」がありません

簡単な答えは、あなたがいる場所から出て、オープンスペースに行き、そして再試行することです。

その単純な科学。

GPSサービスは、厚い壁や車の影響を受けます。

これは私のために働いた。 何も編集する必要はありません!!!

私の場合、maximumAgeを削除すると問題が解決しました。

どうもありがとうございました! 作業!

こんにちは、
どの解決策も私にはうまくいきません。
3番目のパラメーターとして{enableHighAccuracy:false}のみを使用して、navigator.geolocationを使用します。
iOSでは正常に動作し、Androidでは特定のデバイスでは動作しません。
Android 7、8、9をチェックインしました。Android7を搭載したLenovo電話では機能しませんが、Android7を搭載した他のデバイスでは機能します。

この問題を解決するための回避策はありますか?
どんな提案も認められます。

ありがとう

@akhilsankerはreact-native-fused-locationのようなライブラリを試してみてください

こんにちは@reyalpsirc

返信いただきありがとうございます。 本当にありがとうございました。
iOSには問題はなく、ほとんどのAndroidデバイスで正常に動作します。 時間の制約が限られており、ご提案のとおり、新しいライブラリを使用するのは難しいでしょう。
この問題を解決するための他の回避策はありますか?
御時間ありがとうございます。

ありがとうございました。

申し訳ありませんが@akhilsanker 、私がしたのは、iOS用のreactnativeのGeolocationとAndroid用のFusedLocationを使用することだけでした。

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は正常に機能しています。

パッケージが機能しない場合は、そのリポジトリで課題チケットを作成します。 問題は解決しません。コミュニティに参加してください。

iwangsyahのコメントを参照してください。 <permission> __と__ <uses-permission>メタタグの両方が必要でした

https://www.npmjs.com/package/react-native-geolocation-service
このパッケージは私にとって問題を解決しました。
上記の提案のほとんどすべてが私にはうまくいきませんでした。

ありがとうございました!

このページは役に立ちましたか?
0 / 5 - 0 評価