React-native: Geolocation 'enableHighAccuracy' di Android selalu kehabisan waktu

Dibuat pada 10 Mei 2016  ·  239Komentar  ·  Sumber: facebook/react-native

Mengembangkan aplikasi Android, saat melakukan debug pada Perangkat Android saya yang berjalan pada 6.1, api geolokasi selalu mengembalikan kesalahan callback dengan pesan Location request timed out .

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

Jika saya mengalihkan opsi enableHighAccuracy ke false, api berfungsi dengan baik. Dalam mode akurasi tinggi, batas waktu selalu membutuhkan waktu selama saya tentukan dalam opsi batas waktu yaitu 20 detik.

Saya sudah mencoba menjalankan dengan mode pengembang dimatikan.

Haruskah mode akurasi tinggi berfungsi di Android?

Geolocation Bug Help Wanted Android Ran Commands Locked

Komentar yang paling membantu

menyetel enableHighAccuracy menjadi true atau false tidak berhasil untuk saya.
menghilangkan argumen ke-3 untuk getCurrentPosition untuk menggunakan nilai default dari modul asli berfungsi untuk saya.

Semua 239 komentar

@ acapop77 Lupa juga menyebutkan bahwa izin diaktifkan menggunakan:

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

Saya memiliki masalah yang sama pada RN 0.25.1, perbedaannya adalah, bagi saya masalah tetap ada untuk akurasi tinggi dan rendah. Akhirnya saya menemukan sesuatu yang membuatnya berhasil, tetapi bukanlah solusi.

Inilah yang berhasil untuk saya - dengan asumsi Anda menggunakan stock android avd - emulator:

  1. Di perangkat emulator android, buka "Pengaturan> Lokasi" (seperti yang Anda lakukan di perangkat sebenarnya) dan setel Mode ke Akurasi tinggi.
  2. Kembali ke aplikasi.
  3. Tekan tombol "Kontrol yang diperluas" (diwakili oleh "..."). Selanjutnya di bagian Lokasi Anda akan melihat data titik data GPS dan tombol "Kirim" di bawah. Cukup klik pada "Kirim" dan tutup menu kontrol tambahan.
  4. Muat ulang aplikasi.

Ini bekerja untuk saya - pada 'satu basis waktu saja'. Setiap kali saya ingin memuat ulang aplikasi, saya perlu melakukan 3-4 langkah lagi. Tapi setidaknya dengan cara ini saya mendapatkan Geolocation berfungsi, dan tidak mendapatkan kesalahan batas waktu.

Saya mengalami hal serupa di 0.24. Meskipun <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> ada di AndroidManifest.xml saya, saya menerima kesalahan merah yang menyatakan:

"Sepertinya aplikasi tidak memiliki izin untuk mengakses lokasi. Tambahkan baris berikut ..."

Saya tidak menggunakan emulator dan malah membangun langsung ke perangkat.

Edit - ini juga terjadi di 0.25.1

@ acapop77 @rossthedevigner Saya juga membangun langsung ke perangkat Samsung S6.

@Findiglay Sama di sini. Saya bahkan mencoba melakukan penginstalan .apk manual dan saya masih menerima kesalahan.

Saya mencoba solusi di mana saya mengulang melalui manifes izin dan melihat apakah android.permission.ACCESS_FINE_LOCATION diaktifkan.

Adakah yang memiliki navigator.geolocation == tidak ditentukan?

Saat ini saya mengalami masalah ini di perangkat saya.

Ada berbagai masalah yang dilaporkan di sini. Saya tidak yakin semuanya relevan dengan masalah khusus dengan enableHighAccuracy.

Saya tidak memiliki pengalaman dengan pengembangan android, tetapi saya telah menemukan bahwa jika saya mengedit LocationModule.java menjadi hardcode LocationOptions boolean highAccuracy = true; dan membangun kembali, maka lokasi saya akan kembali dengan benar. Saya tidak yakin apakah hasilnya berbeda atau tidak dengan yang diterima dengan pengaturan enableHighAccuracy: false di API geolokasi React-Native, tetapi harus aman untuk mengasumsikan ini beroperasi dalam mode akurasi tinggi.

Mungkinkah ini berarti bug terjadi di jembatan antara Geolocation API & LocationModule?

Aku mengalami masalah yang sama. Saya melakukan hal yang sama seperti yang disarankan @Findiglay dan bekerja beberapa kali, tetapi kemudian saya hanya mendapat waktu tunggu.

Tahu mengapa ini terjadi di perangkat nyata? :(

Mengalami masalah yang sama. Saat ini saya menjalankan aplikasi di perangkat nyata, menggunakan RN 0.25.1.

Saya harus menambahkan bahwa saya telah menambahkan izin Android yang diperlukan ke manifes izin. Tapi tetap saja batas waktu.

sebagai solusinya, saya mengaktifkan 'Izinkan lokasi palsu' di pengaturan android dan menginstal aplikasi yang mengolok-olok gps (cari gps palsu di toko). Setidaknya sampai ini diperbaiki, pengembangan tidak diblokir

Saya guys,
Saya menghadapi kesalahan yang sama tetapi, setelah beberapa percobaan ulang dengan kolega saya, kami melihat sesuatu yang aneh (tetapi normal jika Anda memikirkan GPS).

Jika Anda menjalankan tes "di dalam kantor Anda" menggunakan perangkat fisik, pelacak GPS dapat diganggu oleh hal-hal eksternal seperti dinding, atau oleh alasan sederhana bahwa Anda mencoba melakukan operasi ini "di dalam ruangan" dan, umumnya, ini harus dilakukan di luar ruangan .

Nah, setelah ini kami keluar dari kantor kami, kami menjalankan ulang tes dan perangkat merespons sesuai rencana (kami tidak menerima kesalahan waktu Permintaan habis).

Saran saya adalah: coba geolocation menggunakan "enableHighAccuracy" disetel ke true, jika ini gagal (di kantor ini bisa gagal), coba lagi dengan false, ini akan berfungsi, dalam kasus saya itu berhasil.

Semoga ini bisa membantu.

+1

Masalah yang sama di sini apakah enableHighAccuracy disetel ke true atau false .
Ini berfungsi pada emulator GenyMotion tetapi tidak pada perangkat nyata apa pun (diuji pada Samsung, Nexus, Mi).
Izin yang diaktifkan di AndroidManifest.xml
Kode:

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

menyetel enableHighAccuracy menjadi true atau false tidak berhasil untuk saya.
menghilangkan argumen ke-3 untuk getCurrentPosition untuk menggunakan nilai default dari modul asli berfungsi untuk saya.

Masalah yang sama di sini dengan LGE Nexus 5 (Android 6.0).
Di Android 5.1.1 dan 4.3 tidak ada masalah seperti itu.
Dalam emulator dengan Android 6.0 tidak ada masalah seperti itu.
boolean highAccuracy = false; tidak berfungsi.
RN 0.28.0.

Halo teman-teman, saya menemukan perbaikan sementara - paket ini https://github.com/lucasferreira/react-native-android-permissions

Adakah pembaruan atau perbaikan untuk ini? Semuanya berfungsi dengan baik pada perangkat Simulator dan pra 5.0, setelah itu hanya batas waktu, dan saya sangat membutuhkan perbaikan untuk aplikasi yang sudah tersedia!

+1

Masalah ini dipengaruhi oleh pengaturan locationMode di perangkat. Saat mode lokasi disetel ke akurasi tinggi atau hanya perangkat, waktu geolokasi habis. Ini berfungsi dengan benar ketika mode lokasi disetel ke hemat baterai

Saya memiliki masalah yang sama, saya mengambil tendangan dan menghapus argumen ke-3. Dan sekarang bekerja.

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

Tidak, itu karena masalah waktu tunggu lokasi

Ya, saya baru saja menemukan menghapus argumen ke-3 tampaknya merupakan perbaikan.

Kami belum sepenuhnya menguji perangkat tetapi tampaknya Android versi 22, dengan mode perangkat disetel ke akurasi tinggi atau hanya perangkat, akan menyebabkan penyebab lokasi menjadi waktu tunggu, ketika argumen ke-3 disertakan terlepas dari pengaturannya. Sepertinya tidak mempengaruhi versi android 23.

Pengalaman yang sama menurut saya, kecuali android versi 23 hanya berfungsi dengan argumen ke-3 ketika enableHighAccuracy disetel ke false ( true menyebabkan lokasi ke waktu tunggu). Juga diuji pada Android versi 22, 21, 20 & 19 dan tampaknya kehadiran argumen ke-3 menyebabkan waktu tunggu di semua kasus. Menghapus argumen itu tampaknya menjadi satu-satunya perbaikan yang dapat diandalkan.

Menghapus argumen ke-3 hanya membuat saya memiliki munculan "Permintaan lokasi habis waktunya" secara instan daripada menunggu hingga batas waktu selesai. Menyetel enableHighAccuracy ke false, juga tidak berhasil.

Di emulator saya, Lokasi hanya tersedia ketika saya membuka pengaturan emulator dan mengirim lokasi (periksa tangkapan layar).

Apakah ada cara untuk mendapatkannya secara otomatis?

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

Dalam kasus saya, pengaturan enableHighAccuracy menjadi false memecahkan masalah.

Mengalami masalah yang sama di sini, baik di emulator maupun di perangkat, dan mencoba dengan true dan false untuk enableHighAccuracy

Saya langsung saja mendapatkan "undefined bukanlah sebuah objek (mengevaluasi 'navigator.geolocation.getCurrentPosition')"

Saya mencoba memeriksa apakah (navigator), yang mengembalikan true,
tetapi jika (navigator.geolocation) mengembalikan false.

Juga, melakukan ini di perangkat Android 5.1 OnePlus One. Mode pengembang diaktifkan, izin AndroidManifest disertakan, lokasi palsu aktif / nonaktif, semuanya.

juga, sepertinya tidak meminta izin lokasi dari saya 🤔meskipun saya menghapus aplikasi di perangkat dan folder keluaran di mac saya.

Saya tidak dapat benar-benar men-debug dari jarak jauh karena saya menggunakan React Realm dan hal itu memiliki masalah BESAR yang mengacaukan debugger jarak jauh chrome luar-dalam.

Saya memiliki Masalah serupa, mungkin aplikasi tidak selalu timeout TETAPI sering melakukannya, ketika aplikasi geolokasi lain berfungsi dengan baik setiap kali aplikasi dengan RN memiliki geolokasi yang sangat buruk.
Saya menggunakan RN 0,32 tetapi saya memiliki masalah yang sama dengan setiap versi, untuk beberapa alasan geolokasi di RN sangat aneh dan buruk (setidaknya di Android)

Masalah yang sama di sini, pengujian di perangkat nyata.

Mengalami ini dan ini benar-benar menjengkelkan: /

Saya mengalami masalah yang sama di Android 6.0.

+1

Saya menemukan solusinya adalah tidak menambahkan parameter ke-3, dan menggunakan pustaka yang ditautkan di atas (https://github.com/lucasferreira/react-native-android-permissions) pada versi android> = 23 untuk meminta izin Android M.

Izin yang baru saja dilihatAndroid sekarang telah ditambahkan ke RN. Jadi gunakan ini untuk meminta jika di android> = 23

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

Tetapi saya memiliki Android 5.1.1 di perangkat saya. Pada versi android ini, Geolocation harus berfungsi dengan baik, bukan?

23 adalah 6.0 dan seterusnya. Saya juga menemukan saya tidak perlu menambahkan parameter ke-3 agar bisa bekerja pada semuanya.

Saya berhasil membuat ini berfungsi, tetapi ini bisa berbeda untuk Anda. Versi RN yang lebih baru (Milik saya adalah 0.32.1) menyertakan file bernama MainApplication.java (Selain MainActivity.java). Dokumen GL React Native Mapbox mengatakan Anda harus menyertakan ReactNativeMapboxGLPackage ke dalam MainActivity.java, tetapi Anda harus melakukannya di MainApplication.java sehingga akan terlihat seperti ini:

MainApplication.java

`. . .

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

};
`

Dan MainActivity.java akan tetap sama seperti biasanya.

Versi Android saya adalah 23 jadi saya masih menggunakan izin dari manifes xml

Dengan GPS diaktifkan di perangkat, Aplikasi mengembalikan lokasi dengan baik, tetapi jika saya mematikannya, pengembalian lokasi: error: No available location provider.

Bagaimana saya bisa memaksa perangkat ke lokasi GPS aktif?

Ini menjengkelkan = /

Saya memiliki getCurrentPosition bekerja pada emulator Android Genymotion saya selama beberapa minggu terakhir, tetapi sekarang gagal lagi.

Saya menggunakan widget GPS Genymotion untuk mengatur lokasi. Saya telah menginstal Google Maps di emulator, dan Google Maps dapat membaca lokasi saya dengan baik.

Saya memiliki semua izin yang diperlukan, dan saya bahkan menggunakan modul PermissionsAndroid seperti yang disarankan @sattaman . Sepertinya perilakunya non-deterministik, karena ia berhasil satu hari dan rusak di hari berikutnya.

Saya menggunakan RN 0,31 dan menghapus parameter ketiga juga berhasil untuk saya! Perangkat nyata, Nexus 5X, Android 6.

Saya memiliki masalah yang sama pada RN 0.34.1, tetapi menghapus parameter ketiga dapat memperbaikinya
Menyetel enableHighAccuracy ke false tidak menyelesaikan masalah ini

Masalah yang sama dengan saya di RN 0,32, mencoba dengan Android 22 & 23,

enableHighAccuracy menjadi true atau false, tidak berfungsi untuk saya
menghapus parameter ketiga menyebabkan "Waktu tunggu permintaan lokasi" langsung
namun memulai ulang perangkat saya membuatnya berfungsi, tetapi akan rusak setelah beberapa waktu,

sekarang, untuk mendapatkan lokasi pengguna saya hanya menggunakan ini:
https://github.com/mauron85/react-native-background-geolocation

@acondense di mana Anda menyetel kode untuk background-geolocation, karena tampaknya tidak menjalankan fungsi lokasi

Saya menemui masalah yang sama di RN 0,35 dengan Android 23 dan 24, namun berfungsi dengan baik dengan Android 22.
Ini mungkin terkait dengan sistem izin waktu proses Android 6.0:
http://stackoverflow.com/questions/32224534/access-fine-location-permission-error-emulator-only

Saya menggunakan perpustakaan ini untuk menghindari masalah ini dan berfungsi dengan baik!
https://github.com/yonahforst/react-native-permissions

Menghapus parameter ketiga juga memperbaikinya untuk saya 💯 💯 💯

Menghapus parameter ketiga berhasil 👍

Tidak begitu jelas dari awal parameter mana yang dibicarakan semua orang, parameter metode atau parameter ketiga dari objek opsi.

Tepatnya, ini adalah parameter ketiga dari metode getCurrentPosition , yang terlihat seperti itu pada akhirnya:

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

Akhirnya saya datang dengan solusi berikut (ide yang sama seperti yang dijelaskan di atas):

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

Ini berfungsi pada perangkat (diuji pada Android 21, 22 & 23), tetapi untuk Android 23 sangat lambat: 5 - 10 detik.

Apakah ada yang menggunakan LocationServices.FusedLocationApi sebagai solusi untuk tujuan ini di react-native (mengimplementasikan secara native, dalam kode Java untuk Android)?

enableHighAccuracy: true tidak berfungsi di android sama sekali

Saya menggunakan kode ini untuk memeriksa izin lokasi di 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 Ini mencegah kesalahan Location request timed out ?

gunakan cuplikan saya dan yang ini juga https://github.com/facebook/react-native/issues/7495#issuecomment -259753488

Apakah masih belum ada perbaikan untuk ini? Saya telah mencoba semuanya di utas ini dan tidak ada yang berhasil untuk saya, selalu ada kesalahan waktu habis, baik secara instan atau setelah beberapa detik.

Sama di sini, komentar @sattaman memperbaikinya untuk perangkat saya (mengatur mode lokasi ke hemat baterai), namun bagaimana cara memberi tahu pengguna aplikasi untuk melakukan hal seperti itu!

Baik menonaktifkan enableHighAccuracy atau menghapus parameter ke-3 berfungsi untuk saya. Lokasinya masih terlihat cukup akurat.
Tidak ada masalah di iOS. (RN 0,39)

RN 0,40 masalah yang sama. Menghapus parameter ke-3 akan menyelesaikannya.
(Tapi Anda tidak mendapatkan akurasi tinggi)

masalah yang sama, menghapus parameter ke-3 menyelesaikannya.

Pada emulator, saya harus menyetel enableHighAccuracy: true dan memastikan mode lokasi disetel ke Akurasi Tinggi. Jika tidak, waktu habis. Saya tidak bisa mendapatkan penghematan baterai pada emulator untuk bekerja dalam keadaan apa pun.

Di perangkat saya tidak memberikan opsi apa pun sama sekali. Jika Anda berjuang dengan ini seperti yang saya miliki - saya sarankan mencobanya di perangkat nyata. Saya menguji pada Pixel C (Android 7.1) dan Note 4 (Android 6.0.1)

Di iOS saya harus mengatur Akurasi Tinggi ke True. Anda bisa membayangkan fungsi get location saya pada saat ini ...

Saya sedang mengerjakan RN 0,40 dan menggunakan perangkat asli (Nexus 5) dan masih mengalami masalah.

Saya mencoba apa pun dari semua komentar dalam masalah ini.

Apakah ada yang memecahkan masalah dengan cara lain, yang tidak disebutkan di sini?

// UPDATE:

Tampaknya navigator.geolocation.watchPosition berfungsi. Jadi menggunakannya mungkin bisa menjadi solusi sampai navigator.geolocation.getCurrentPosition diperbaiki.

Untuk saat ini, saya akan menulis modul asli dan berbicara dengan API asli secara langsung, karena menggunakan akurasi tinggi penting bagi saya.
API geolokasi RN tampaknya tidak stabil untuk saat ini.

Dalam proyek saya, saya memikirkan beberapa aturan.

  1. Pengaturan perangkat android - Lokasi hanya perangkat, Anda TIDAK boleh menyetel enableHighAccuracy: true ke getCurrentPosition
  2. Pengaturan - Lokasi Akurasi tinggi, Anda harus menetapkan enableHighAccuracy: true ke getCurrentPosition

Sesuai dengan dua aturan ini, semuanya berfungsi dengan baik dalam proyek saya

@ kimochg apa pengaturan pengujian Anda?

Dalam pengujian saya, mengatur pengaturan perangkat untuk Lokasi ke Perangkat saja akan menghasilkan timeOut setiap saat, terlepas dari apa geolokasi enableHighAccuracy itu.

Menyetel setelan perangkat ke Akurasi tinggi akan memberi saya lokasi yang valid terlepas dari apa yang disetel enableHighAccuracy .

EDIT
Tampaknya bagi saya Geolokasi hanya akan mengambil lokasi baru jika saya menetapkan enableHighAccuracy: false dan pengaturan lokasi perangkat sebagai Akurasi tinggi. Dengan enableHighAccuracy: true itu akan mengambil lokasi yang di-cache tetapi waktu pengambilan baru akan habis.

Ini ada di React Native 0.40, menguji Nexus 5X yang menjalankan Android 7.1.1

@kulmajaba beberapa saat Anda React Native 0.40, menguji Nexus 5X yang menjalankan Android 7.1.1
tapi emulator android di sini, bukan perangkat android asli

jika Anda menggunakan emulator,
apakah Anda mengklik tombol 'Kontrol yang diperluas' di bilah kanan emulator, dan mengirim data GPS?
(tombol '...')

@bayu_joo Saya menggunakan perangkat nyata untuk pengujian, saya perlu membandingkan perilaku emulator dengan itu saat saya mengerjakan proyek lagi.

@Ascendance @ Daniel-ltw Saya mengikuti semua solusi di utas ini dan tidak dapat menghilangkan masalah navigator.geolocation yang ditakuti. Lalu saya login navigator .

Inilah yang saya dapatkan kembali:

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

Kemudian saya menyadari ini berasal dari komponen Navigator. Ini menggunakan (route, navigator) saat merender rute. Benar saja, menghapus variabel navigator dan logging lagi menghasilkan:

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

Semoga ini bisa membantu orang lain - meluangkan waktu yang menyedihkan untuk menyadari apa masalahnya. : /

@kulmajaba parameter maximumAge memperbaiki masalah cache apa pun untuk saya. Menyetelnya ke 0 akan memaksanya untuk selalu mendapatkan posisi baru.

Bagi siapa pun yang berjuang dengan masalah batas waktu, saya telah membaca bahwa terkadang panggilan GPS dengan akurasi tinggi dapat memakan waktu cukup lama (lebih dari satu menit), terutama saat berada di dalam ruangan - seperti yang ditunjukkan @RoBYCoNTe di atas.

Mengandalkan panggilan akurasi tinggi sejak awal mungkin bukan yang terbaik, mungkin mendapatkan panggilan dengan akurasi rendah terlebih dahulu dan memulai panggilan dengan akurasi tinggi di latar belakang akan menjadi pendekatan yang lebih baik. Ini tergantung pada kebutuhan Anda tentunya, menunggu sebentar + untuk panggilan bukan untuk semua orang :)

Juga mengingat bahwa RN memperluas spesifikasi web untuk geolokasi, Anda dapat menemukan jawaban yang terkait dengannya di web, seperti http://stackoverflow.com/questions/3752383/geolocation-is-so-slow-what-im- berbuat salah

Apakah ada yang punya solusi yang solid? Beberapa pengguna bahkan tidak dapat mendaftar untuk aplikasi saya karena bagian dari pendaftaran mengharuskan mereka menyetel geolokasi mereka. Masalahnya hanya terjadi di beberapa perangkat Android, dan saya tidak menggunakan parameter ke-3. Membuatku gila. Orang-orang secara otomatis memberikan ulasan 1 bintang pada aplikasi saya karena mereka tidak dapat mengatur geolokasi mereka, hahaha. >.>

@booboothefool coba gunakan parameter options dan teruskan highAccuracy sebagai
Salah. Hasilnya jauh lebih cepat seperti itu.

Pada hari Sen, 20 Feb 2017, 09.50 booboothefool [email protected]
menulis:

Apakah ada yang punya solusi yang solid? Beberapa pengguna bahkan tidak bisa mendaftar untuk saya
aplikasi karena bagian dari pendaftaran yang mengharuskan mereka menyetel geolokasi mereka.
Masalahnya hanya terjadi di beberapa perangkat Android, dan saya punya, saya tidak
menggunakan parameter ke-3. Membuatku gila.

-
Anda menerima ini karena Anda berkomentar.
Balas email ini secara langsung, lihat di GitHub
https://github.com/facebook/react-native/issues/7495#issuecomment-281142941 ,
atau nonaktifkan utasnya
https://github.com/notifications/unsubscribe-auth/ADJE_BC-osVA45bcpejEI_paDEBykBs1ks5redJtgaJpZM4Ibete
.

@greyvugrin Oke saya akan mencobanya. Mengapa separuh orang melaporkan bahwa "Anda perlu menghapus parameter ke-3, hanya menyetel ke enableHighAccuracy ke false tidak berfungsi"? Sepertinya setiap orang mengatakan sesuatu yang berbeda.

Juga berdasarkan ini: https://developer.mozilla.org/en-US/docs/Web/API/PositionOptions

Sepertinya itu adalah opsi default. enableHighAccuracy: false dengan timeout: Infinity , jadi bukankah seharusnya sudah melakukan itu jika saya tidak memberikan parameter ke-3?

@ Booboothefool Anda benar tentang utas ini yang membingungkan. Dari apa yang saya tahu, orang-orang yang menghilangkan parameter opsi mungkin telah menyelesaikan masalah mereka karena sesuatu yang lain dalam pengaturan mempengaruhi banyak hal.

pengaturan enableHighAccuracy menjadi benar atau salah tidak berfungsi untuk saya.
menghilangkan argumen ke-3 untuk getCurrentPosition untuk menggunakan nilai default dari modul asli berfungsi untuk saya.

Jadi masalahnya mungkin ada pada timeout . Ada banyak faktor yang masuk ke geolokasi, mendapatkan info sebanyak mungkin dari orang-orang yang mogok akan membantu.

Jika Anda sudah menghapus opsi dan RN memang default ke parameter yang sama dengan web, semuanya akan berfungsi dengan baik. Jika Anda masih mengalami masalah, mungkin melihat apakah pengguna telah mengaktifkan izin untuk lokasi (dan Anda memeriksanya di aplikasi Anda).

Hai @greyvugrin ,

Terima kasih atas tip besar tentang izin. Saya pikir itulah yang saya lewatkan. Setelah menerapkan https://github.com/lucasferreira/react-native-android-permissions (Saya lebih suka API ini daripada https://facebook.github.io/react-native/docs/permissionsandroid.html), bersama dengan menentukan enableHighAccuracy: false , dan menyetel timeout , tampaknya ini berhasil untuk semua orang sekarang.

Aplikasi saya berubah dari 1 bintang di Google Play Store dengan semua orang membuangnya karena masalah geolokasi menjadi 3,6 bintang, hahaha! 👍

@booboothefool itu berita bagus, senang mendengarnya !!!

Saya sudah mencoba semua pendekatan yang disarankan di sini. Tidak bisa mendapatkan apa pun dari getCurrentPosition kecuali waktu tunggu pada simulator atau perangkat di Android. watchPosition berfungsi tetapi tidak benar-benar menawarkan UX terbaik bagi pengguna, saya hanya memerlukan lokasi pengguna sekali, saya tidak perlu membiarkan GPS membuang-buang baterai mereka.

Saya sudah mencoba:

  • enableHighAccuracy: false
  • menghapus argumen opsi
  • memeriksa dan meminta izin android> = 23
  • Baik HALUS & KERAS dalam manifes.

Tidak ada yang mengubah batas waktu untuk getCurrentPosition

Ini hanyalah sesuatu yang harus diperbaiki / diterapkan oleh pengembang Android Studio Emulator di masa depan ketika mereka mendapat kesempatan.

Namun, sementara itu ... Anda dapat mengimpor file jejak GPX yang besar dan membiarkannya diputar dengan kecepatan "1x". Saya mengambil GPX dari sini ... ExpertGPS.com -> ca-trails.gpx
... file ini bertahan sekitar 8 menit dengan kecepatan "5x", jadi dengan kecepatan "1x" HARUS bertahan sekitar 40 menit.

Muat (atau file GPX lain yang mungkin lebih besar) ke dalam [...] Extended Options-> Location (Muat tombol GPS / KML di kanan bawah), tekan tombol putar, lalu tutup jendela ... itu akan terus diputar sampai mencapai akhir. Sayang sekali tidak ada pengulangan otomatis — permintaan fitur lain untuk programmer Android Studio. :-)

Itu tidak benar. Saya mendapatkan waktu tunggu yang sama di perangkat nyata.
getCurrentPosition selalu waktu habis. Jam tangan berfungsi dengan baik. Menguji Z5, Nexus 5X
& Pixel, Semua waktu tunggu pada panggilan awal ke getCurrentPosition.

Pada Sabtu, 4 Mar 2017, 19:49 Deen Foxx, [email protected] menulis:

Ini hanyalah sesuatu yang akan dilakukan oleh pengembang Android Studio Emulator
harus diperbaiki / diterapkan di masa mendatang ketika mereka mendapat kesempatan.

Namun, sementara itu ... Anda dapat mengimpor file jejak GPX yang besar dan membiarkannya
itu diputar ulang dengan kecepatan "1x". Saya mengambil GPX dari sini ... ExpertGPS.com ->
ca-trails.gpx
https://www.expertgps.com/data/downloading.asp?file=ca/ca-trails.gpx
... file ini bertahan sekitar 8 menit dengan kecepatan "5x", jadi dengan kecepatan "1x"
HARUS bertahan sekitar 40 menit.

Muat (atau file GPX lain yang mungkin lebih besar) ke dalam [...] Extended
Pilihan-> Lokasi (Muat tombol GPS / KML di kanan bawah), tekan tombol putar
tombol, lalu tutup jendela ... itu akan terus diputar sampai menyentuh
akhir. Sayang sekali tidak ada pengulangan otomatis — permintaan fitur lain untuk Android
Pemrogram studio. :-)

-
Anda menerima ini karena Anda berkomentar.
Balas email ini secara langsung, lihat di GitHub
https://github.com/facebook/react-native/issues/7495#issuecomment-284172310 ,
atau nonaktifkan utasnya
https://github.com/notifications/unsubscribe-auth/AACQ6AoZYXJ02DCmevcLmmF3tuOdg_SEks5ribJHgaJpZM4Ibete
.

Menghapus parameter ketiga ke getCurrentLocation berhasil untuk saya di emulator.

{
   timeout: 20000,
    maximumAge: 1000
}

Saya baru saja membuat kode kemungkinan tiga umpan. Mungkin sedikit berlebihan, tapi oh baiklah. Berikut potongan kode (dengan komentar) ...

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;

Saya hanya menguji ini pada emulator dev lokal, bukan dalam produksi. Beri tahu saya jika ini membantu Anda.

Saya baru saja berpikir ... itu mungkin akan bekerja dengan sempurna sebagai dua-pass jika panggilan roughError Anda hanya menggunakan versi tanpa opsi ...

  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
        }
      );
  };

Itu akan membuat ponsel Android yang bermasalah tidak memiliki penundaan lagi, tetapi tetap mengupayakan akurasi yang tinggi. Maka Anda tidak lagi membutuhkan FineError sama sekali, kode itu dapat dihapus.

  • Ya, saya tahu ada sedikit kemungkinan percobaan "enableHighAccuracy: true" akan kembali sebelum hasil "kasar" asinkron lainnya (terutama jika batas waktu adalah Infinity) dan dengan demikian akan hilang / ditimpa ... tetapi saya meragukannya. Jika Anda benar-benar ingin berhati-hati, Anda dapat mengubah kode untuk menguji kasus tertentu.

Ada kemajuan dalam hal ini?

Alex, ada beberapa solusi untuk utas ini. Apa yang sudah kamu coba? Itu
mungkin juga layak membuat tiket baru setelah Anda memiliki detail lebih lanjut sejak itu
utas ini sangat panjang, jika tidak ada solusi di atas yang berfungsi.

Pada Jum, 17 Mar 2017, 10.29 Alex Sinelnikov [email protected]
menulis:

Ada kemajuan dalam hal ini?

-
Anda menerima ini karena Anda disebutkan.
Balas email ini secara langsung, lihat di GitHub
https://github.com/facebook/react-native/issues/7495#issuecomment-287419487 ,
atau nonaktifkan utasnya
https://github.com/notifications/unsubscribe-auth/ADJE_HLDGQEplAduqm3Zx5L74dv99mnhks5rmsLjgaJpZM4Ibete
.

Seperti kamu. Tak satu pun dari saran di atas berhasil. Satu-satunya solusi bagi saya
mendapatkan lokasi di Android adalah dengan menggunakan jam tangan dan memperbarui UI untuk menginformasikan
pengguna apa yang terjadi jika aplikasi Anda berfungsi membalas di lokasi. Jangan
repot dengan getCurrentPosition, itu tidak berfungsi pada salah satu dari 10 pengujian nyata
perangkat yang kami miliki menjalankan berbagai versi android 4+

Pada hari Jumat, 17 Mar 2017, 17:48 Gray Vugrin, [email protected] menulis:

Alex, ada beberapa solusi untuk utas ini. Apa yang sudah kamu coba? Itu
mungkin juga layak membuat tiket baru setelah Anda memiliki detail lebih lanjut sejak itu
utas ini sangat panjang, jika tidak ada solusi di atas yang berfungsi.

Pada Jum, 17 Mar 2017, 10.29 Alex Sinelnikov [email protected]
menulis:

Ada kemajuan dalam hal ini?

-
Anda menerima ini karena Anda disebutkan.
Balas email ini secara langsung, lihat di GitHub
<
https://github.com/facebook/react-native/issues/7495#issuecomment -287419487
,
atau nonaktifkan utasnya
<
https://github.com/notifications/unsubscribe-auth/ADJE_HLDGQEplAduqm3Zx5L74dv99mnhks5rmsLjgaJpZM4Ibete

.

-
Anda menerima ini karena Anda berkomentar.
Balas email ini secara langsung, lihat di GitHub
https://github.com/facebook/react-native/issues/7495#issuecomment-287424598 ,
atau nonaktifkan utasnya
https://github.com/notifications/unsubscribe-auth/AACQ6DgWuUzw4hj7rmr8LDzcRHjEheIcks5rmsdSgaJpZM4Ibete
.

Terkadang berhasil, beberapa tidak. Saya telah mencoba SEMUA solusi di atas & tidak ada solusi yang dapat diandalkan sejauh ini. Ini benar-benar membuatku gila :(

Apakah ada nativemodule yang mereplikasi fungsi seperti getCurrentPosition? Saya mencari repo lain karena saya tidak bisa menulis kode java.

watchPosition bermasalah jika Lokasi tidak diaktifkan. Itu tidak pernah membuang batas waktu meskipun saya menetapkan batas waktu = 1000

Pada 'getCurrentPosition', ini akan membuang waktu tunggu, jadi saya bisa memicu dialog Lokasi untuk mengaktifkan GPS. Tapi sekarang saya beralih dari 'getCurrentPosition'

EDIT:
Saya telah mencoba semua variasi dan sekarang saya tahu di mana masalahnya. Saya dapat membuatnya berfungsi jika menghapus parameter ketiga DAN mengatur mode Lokasi ke Akurasi Tinggi atau Penghematan Baterai. Jika tidak, itu tidak berfungsi. Saya tidak tahu bagaimana cara memberi tahu pengguna untuk memilih Akurasi Tinggi atau Hemat Baterai daripada Hanya Perangkat, karena memiliki cara berbeda untuk mengakses menu ini untuk setiap vendor.

Ada komentar di atas untuk menambahkan enableHighAccuracy: false di parameter ketiga, tetapi tidak berfungsi untuk opsi Akurasi Tinggi, Hemat Baterai, atau Hanya Perangkat. Saya pikir parameter ketiga di geolokasi tidak berguna untuk perangkat nyata.

location-mode-100621707-large

Dalam kasus saya, hapus maximumAge memecahkan masalah.

Menghapus maximumAge berfungsi, tetapi ini adalah solusi sementara. Berfungsi dengan baik dalam banyak kasus, tetapi mengalami beberapa masalah dalam produksi di mana pada peta lokasi pengguna saat ini akan benar-benar tidak aktif karena menggunakan koordinat lama. Alih-alih, beralih ke implementasi asli.

@nigelnindo apa maksud implementasi Native? dalam RN atau melakukannya langsung di Android?

@ L3V147H4N langsung di Android. Ada beberapa pustaka yang dapat Anda gunakan untuk ini, tetapi saya telah melihat bahwa sebagian besar tidak kompatibel dengan versi terbaru RN. Jika ada cukup minat dalam hal ini, saya tidak keberatan meluangkan waktu membuat modul sederhana untuk membantu menyelesaikan masalah geolokasi di Android yang diuraikan di utas ini.

Mungkin Anda dapat memeriksa https://github.com/mauron85/react-native-background-geolocation#getlocationssuccess -fail

Ini adalah implementasi asli dan bekerja dengan baik bagi saya.

Saya pikir hampir semua orang di utas ini akan sangat berterima kasih kepada @nigelnindo
https://github.com/nigelnindo

Pada hari Senin, 3 Apr 2017 pukul 17:34 Nigel Nindo [email protected] menulis:

@ L3V147H4N https://github.com/L3V147H4N langsung di Android. Ada
beberapa pustaka yang dapat Anda gunakan untuk ini, tetapi saya paling sering melihatnya
tidak kompatibel dengan versi terbaru RN. Jika ada cukup
tertarik pada hal ini, saya tidak keberatan meluangkan waktu untuk membuat modul sederhana
untuk membantu menyelesaikan masalah geolokasi di Android yang diuraikan di utas ini.

-
Anda menerima ini karena Anda berkomentar.
Balas email ini secara langsung, lihat di GitHub
https://github.com/facebook/react-native/issues/7495#issuecomment-291198134 ,
atau nonaktifkan utasnya
https://github.com/notifications/unsubscribe-auth/AACQ6BwArzmfCk3TXfiRMp7kpdwMLM81ks5rsR-hgaJpZM4Ibete
.

Frustrasi ... Saya mencoba menggunakan navigator.geolocation.getCurrentPosition tetapi saya terus mendapatkan kesalahan:
Permintaan lokasi habis waktunya. Untuk Android, iOS berfungsi dengan baik.
Saya sudah mencoba menyetel enableHighAccuracy ke True / False, menghapus argumen ke-3, telah menambahkan izin lokasi KURSUS dan FINE di AndroidManifest.

Android SDK 23, Alat pembuatan 25.0.0
Bereaksi 16.0.0-alpha.6
RN 0.43.3

Terima kasih atas bantuan Anda!

Selamat datang di utas Douglas, sayangnya getCurrentPosition bukan
dapat diandalkan di Android seperti yang telah Anda temukan.
Lihat beberapa solusi sebelumnya di thread yang digunakan
watchPosition sebagai gantinya

Terima kasih @raldred.
watchPosition tampaknya berfungsi, hargai bantuannya!

@douglaswett sama- sama. Mudah-mudahan akan ada solusi kuat untuk getCurrentPosition segera.

Dapatkah saya menggunakan watchPosition lalu clearWatch segera setelah mendapatkan posisi geografis? Saya kesulitan melakukan ini, karena clearWatch hanya dapat dipanggil di componentDidMount

@ yaa. Itu yang saya lakukan.
Juga navigator.geolocation.clearWatch dapat dipanggil kapan saja.
Simpan saja referensi ke watchID di komponen Anda yang dikembalikan oleh panggilan ke watchPosition

Dari dokumen yang saya baca di https://facebook.github.io/react-native/docs/geolocation.html , saya tidak tahu cara mendapatkan this.watchID di dalam watchPosition callback. Kasus penggunaan saya memicu clearWatch segera setelah menerima nilai baru.

@pewh inilah implementasi saya. Itu tidak sempurna tapi berhasil.
https://gist.github.com/raldred/b08cf60712eb87d81f05437444dff4ae

@raldred mencoba solusi Anda dan solusi orang lain, tidak ada yang berhasil

Ada solusi tentang ini? coba semuanya di sini dan tampaknya tidak ada yang berhasil, tolong bantu! jika Anda dapat membagikan beberapa cuplikan atau sesuatu

@ gerard0315 Anda berhasil menyelesaikan ini?

Sepertinya berfungsi pada ponsel Android asli untuk saya

Dapatkan Outlook untuk iOS https://aka.ms/o0ukef


Dari: Jorge Almonacid [email protected]
Dikirim: Selasa, 9 Mei 2017 14.29.56
Kepada: facebook / react-native
Cc: Ujwal Setlur; Komentar
Subjek: Re: [facebook / react-native] Geolocation 'enableHighAccuracy' di Android selalu habis waktu (# 7495)

Ada solusi tentang ini? coba semuanya di sini dan tampaknya tidak ada yang berhasil, tolong bantu! jika Anda dapat membagikan beberapa cuplikan atau sesuatu

-
Anda menerima ini karena Anda berkomentar.
Balas email ini secara langsung, lihat di GitHub https://github.com/facebook/react-native/issues/7495#issuecomment-300307037 , atau nonaktifkan utas https://github.com/notifications/unsubscribe-auth/ AFkMXWcokXoYDpsw28UaiUSDtCvRpE3Rks5r4NrUgaJpZM4Ibete .

Saya sudah membagikan cuplikan saya yang berfungsi pada perangkat nyata yang sedang berjalan
Android 4-7.

Pada Tue, 9 Mei 2017, 22:29 Jorge Almonacid, [email protected] menulis:

Ada solusi tentang ini? coba semuanya di sini dan sepertinya tidak ada yang berhasil,
tolong bantu! jika Anda dapat membagikan beberapa cuplikan atau sesuatu

-
Anda menerima ini karena Anda disebutkan.
Balas email ini secara langsung, lihat di GitHub
https://github.com/facebook/react-native/issues/7495#issuecomment-300307037 ,
atau nonaktifkan utasnya
https://github.com/notifications/unsubscribe-auth/AACQ6HSlN8YS_jE6NY9w2vuk7Hv4Wjwfks5r4NrSgaJpZM4Ibete
.

Saat ini, dimungkinkan untuk mendapatkan pembaruan (di emulator android) hanya jika Anda mengubah semua parameter (Bujur, Lintang, Ketinggian) pada saat yang bersamaan. Jika Anda hanya mengubah satu atau dua - nothing works .

Ada kesalahan bawaan dalam cara React-Native menangani lokasi di Android. (iOS sepertinya kekurangan masalah ini, 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

sementara

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

Pada kenyataannya Anda membutuhkan kedua / semua penyedia jika Anda menginginkan lokasi yang sangat tepat. Kemudian Anda ingin membandingkan akurasi, stempel waktu, dan menerima lokasi yang lebih akurat dan segar.

Ada dua cara untuk melakukan ini:

In React:

Siapkan dua variabel watchID -> watchIDGPS dan watchIDNetwork . Kemudian atur dua pengamat, satu dengan enableHighAccuracy=true dan enableHighAccuracy=false ini akan mengembalikan penyedia GPS, dan penyedia Jaringan (jaringan akan lebih akurat di dalam ruangan)

Masalah dengan cara React adalah ia melakukan ini di thread JS; Ini mungkin membekukan aplikasi Anda di perangkat yang kekurangan sumber daya. Bagaimanapun juga itu berhasil.

Dalam Native:

Anda akan ingin menulis ulang LocationModule.java sebagai modul khusus untuk menangani penyedia pilihan Anda dan melaporkan lokasi kembali ke mLocationListener terlepas dari penyedia itu. Sampai React-Native memperbaiki "masalah" ini.

@ralred , Terima kasih atas cuplikannya, tetapi apakah objek AndroidPermissions itu?

Saya mencoba semua solusi, semuanya gagal ....
tiba-tiba teringat aplikasi saya memiliki modul peta, peta baidu, peta Cina (map.baidu.com) seperti peta google, itu bisa mendapatkan penanda dan lokasi saat ini !!! Akhirnya saya berhasil ~

Anda dapat mencarinya dengan github, react-native-baidu-map

impor {
MapView, // tampilan peta (Saya tidak perlu)
MapTypes, // ketik 2D atau 3D (Saya tidak perlu)
Geolocation // api tentang lokasi (saya perlu)
} dari 'react-native-baidu-map';

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

Saya tidak tahu apakah dapat bekerja di negara lain, hanya dengan berpikir dengan menggunakan beberapa aplikasi peta, Anda dapat mencoba peta-bereaksi-asli atau peta lain ...

Tidak ada yang berfungsi, watchPosition bahkan tidak akan dipanggil di Android, iOS berfungsi dengan sempurna. Ini sudah RN v0.45.0 (saat ini saya menggunakan 0.44.0) dan masih belum terpecahkan? Ayolah!

@bayu_joo
Tidak ada yang berfungsi dengan baik, saya menggunakan versi 0.44. Sudahkah Anda mencoba memperbarui ke v0.45?

@VietDucPhan Baru saja bekerja, benar-benar acak 😓. Masih di 0.44.0

@rexlow Oh bagus untukmu. Sekarang, saya hanya butuh keberuntungan untuk menyerang saya.

Sudahkah Anda mencoba menghapus struktur opsi? Itulah satu-satunya hal yang berhasil bagi saya.

Dapatkan Outlook untuk iOS https://aka.ms/o0ukef


Dari: viet_duc_phan [email protected]
Dikirim: Minggu, 18 Juni 2017 23.26.15
Kepada: facebook / react-native
Cc: Ujwal Setlur; Komentar
Subjek: Re: [facebook / react-native] Geolocation 'enableHighAccuracy' di Android selalu habis waktu (# 7495)

@rexlow https://github.com/rexlow Oh bagus untukmu. Sekarang, saya hanya butuh keberuntungan untuk menyerang saya.

-
Anda menerima ini karena Anda berkomentar.
Balas email ini secara langsung, lihat di GitHub https://github.com/facebook/react-native/issues/7495#issuecomment-309349488 , atau nonaktifkan utas https://github.com/notifications/unsubscribe-auth/ AFkMXYI2vukJgcTLkBeNdXdclgFbgo1sks5sFhSHgaJpZM4Ibete .

@rexlow @ ujwal-setlur Hanya ingin memberi tahu kalian bahwa saya beruntung. itu bekerja dan benar-benar acak. Saya tidak mengubah apa pun.

Sudahkah Anda mencoba di perangkat nyata?

Pada Tue, 20 Jun 2017, 19:18 viet_duc_phan, [email protected] menulis:

@rexlow https://github.com/rexlow @ ujwal-setlur
https://github.com/ujwal-setlur Hanya ingin memberi tahu kalian
keberuntungan menyerang saya. itu bekerja dan benar-benar acak. Saya tidak berubah
apa pun.

-
Anda menerima ini karena Anda disebutkan.
Balas email ini secara langsung, lihat di GitHub
https://github.com/facebook/react-native/issues/7495#issuecomment-309843462 ,
atau nonaktifkan utasnya
https://github.com/notifications/unsubscribe-auth/AACQ6OVyeCsOgd-qevP9CrP9XJMhwaxsks5sGAz3gaJpZM4Ibete
.

@raldred Selalu diuji di perangkat nyata.

@VietDucPhan, dapatkah Anda menyiapkan contoh yang mereproduksi masalah?

Pada Selasa, 20 Jun 2017, 20:52 viet_duc_phan, [email protected] menulis:

@raldred https://github.com/raldred Selalu diuji di perangkat nyata.

-
Anda menerima ini karena Anda disebutkan.
Balas email ini secara langsung, lihat di GitHub
https://github.com/facebook/react-native/issues/7495#issuecomment-309870269 ,
atau nonaktifkan utasnya
https://github.com/notifications/unsubscribe-auth/AACQ6N5SVbYeDEeY9FRnTQSrvpLwKL5aks5sGCLmgaJpZM4Ibete
.

@raldred laporan asli dalam rantai ini memiliki cuplikan kode:

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

Itu juga gagal untuk saya. Satu-satunya cara untuk menyelesaikannya adalah dengan tidak menyertakan argumen opsi:

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

@dreallday benar, react native menangani lokasi android dengan buruk. Namun, daripada menangani kedua penyedia secara manual, akan lebih baik jika menggunakan Fused API yang menggabungkan informasi dari penyedia dengan sihir.

Saya menemukan react-native-fused-location sangat berguna untuk membuat permintaan lokasi di Android.

@raldred Hai maaf, Saya belum memeriksa email baru-baru ini tetapi tidak berfungsi lagi.

@ derman232 Akankah react-native-fused-location berfungsi saat aplikasi beralih ke latar belakang?

@rexlow maaf tidak tahu jawabannya, bukan fitur yang saya butuhkan untuk aplikasi saya.

Hanya memberikan masukan saya tentang bagaimana saya menyelesaikan masalah ini:

  • Masalahnya adalah android> = 6.0 membutuhkan izin untuk diberikan selama runtime
  • Pertanyaan stackoverflow ini memiliki detail lebih lanjut: pertanyaan
  • Saya menggunakan modul PermissionsAndroid dari React Native untuk mendapatkan izin

Sekarang semuanya bekerja.

Hai,
Tidak ada yang berhasil. Saya mencoba segalanya.
Mohon saran.
Terima kasih

Saya sangat ingin membantu menyelesaikan masalah ini untuk orang-orang.
Kami memiliki 3 aplikasi asli bereaksi yang menggunakan lokasi secara langsung. Tanya Jawab tentang 30+ perangkat android nyata yang menjalankan Gingerbread hingga Nougat.
Semua berfungsi dengan baik selama pengujian pengguna, sejak itu kami tidak memiliki laporan masalah dari pengguna langsung.

@adriancuco dapatkah Anda membagikan implementasi & manifes Anda sehingga kami dapat mencoba dan membantu lebih lanjut.

  • Versi RN?
  • Versi Android apa yang bermasalah?
  • Perangkat apa yang bermasalah?

Akan ada kerumitan dengan implementasi atau konfigurasi perangkat Anda, ini masalah mencari tahu apa itu.

raldred,

Maaf. Salahku!
Sebelum bunuh diri, saya memutuskan untuk memeriksa pengaturan lokasi di ponsel saya, seperti yang saya baca beberapa hari yang lalu, dan itu baru saja mengaktifkan GPS. ; (
Jadi saya mengaktifkan GPS, Wifi, dll dan semuanya dan sekarang berfungsi dengan baik.
Sangat menghargai itu.
Terima kasih banyak

Adakah pembaruan tentang masalah ini?

Masih belum ada solusi.


Dari: adriancuco [email protected]
Dikirim: Selasa, 4 Juli 2017 14.44.28
Kepada: facebook / react-native
Cc: Marouen SAYARI; Komentar
Subjek: Re: [facebook / react-native] Geolocation 'enableHighAccuracy' di Android selalu habis waktu (# 7495)

raldred,

Maaf. Salahku!
Sebelum bunuh diri, saya memutuskan untuk memeriksa pengaturan lokasi di ponsel saya, seperti yang saya baca beberapa hari yang lalu, dan itu baru saja mengaktifkan GPS. ; (
Jadi saya mengaktifkan GPS, Wifi, dll dan semuanya dan sekarang berfungsi dengan baik.
Sangat menghargai itu.
Terima kasih banyak

-
Anda menerima ini karena Anda berkomentar.
Balas email ini secara langsung, lihat di GitHub https://github.com/facebook/react-native/issues/7495#issuecomment-312881724 , atau nonaktifkan utas https://github.com/notifications/unsubscribe-auth/ AD79YGcm507EtBxrFHHJkEc-OBvRsjKmks5sKkG7gaJpZM4Ibete .

@ m-sayari Anda akan berkunjung untuk memberi kami sedikit lebih banyak informasi untuk membantu.

  • Versi RN
  • Versi Target Android Build
  • Versi Perangkat Android
  • Perangkat tempat Anda mengalami masalah ini.

Mereka akan menjadi sesuatu yang spesifik untuk implementasi / penyiapan Anda yang menyebabkan masalah. Seperti yang saya sebelumnya, kami memilikinya bekerja tanpa masalah di beberapa aplikasi langsung.

Terselesaikan di sini! RN 0.45.1 menggunakan Redmi 4A dengan Android 6.

Saya mengalami masalah ini memanggil navigator.geolocation.getCurrentPosition () di dalam componentDidMount ()
Sebagai ganti getCurrentPosition, panggil saja watchPosition () dengan parameter yang sama.

@rumahguguk
Versi RN
0.46
Versi Target Android Build
api 22
Versi Perangkat Android
6.0.1
Perangkat tempat Anda mengalami masalah ini.
Nexus 5

Memanggil getCurrentLocation tanpa 'opsi' parameter ketiga menyelesaikan masalah saya. Tidak berhasil bagi saya yang menyetel 'enableHighAccuracy' sebagai salah

Halo @raldred , masalah yang sama seperti yang dilaporkan pada RN 0,47.

  • Versi RN: 0.47.0
  • Versi Android Build Target tetap menggunakan default RN:
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 22
  • Versi Perangkat Android: 6.0.1, 7.0
  • Perangkat tempat Anda mengalami masalah ini:

    • Nexus 5 dengan Android 6.0.1

    • Xiaomi Redmi 3S dengan Android 6.0.1

    • Android Emulator dengan Android 7.0

getCurrentPosition berfungsi dengan baik saat saya menyetel mode lokasi "Hanya perangkat" di setelan perangkat, tetapi berhenti berfungsi ( Location request timed out ) saat mode disetel ke "Akurasi tinggi".

Saya perlu menghilangkan parameter ketiga untuk mendapatkan getCurrentPosition bekerja setidaknya dalam mode Hanya Perangkat:

    navigator.geolocation.getCurrentPosition(setLocation);

Saya berasumsi ini dan itu berhasil untuk saya, belum diuji dengan kasus yang berbeda.
Jadi melihat opsi saya, saya menemukan bahwa ada dua item yang bertentangan maximumAge dan enableHighAccuracy , saya pikir kedua opsi ini sama dalam cara yang sedikit berbeda, sementara usia maksimum memastikan Anda dapatkan geolokasi terbaru berdasarkan pengaturan Anda meskipun akurasinya rendah, enableHighAccuracy memastikan Anda mendapatkan lokasi terkini dan akurat, saya mengalami masalah yang sama dengan opsi berikut.
{enableHighAccuracy: true, timeout: 20000, maximumAge: 60000} sampai saya menghapus usia maksimum dan meninggalkan enableHighAccuracy semoga ini membantu seseorang.

Saya baru saja membuat react-native dari master untuk mencoba apakah commit 7e11bad86fd21ce1a8408218e66ce85993d9db69 memperbaiki masalah ini. Sayangnya, saya masih mendapatkan kesalahan yang sama seperti sebelumnya.

Posisi @olieidel Watch benar-benar berfungsi, juga pastikan perangkat Anda telah memberikan akses lokasi ke aplikasi, dan bahwa layanan lokasi Anda diaktifkan.

@olieidel Anda dapat memeriksa apakah aplikasi Anda memiliki akses ke izin lokasi dengan API berikut, PermissionsAndroid , Anda akan memeriksa terlebih dahulu dan kemudian menanyakan apakah tidak diberikan.

@mrbarde terima kasih atas balasan cepatnya!

Ah, setelah seharian melakukan debug, berikut adalah temuan saya dan solusi yang relevan:
RN 0.46.4, Perangkat: Nexus 5X, API 25

Mode lokasi: Hanya perangkat

  • getCurrentPosition , enableHighAccuracy: true : berfungsi saat sinyal GPS tersedia, jika tidak waktu habis
  • getCurrentPosition , enableHighAccuracy: false : tidak berfungsi (batas waktu). mungkin membutuhkan layanan lokasi (mode Lokasi! = hanya perangkat).
  • watchPosition , enableHighAccuracy: true : berfungsi saat sinyal GPS tersedia, jika tidak batas waktu
  • watchPosition , enableHighAccuracy: false : tidak berfungsi

Mode lokasi: Akurasi Tinggi

  • getCurrentPosition , enableHighAccuracy: true : berfungsi saat sinyal GPS tersedia, jika tidak waktu habis. Dapat mengembalikan lokasi yang lebih lama, tergantung pada pengaturan maximumAge .
  • getCurrentPosition , enableHighAccuracy: false : berfungsi setelah 5-6s (seperti yang sudah dilaporkan).
  • watchPosition , enableHighAccuracy: true : berfungsi saat sinyal GPS tersedia, jika tidak waktu habis
  • watchPosition , enableHighAccuracy: false : bekerja

Ringkasan
Jika mode Lokasi Anda adalah Perangkat saja, Anda akan selalu memiliki sinyal GPS. Dalam semua kasus lain, Anda memerlukan layanan lokasi (Mode lokasi! = Khusus perangkat).
Saya kira ini semua adalah perilaku yang diharapkan dari API Lokasi dan saya baru saja menemukan padanan bumi tidak datar, namun, ini neraka untuk debug jika Anda memiliki perangkat yang diatur dengan mode Lokasi == Hanya perangkat (an emulator, perangkat yang baru dikonfigurasi) dan Anda sedang duduk di ruangan tanpa sinyal gps yang tersedia. Dalam hal ini, Anda hanya akan mendapatkan waktu tunggu.

Solusi
Seperti yang sudah dijelaskan di utas ini, saya juga menggunakan dua pendengar watchPosition dengan nilai yang berbeda untuk enableHighAccuracy dan cukup mengambil nilai pertama dari keduanya, lalu menghapusnya. Bermain-main dengan pendekatan ini, saya mendapat kesan bahwa kedua pendengar sebenarnya mengembalikan lokasi yang sama, tetapi toleransi debugging saya untuk hari itu habis ...
Ini mengasumsikan bahwa mode Lokasi Anda bukan hanya Perangkat.

@olieidel Tentu, dan saya bertanya-tanya mengapa tidak ada yang menggunakan API Geolokasi asli bereaksi secara langsung, Jika tidak berguna atau tidak berfungsi, saya pikir hal yang tepat adalah menggantinya dengan navigator.geolocation karena ini berfungsi keajaiban, coba buat permintaan tarik dengan solusi Anda untuk melihat apakah Facebook akan menyukainya. Dan terima kasih telah bekerja ekstra untuk menggali lebih dalam.

Saya butuh beberapa saat untuk mereproduksi masalah ini secara konsisten.

Saya mengalami masalah ini hanya pada ponsel Samsung dengan Android 5.1 & 6.0 saat mode lokasi disetel ke "Akurasi Tinggi" dan menggunakan API posisi saat ini saat berada di dalam ruangan tanpa sinyal GPS. Ini berfungsi dengan baik pada ponsel Oppo atau berada di luar ruangan dengan sinyal GPS yang jelas bahkan dengan mode "Akurasi Tinggi" aktif.

Saya akan menguji beberapa solusi yang disarankan di utas ini segera.

@mrbarde hanya untuk mengklarifikasi: Saya menggunakan navigator.geolocation . :)

@olieidel Saya tahu, hanya dengan mengatakan bahwa dokumentasinya harus mencerminkan navigator.geolocation dan bukan Geolocation Api.

Hai teman-teman, sadari bahwa di Android, Anda mungkin memiliki izin untuk mengakses lokasi, tetapi pengguna telah menonaktifkan lokasi dari pengaturan OS. Jadi memanggil navigator.getCurrentPosition() masih akan kehabisan waktu.

Berikut cuplikan Java dengan dua metode. checkIfLocationAvailable yang memeriksa apakah pengguna mengaktifkan lokasi di pengaturan atau tidak. requestUserToActivateLocation akan meminta pengguna untuk mengaktifkan lokasi.

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");
        }
    }
}

Sejak saya mulai menggunakan ini, saya tidak mengalami masalah dengan lokasi dengan Android. Semoga ini akan membantu seseorang.

Tentu saja Anda perlu menambahkan compile 'com.google.android.gms:play-services-location:x.x.x' ke app/build.gradle , dan membuat modul asli seperti yang dijelaskan di sini . Tidak yakin apakah ini cukup fungsionalitas untuk membuat pustaka npm mandiri.

Hai @nigelnindo sebenarnya ada API React Native untuk itu yang disebut PermissionsAndroid ,
Anda dapat memeriksa untuk memastikan pengguna telah mengaktifkan izin lokasi untuk aplikasi tersebut
Saya memiliki masalah yang sama dengan yang Anda tunjukkan, jadi yang saya lakukan untuk menyelesaikannya adalah sebagai berikut.

Saya pertama kali memeriksa untuk melihat apakah pengguna telah memberikan akses aplikasi ke lokasi perangkat

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

Dan kemudian mengaktifkan fungsi dengan kode di bawah ini, ini akan meminta pengguna untuk melakukannya
berikan akses lokasi ke aplikasi.

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
});

Ini melakukan trik untuk saya dan sekarang saya tidak mendapat masalah lokasi, semoga ini membantu seseorang di luar sana.

Hai @mrbarde , sebagai tambahan, saya menggunakan pustaka PermissionsAndroid sebagai tambahan untuk cuplikan di atas. Seperti yang saya sebutkan sebelumnya:

Hai teman-teman, sadari bahwa di Android, Anda mungkin memiliki izin untuk mengakses lokasi, tetapi pengguna telah menonaktifkan lokasi dari pengaturan OS.

Dengan kata lain, aplikasi Anda dapat memiliki izin untuk mengakses lokasi yang diperoleh dengan PermissionsAndroid , tetapi jika pengguna mematikan lokasi baik dari pintasan bilah status atau dengan membuka Settings -> Location -> Off getCurrentPosition() call akan tetap waktu habis. Ini membantu dengan kasus tepi itu.

@nigelnindo yh kalau begitu maka saya akan sangat menyarankan solusinya, mungkinkah anda melakukan PR dengan ini? Maksud saya, ini benar-benar dapat menghemat banyak waktu, saya menggunakan paket eksternal untuk menangani ini karena saya tidak dapat menulis Java, meskipun saya benar-benar berharap saya punya waktu untuk mempelajarinya. Jika ini secara resmi di React, saya lebih suka itu, saya menjadi skeptis tentang mengandalkan perpustakaan pihak ketiga untuk hal-hal inti seperti ini, saya khawatir tentang konsistensi.

coba ubah (Android) TargetSdkVersion di build.gradle (app) di bawah 23 (16-22) . dan itu akan berhasil!

karena, kita perlu menggunakan izin dari file AndroidManifest. dan file AndroidManifest hanya dipanggil di SDK di bawah 23 (16-22).

dan jangan lupa untuk menambahkan:

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

Jangan hapus parameter maxAge!

Jika Anda melakukannya, modul GPS akan mengembalikan hasil cache terakhir sampai mendapatkan posisi sebenarnya dari satelit. Ini mungkin posisi cache di aplikasi lain yang jauh dari posisi Anda sebenarnya. Dan jika Anda mencoba menyimpan beberapa trek, beberapa poin pertama Anda mungkin menunjukkan posisi yang jauh dari posisi Anda yang sebenarnya.

@pavelpashkovsky Dapatkah Anda menunjukkan beberapa fakta atau dokumen resmi untuk mendukung klaim Anda?

@rexlow Saya baru saja menjelaskan hasil tes saya, karena sekitar 1 minggu yang lalu saya mengalami masalah yang sama dan menemukan topik ini.

Saya menjalani sekitar 30 tes. Dan saya mendapat 3-4 kasus dengan posisi salah 1-5 detik pertama (sampai GPS menemukan sinyal satelit)

@ Pavelpashkovsky Saya sekarang menghadapi masalah yang sama juga. Meskipun saya memiliki maximumAge: 1000 dalam konfigurasi saya. Sepertinya ini menyimpan lokasi sebelumnya seperti yang Anda katakan.

@ rexlow Anda benar. Dalam kasus Anda, GPS mempertahankan posisi 1 detik terakhir.

Tetapi hasil terbaik saya dapatkan dengan usia maksimum: 0 ketika gps tidak menyimpan hasil apa pun dan selalu mencoba untuk mendapatkan posisi sebenarnya (atau kesalahan jika tidak bisa mendapatkan posisi dari satelit).

Saya dapat mengonfirmasi bahwa menghapus maksimum dapat menyebabkan masalah pada ponsel Oppo yang saya uji juga. Ini akan menggunakan cache yang sangat lama.

Itu terjadi pada saya selama ini. Ternyata izin geolokasi saya dimatikan di Info Aplikasi -> Izin. Saya bertanya-tanya mengapa hal itu terjadi, tetapi tampaknya izin tersebut menggantikan izin yang kami minta saat runtime. Mungkin orang lain juga mengalami masalah ini

hai (maaf untuk bahasa inggris saya).
saya pikir meningkatkan maximumAge akan memecahkan masalah.

RN 0,48 Dokumen geolokasi:
Geolocation API memperluas spesifikasi web: https://developer.mozilla.org/en-US/docs/Web/API/Geolocation

dan menurut:
https://developer.mozilla.org/en-US/docs/Web/API/PositionOptions/enableHighAccuracy
&
https://developer.mozilla.org/en-US/docs/Web/API/PositionOptions/timeout
& khusus :
https://developer.mozilla.org/en-US/docs/Web/API/PositionOptions/maximumAge

dalam skenario dengan opsi ini:
{enableHighAccuracy: true, timeout: 10000, maximumAge: 30000}

chip GPS perangkat mencoba menyambung ke satelit. jika koneksi dibuat dalam periode waktu habis (10000 ms) garis lintang dan bujur akan dikembalikan tanpa kesalahan seperti yang dikatakan @RoBYCoNTe : Issuecomment-220580494 tetapi jika koneksi GPS gagal atau waktu habis, perangkat mencoba mengembalikan garis lintang dan bujur yang di-cache dengan usia maksimum yang ditetapkan opsi (30000 ms). jika sesuatu ada akan dikembalikan lain kode kesalahan 3 dikembalikan dengan kesalahan batas waktu di subjek.

Saya pikir meningkatkan batas waktu (setidaknya 25000 ms) untuk koneksi dan khususnya meningkatkan maximumAge (setidaknya 3600000 ms = 1 jam) adalah solusi terbaik!

{enableHighAccuracy: true, timeout: 25000, maximumAge: 3600000} bekerja untuk saya

_emulator config_: selama periode waktu tunggu, Anda harus mengirim informasi lokasi virtual (lintang dan bujur) melalui menu Lokasi di setelan emulator. (ini akan meniru koneksi satelit)

{ enableHighAccuracy: true, timeout: 60000, maximumAge: 1200 } bekerja untuk saya. Bagi saya, ini bukan tentang usia maksimal, ini tentang lamanya saya bersedia menunggu.

(Hanya Android)
Masalah ini bukan bug menurut saya.
Di React Native, geolokasi berfungsi sebagai berikut:

  • HighAccuracy berarti Lokasi GPS
  • Saat dinonaktifkan, ia mengambil lokasi dari Penyedia Jaringan
  • maximumAge memungkinkan Anda untuk tidak mengambil posisi baru setiap saat (yang menghabiskan baterai & waktu) tetapi bergantung pada posisi cache

Pada dasarnya Penyedia GPS lebih lambat dari Penyedia Jaringan dan tidak selalu berfungsi tergantung pada lokasi Anda (jika GPS tidak dapat menjangkau telepon, Anda akan mendapatkan waktu tunggu). Penyedia Jaringan lebih cepat, lebih mudah diakses tetapi sebagai gantinya, akurasinya rendah (yang terburuk yang saya alami adalah 2000 meter).

Jika Anda mendapat waktu tunggu menggunakan akurasi tinggi, itu berarti Anda tidak dapat dijangkau oleh GPS.
Dalam hal ini, pertimbangkan untuk menonaktifkannya secara default dan perbarui lokasi karena semakin akurat. Pengguna Anda tidak akan menunggu dalam kasus ini.

Dalam kasus saya, saya menerapkan pengamat saya sendiri, membandingkan lokasi dan selalu mengembalikan yang lebih akurat. Masalah dengan implementasi RN default adalah implementasi RN bergantung pada Penyedia GPS atau Penyedia Jaringan tetapi tidak mengembalikan kompromi keduanya. Anda mungkin harus mengerjakannya baik di JS atau Native.

Semoga membantu.

Diuji di Android saja.

Saya telah berhasil membuatnya berfungsi dengan kasus-kasus berikut dan memastikan Lokasi diaktifkan:

  • Jika Anda menjalankan aplikasi melalui Android Emulator, Anda harus meletakkan opsi atau aplikasi akan gagal.
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}
);

Saya hanya menggunakan kontrol tambahan untuk mengirim lokasi yang saya inginkan ke aplikasi.

  • Jika Anda menjalankan aplikasi melalui telepon seluler asli, Anda harus menghilangkan opsi atau itu akan gagal.
navigator.geolocation.getCurrentPosition(
    (position) => {
        this.setState({currentLocation: {lat: position.coords.latitude, lng: position.coords.longitude}})
    }, (error) => {
        alert("Geolocation error: "+error.message);
    }
);

Ini akan mendapatkan lokasi Anda saat ini

Kami mengalami masalah yang sama!

Apakah perbaikan untuk ini akan datang pada rilis yang akan datang?

Saya mencoba beberapa solusi yang diusulkan ( contoh , contoh , contoh dan contoh ) dan tidak ada yang menyelesaikan masalah. Tetapi saya harus mengatakan bahwa saya tidak menemukan referensi apa pun untuk skenario berikut:

Aplikasi

  • Android 6.x
  • Bereaksi 16.1.0
  • React-Native 16.50.3

Skenario Penggunaan

  • Ponsel Android memiliki _tidak ada SIM-Card_, mereka _ milik perusahaan _ dan hanya diizinkan untuk menyambung ke WIFI.

Saya masih mendapatkan kesalahan Geolocation timed out, code 3 ...

Ada yang memecahkan ini?

_Update_ (2017-11-13):

Saya menyelesaikannya (setidaknya untuk sementara) dengan menyetel Settings >> Privacy >> Location >> Mode menjadi High accuracy

Hai.
Saya menemukan solusi yang bagus!
Silakan baca komentar saya sebelumnya tentang masalah ini terlebih dahulu: # Issuecomment-331830285

Larutan:
Pertama panggil navigator.geolocation.getCurrentPosition dengan: {enableHighAccuracy: true, timeout: 60000, maximumAge: 0} sebagai PositionOptions , ini akan mengembalikan posisi sebenarnya saat ini.
jika permintaan sebelumnya habis waktunya, panggil navigator.geolocation.getCurrentPosition dengan: {enableHighAccuracy: false, timeout: 30000, maximumAge: 3600000} sebagai PositionOptions , ini akan mengembalikan posisi Akurasi Rendah sebagai fallback dan _ (menurut saya) _ tidak pernah habis!
Kode sampel:

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));

Semoga bermanfaat.

Saya mengalami masalah yang sama di sini!
Saya tidak bisa mengatur agar navigator.geolocation berfungsi di perangkat Android saya yang sebenarnya.

Saya yakin tidak ada yang perlu diperbaiki di sini, geolokasi berfungsi seperti yang diharapkan. Baca postingan saya di atas.

@Rewieer , Terima kasih atas balasan Anda!

Saya menggunakan kode ini untuk menguji navigator.geolocation di aplikasi saya.

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);

Saya selalu mendapatkan ERROR(3): Location request timed out .
menggunakan setiap kombinasi opsi.
Saya dapat melihat titik biru dari posisi saya di peta dan GPS berfungsi dengan baik tetapi saya tidak bisa mendapatkan posisi atau membuat navigator.geolocation berfungsi secara terprogram.

Masalah yang mungkin terjadi adalah:

  • konfigurasi simulator / telepon yang buruk
  • tidak di area yang terlindungi GPS (bekerja buruk di gedung atau di jalan dengan gedung besar misalnya)
  • waktu menyendiri terlalu dini

Menggunakan lokasi jaringan tampaknya berfungsi lebih baik dalam kasus ini. Apakah Anda mencoba mengambil posisi saat ini tanpa opsi? (yang akan menggunakan infrastruktur terkait jaringan untuk mendapatkan posisi)

Saya menggunakan perangkat android asli (versi 5.1)
Saya dapat menentukan posisi saya menggunakan react-native-maps (posisi titik biru yang benar pada peta di dalam aplikasi saya) + Saya dapat menggunakan aplikasi google maps dan pergi ke posisi saya (GPS berfungsi).
Saya menggunakan waktu tunggu yang besar, mengubah enableHighAccuracy menjadi benar dan salah, menghapus opsi ... dll. semuanya gagal mendapatkan navigator.geolocation untuk mendapatkan data.

Apakah Anda membuat tangan Anda kotor di Android dengan API asli?

16-11-2017 15:19 GMT + 01:00 Badis Merabet [email protected] :

Saya menggunakan perangkat android asli (versi 5.1)
Saya dapat menentukan posisi saya menggunakan react-native-maps (benar biru
posisi titik di peta di dalam aplikasi saya) + Saya dapat menggunakan aplikasi peta google dan
pergi ke posisi saya (GPS berfungsi).
Saya menggunakan waktu tunggu yang lama, mengubah enableHighAccuracy menjadi benar dan salah,
hapus opsi ... dll. semua gagal mendapatkan navigator.geolocation
data.

-
Anda menerima ini karena Anda disebutkan.
Balas email ini secara langsung, lihat di GitHub
https://github.com/facebook/react-native/issues/7495#issuecomment-344935653 ,
atau nonaktifkan utasnya
https://github.com/notifications/unsubscribe-auth/ALuPm5XL1tNLCniOMR4YAMI4ZC2fKxrsks5s3ESBgaJpZM4Ibete
.

Ya @Rewieer , saya setuju, Penyebab kesalahan adalah konfigurasi yang buruk.

Di emulator kita harus mengirim latitude dan longitude melalui setting emulator sebelum timeout!

Solusi saya # Issuecomment-331830285 pertama kali mencoba untuk mendapatkan posisi aktual saat ini melalui GPS dan koneksi satelit dan jika waktu permintaan habis (atau pada kesalahan lainnya) mencoba menggunakan infrastruktur terkait jaringan untuk mendapatkan posisi Akurasi Rendah .

@Rewieer Saya tidak pernah bekerja dengan API asli android. Saya hanya melakukan pengembangan JavaScript.

@badis harap kirim kode dan log kesalahan Anda.

@badis
RN Doc:
Untuk meminta akses ke lokasi, Anda perlu menambahkan baris berikut ke AndroidManifest.xml aplikasi Anda:

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

Bekerja dengan react-native, Anda harus tahu sedikit tentang lingkungan native yang mendasarinya, karena masalah seperti itu sering terjadi pada saya yang bekerja dengan React-Native.
Cara terbaik yang sebenarnya (menurut pengguna) adalah mengambil perkiraan di awal dan memperbaikinya seiring berjalannya waktu, karena GPS mungkin memerlukan waktu tergantung pada posisi Anda dan posisi satelit terdekat. Saya tahu lokasi jaringan mungkin tampak sangat kasar, tetapi saya rasa tidak semua orang tinggal di San Francisco :)

@Rewieer @hoorsa
Berikut adalah kode demo tempat saya melakukan pengujian fitur: https://github.com/badis/mobile-react-native
Lihatlah halaman Peta.
Saya hanya ingin tahu apakah kode itu benar dan berfungsi untuk orang lain.
Setelah itu saya akan mencoba di sisi saya untuk melihat apakah masalah ada di pengaturan dan lokasi perangkat saya.

Terima kasih semua !

@badis apakah Anda menambahkan <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> ke AndroidManifest.xml aplikasi Anda?

@badis Saya mengalami masalah yang sama kemarin. Ini berfungsi jika Anda hanya menghapus argumen terakhir (saya mengerti itu tidak ideal) seperti yang disarankan di https://github.com/facebook/react-native/issues/7495#issuecomment -228730196

Apa opsi default untuk android? mungkin itu bisa membantu menyelesaikan yang satu ini

Saya pikir kami menggunakan default ini (dari memeriksa LocationModule.java):

{
enableHighAccuracy: false, // Jangan gunakan GPS
maximumAge: Double.POSITIVE_INFINITY, // Terima lokasi cache mana pun
waktu tunggu: Long.MAX_VALUE,
DistanceFilter: 100
}

Kami juga mengalami kesalahan lokasi yang sama, Menonaktifkan parameter opsi ke-3 berfungsi untuk mode 'Akurasi Tinggi' dan 'Penghematan Baterai'. Namun Perangkat hanya gagal setiap saat. enableHighAccuracy to true gagal terlepas dari mode yang kami setel perangkatnya.

Apakah hal ini bahkan menggunakan FusedLocationProviderClient , seperti yang disarankan oleh situs Android Dev?

Menonaktifkan parameter opsi ke-3 berfungsi untuk mode 'Akurasi Tinggi' dan 'Penghematan Baterai'.

@mkpietrzyk jadi menghilangkan options menyelesaikannya untuk Anda dalam dua mode ini?

@bayu_joo

ya, untuk Android saya menggunakan parameter default ... tetapi memiliki waktu tunggu yang hampir tak terbatas dan usia maksimum untuk aplikasi saya adalah semacam pembunuh aplikasi karena saya perlu tahu di mana pengguna saya berada untuk memeriksa beberapa kondisi.

menggunakan solusi @hoorsa di sini memeriksa gps juga berfungsi. Namun itu sangat rumit untuk gps dan terkadang tidak merespons pada akurasi tinggi ... itulah sebabnya saya tidak menganggapnya berfungsi dengan baik tetapi hei, agak berfungsi.

Saya mengalami masalah yang sama, di mana saya perlu menyetel waktu tunggu menjadi jumlah waktu yang sangat tinggi agar dapat berfungsi, tetapi pengguna perlu mengakses informasi lebih cepat. Saat pertama kali membuat aplikasi, saya dapat masuk dalam waktu setengah detik bahwa izin untuk mengakses lokasi yang bagus valid. Penerapan lokasi yang bagus tidak berfungsi dengan baik di Android.
Sebagai referensi, saya sudah mencobanya dengan / tanpa parameter apa pun. Bahkan tanpa opsi tambahan apa pun, terkadang masih gagal memuat lokasi. Pengujian dilakukan pada One Plus One

Saya juga mengalami masalah waktu tunggu ini.

RN .50.3

Mencoba, Memanggil API dengan dan tanpa parameter maximumAge:

{enableHighAccuracy: true, waktu tunggu: 10000},

Saya juga menutup panggilan ini dengan permintaan izin sehingga itu tidak menjadi masalah:

IzinAndroid.request (
IzinAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,

Mode akurasi tinggi diaktifkan di perangkat.
Manifes memiliki izin yang benar.

Di Galaxy S7 saya - ini menyelesaikan lokasi dengan baik.
Di Pixel 2 saya - waktu habis setelah batas waktu 10 detik di lokasi yang tidak memiliki sinyal gps.
Di emulator - waktu habis setelah batas waktu 10 detik KECUALI saya membuka tab lokasi pada kontrol yang diperluas dan klik KIRIM untuk mengirim lokasi.

Tampaknya navigator.geolocation.getCurrentPosition TIDAK berfungsi saat tidak ada sinyal gps meskipun ada lokasi lama yang di-cache dari aplikasi lain yang sebelumnya menggunakan lokasi ..

Saya akan mengatasi ini dengan mencoba akurasi tinggi, lalu gagal ke akurasi tinggi jika gagal seperti yang telah dilakukan @olieidel .

Saya memiliki masalah yang sama dengan @jacksontbryan , tetapi getCurrentPosition memang menggunakan lokasi cache jika maximumAge dihilangkan.

Tampaknya berfungsi dengan baik pada Galaxy S7, tetapi tidak pada LG G6 saya. Pada LG itu hampir sepanjang waktu, jika maximumAge diatur. Jika maximumAge tidak disetel, ia menggunakan lokasi lama.

Edit: Sepertinya menghilangkan argumen opsi sama sekali berfungsi.

Saya menyarankan semua orang untuk menggunakan implementasi modul asli sendiri di Android untuk mendapatkan hasil yang stabil. Penerapannya cukup mudah, Anda akan mendapatkan lebih banyak kendali atas GPS dan tidak perlu khawatir aplikasi Anda tidak berfungsi pada beberapa perangkat.

    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 Saya mencoba membuat modul asli untuk cuplikan Anda, tetapi saya tidak dapat membuatnya berfungsi karena gagal dalam pembuatan. Saya telah memposting inti saya https://gist.github.com/pewh/1fd64c8f0b3797ef2b7a7046b5a5f974 dan berharap seseorang dengan baik hati membuat revisi pada inti saya. Terima kasih banyak & selamat natal!

Memanggil navigator.geolocation.getCurrentPosition tanpa opsi apa pun memecahkan masalah bagi saya. Saya hanya lulus sukses dan kesalahan panggilan balik.

Diuji di perangkat nyata dengan Android 5.1.

@ginex Anda yakin datanya baru? Ketika saya melakukan itu saya terkadang mendapatkan data lama. (Dikatakan saya berada di tempat saya satu jam yang lalu).

Ini benar-benar perlu diperbaiki!

Hai

Saya juga menghadapi masalah yang sama. Saya mendapatkan kesalahan waktu tunggu di beberapa perangkat. Saya telah meningkatkan batas waktu dari 2 detik menjadi 10 menit tetapi tanpa menunggu 10 menit, itu hanya membuat saya mengalami kesalahan.

Saya juga mencoba dengan enableHighAccuracy: false. Dalam hal ini, saya bisa mendapatkan lokasinya (kecuali dalam Mode Perangkat).

Saya juga mencoba tanpa melewatkan parameter. Saya bisa mendapatkan lokasi dalam kasus ini juga tetapi kecuali Mode Perangkat.

Saya juga mencoba melewati maximumAge tetapi tidak ada hasil.
Ini kode saya-

getCurrentPosition () {
navigator.geolocation.getCurrentPosition (
(posisi) => {
console.log ('dapatkan posisi');
this.location = {
bujur: position.coords.longitude,
latitude: position.coords.latitude,
kesalahan: null,
};
},
(kesalahan) => {
console.log ('mendapatkan kesalahan posisi', kesalahan);
this.location = {
bujur: null,
latitude: null,
error: error.message,
};
},
{
enableHighAccuracy: true,
batas waktu: 600000
},
);
}

Jika ada di antara Anda yang menggunakan skipPermissionsRequest dan geoLocation kehabisan waktu - lihat # 17487

Hai

@ngandhy - Tidak, saya tidak menggunakan 'skipPermissionRequests': true. dan minSdkVersion adalah 16

Saya memiliki masalah yang sama seperti Anda semua, mencoba setiap kombinasi yang disebutkan orang untuk android dan menyelesaikannya dengan react-native-background-geolocation ini dan kami bisa mendapatkan lokasi yang disimpan dan bahkan lokasi gps dan lokasi ini akan sangat akurat.

@badis
Solusi Anda berhasil untuk saya - terima kasih!

Metode saya sebelum memperbaiki:

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

Metode saya setelah perbaikan Anda:

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

Saya baru saja menguji kode ini dan itu bisa menjadi solusi:
https://www.abidibo.net/blog/2017/11/23/geolocation-react-native/

Punya masalah ini juga, ada yang punya solusinya?

Saya telah mengalami masalah ini selama beberapa waktu dan satu-satunya "solusi" yang bekerja secara konsisten adalah menonaktifkan "enableHighAccuracy". Masalahnya adalah ia kemudian menggunakan jaringan Anda alih-alih GPS untuk menentukan lokasi Anda, yang kehilangan banyak keakuratan.

Banyak dari solusi lain tampaknya berfungsi pada awalnya, tetapi saya menemukan itu biasanya karena menggunakan posisi cache dan jika Anda memulai ulang ponsel dan meluncurkan aplikasi Anda, itu masih akan gagal.

Hari ini, saya menemukan paket ini yang menggunakan API lokasi gabungan Google untuk lokasi Android dan kembali ke implementasi default React Native untuk iOS (saya bukan pembuat paket ini, tetapi pujian kepadanya karena membuatnya):

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

Saya baru mengujinya sejauh ini, tetapi tampaknya berfungsi dengan baik.

@globetro Terima kasih! Saya memeriksanya juga, dan tampaknya berfungsi dengan baik!

@globetro Terima kasih.
react-native-geolocation-service adalah solusi terbaik.

@globetro Saya juga sukses dengan plugin ini. Ini harus digabungkan ke react-native sebagai fungsionalitas geolokasi default!

react-native-geolocation-service tidak membantu saya :(

Terima kasih @globetro , paket * react-native-geolocation-service * bekerja dengan sempurna, sebaiknya tambahkan ini sebagai komponen inti pada react native.

Anda benar-benar ingin memiliki dua pendengar lokasi (yang mahal), yang memiliki akurasi tinggi dan yang tidak.

lalu Anda ingin membandingkan mana yang lebih akurat dan lebih baru dari lokasi 'saat ini'.


Ini adalah solusi 'sementara', ini benar-benar harus diimplementasikan di sisi RN sehingga menggunakan izin COARSE dan FINE jika akurasi tinggi diaktifkan.

Saya memperbaiki masalah ini, berikut adalah komponen yang saya buat menggunakan janji:
https://gist.github.com/a3diti/5466f7309752cbb2e63ecefff6365bb9
Di android saya menghapus maximumAge , saya menyimpan enableHighAccuracy hingga true , dan menambahkan pemeriksaan izin dari komponen RN PermissionsAndroid .

@ a3diti Sudahkah Anda mengujinya di dunia nyata? Lokasi dapat di-cache.

@ a3diti Kecuali jika mereka memperbaiki sesuatu dalam rilis react-native terbaru, itu tidak akan bekerja sepanjang waktu di Android. Coba luncurkan itu di perangkat Android asli setelah reboot. Kemungkinan akan memakan waktu lebih dari 20-an untuk mendapatkan pembaruan posisi, jika bukan hanya batas waktu.

Mengapa tidak menggabungkan kode yang digunakan di sini https://www.npmjs.com/package/react-native-geolocation-service menjadi inti?

Saya menghadapi masalah "Request time out" yang sama, Setelah R & D saya mencoba untuk "Reboot" perangkat kemudian setelah saya mendapatkan lokasi & berfungsi dengan baik.

Silakan periksa kode saya.

componentDidMount = () => {
navigator.geolocation.getCurrentPosition (
(posisi) => {
const initialPosition = JSON.stringify (posisi);
this.setState ({initialPosition});
},
(error) => alert (error.message),
{enableHighAccuracy: false, batas waktu: 20000, maximumAge: 1000, distanceFilter: 1}

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

  });

}

Ada alasan mengapa orang masih berjuang dengan ini dan tidak menggunakan

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

seperti yang disarankan sebelumnya? Ini bekerja dengan sempurna untuk saya.

Apakah itu tidak berhasil untuk orang lain?

Menambahkan ini ke file AndroidManifest.xml dan berhasil!

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

Hai teman-teman,

saya mencoba menggunakan react-native-geolocation-service seperti yang disarankan oleh @globetro tetapi itu menyebabkan aplikasi saya langsung mogok. Ada ide?

@ Patrick-Bayer Saya menggunakannya pada aplikasi saya di Google Play tempat ia bekerja, tetapi versi pengembangan saya sekarang langsung mogok karena alasan yang tidak diketahui. Tampaknya layanan react-native-geolocation-lah yang menyebabkan crash bagi saya juga.

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

Beri tahu saya jika Anda menemukan solusi.

@oakis Langkah-langkah berikut berhasil untuk saya:

  1. Perbarui Gradle dan ubah versinya dalam
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. Tambahkan "google ()" ke repositori di android / build.gradle Anda

Kadang-kadang bahkan setelah Anda menambahkan <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> ke AndroidManifest.xml Anda mungkin masih tidak berhasil.
Solusi Cepat

  1. Anda bisa secara eksplisit meminta info lokasi pengguna saat mereka memasang layar pertama aplikasi Anda seperti itu
    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. Jangan pernah menyetel enableHighAccuracy menjadi false, alih-alih hapus maximumAge dan tingkatkan timeOut . Sesuatu seperti {enableHighAccuracy: true, timeout: 100000,} cukup.

Saya harap ini akan membantu seseorang.

Bagi saya, menyetel enableHighAccuracy ke true berfungsi di API 23, meskipun saya perlu menyetel ke false di API 26.
(itu satu-satunya yang saya uji)

EDIT: Saya akhirnya menginstal layanan react-native-geolocation dan itu menyelesaikan masalah saya 🥁

Hai,

Saya memiliki masalah yang sama dan berikut ini solusi lain.

Saya menambahkan tag uses-feature di bawah ini di AndroidManifest.xml dan tampaknya aplikasi berfungsi dengan baik dengan highAccuracy: true

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

Tampaknya jika Anda menyetel highAccuracy: high , React Native menggunakan GPS_PROVIDER alih-alih NETWORK_PROVIDER. Dan seperti yang dikatakan dokumen Pengembang Android, aplikasi yang menargetkan API 21 atau lebih tinggi harus menyertakan tag ini di AndroidManifest.xml untuk menggunakan GPS_PROVIDER.

Perhatian: Jika aplikasi Anda menargetkan Android 5.0 (API level 21) atau lebih tinggi, Anda harus menyatakan bahwa aplikasi Anda menggunakan fitur perangkat keras android.hardware.location.network atau android.hardware.location.gps dalam file manifes, bergantung pada apakah aplikasi menerima pembaruan lokasi dari NETWORK_PROVIDER atau dari GPS_PROVIDER. Jika aplikasi Anda menerima informasi lokasi dari salah satu sumber penyedia lokasi ini, Anda perlu mendeklarasikan bahwa aplikasi tersebut menggunakan fitur hardware ini dalam manifes aplikasi Anda. Pada perangkat yang menjalankan versi sebelum Android 5.0 (API 21), meminta izin ACCESS_FINE_LOCATION atau ACCESS_COARSE_LOCATION menyertakan permintaan tersirat untuk fitur perangkat keras lokasi. Namun, meminta izin tersebut tidak secara otomatis meminta fitur perangkat keras lokasi pada Android 5.0 (API level 21) dan yang lebih tinggi.

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

Saya tidak tahu mengapa Anda tidak perlu menyertakan android.hardware.location.network di AndroidManifest.xml saat menyetel highAccuracy: false yang berarti LocationManager menggunakan NETWORK_PROVIDER dan dengan demikian tag diperlukan sesuai dengan dokumen.

Semoga solusi ini berhasil untuk Anda.

Saya melakukan beberapa eksperimen dan tampaknya batas waktu mungkin berkaitan dengan apakah layanan lokasi Google diaktifkan di perangkat.
Saya perhatikan bahwa ketika saya mengaktifkan layanan lokasi di perangkat, Sebuah kotak peringatan meminta Anda "Tingkatkan akurasi lokasi?" dengan teks yang menjelaskan bahwa layanan lokasi Google akan berjalan di latar belakang, dan juga mengirimkan data lokasi ke google. Ini biasanya terjadi pada perangkat baru atau emulator, karena sebagian besar dari kita telah mengaktifkannya di perangkat biasa.

9vgfb

Jika ini tidak diaktifkan, perangkat harus mendapatkan lokasi baru hampir setiap kali Anda memintanya (dikontrol oleh pengaturan maximumAge ). Jika Anda tidak menanyakan lokasi untuk sementara waktu, dan nilai timeout tidak cukup untuk mendapatkan lokasi baru, navigator.geolocation.getCurrentPosition hanya akan mengembalikan batas waktu.

Saya juga melihat ini diselesaikan dengan membuka peta google di perangkat sekali (yang sekali lagi mendapat lokasi baru).

Sekali lagi, tidak mengklaim bahwa ini adalah penjelasan / solusi yang tepat, hanya menambahkan pengamatan saya ke utas ini

Saya hanya bisa melihat perubahan lokasi di Android dengan react-native-fused-location

Adakah yang tertarik untuk melakukan upstreaming perubahan dari salah satu modul yang disarankan menjadi inti?

Beberapa hari yang lalu saya menerbitkan react-native-cross-geolocation yang kompatibel dengan modul geolocation RN, tetapi menggunakan API Lokasi Google yang paling efisien untuk Android. Karena itu, saya tidak berpikir bahwa modul saya adalah kandidat untuk mengintegrasikannya ke inti RN, tetapi tersedia untuk siapa saja yang ingin menggunakannya.

react-native-geolocation-service Paket ini menggunakan api lokasi gabungan dan berfungsi dengan baik untuk mendapatkan posisi atau bahkan posisi menonton. @hramos dan @reyalpsirc tolong dicoba.

Lokasi gabungan @hramos tergantung pada Layanan Google Play dan saya ingin tahu apakah lisensinya OK?

Saya mencoba hampir semuanya dan ternyata tidak konsisten. Saya telah menemukan sesuatu yang mungkin berguna.

Mengaktifkan akurasi tinggi berarti menemukan lokasi melalui jaringan gps + (layanan operator). Setelah memeriksa izin tingkat aplikasi, perangkat saya menonaktifkan izin lokasi layanan operator. Mengaktifkannya dan menghapus parameter ketiga dari navigator.geolocation.getCurrentPosition () berfungsi untuk saya.
Mencoba
-Buka Pengaturan perangkat Anda -> Keamanan & lokasi -> Lokasi -> Izin Tingkat Aplikasi
Izin lokasi -Aktifkan untuk Carrier Services
-Hapus konfigurasi lokasi (parameter ketiga) dari getCurrentPosition
-Restart perangkat Anda

Semoga ini membantu!

Saya tidak yakin apakah itu relevan. Tapi satu contoh https://snack.expo.io/SkJqg8gYm. Setelah mengkustomisasi kode, kode tersebut akan terus mengenai blok catch. Kemudian saya menemukan setiap kali ada pengecualian javascript terjadi, itu diam-diam dilemparkan. Karena blok tangkap ini dieksekusi. Kemudian saya memastikan tidak ada kesalahan yang akan terjadi saat memanggil fungsi itu. Saya kira skrip ketikan harus diberlakukan dalam kasus seperti ini untuk mencegah kesalahan dalam runtime.

{enableHighAccuracy: true, timeout: 10000, maximumAge: 0}
apa yang saya temukan jika melewatkan parameter kedua atau memberikan nilai kurang dari 10.000 yang memberikan kesalahan

mencoba memberikan ketiga parameter seperti di atas akan menyelesaikan masalah saya setidaknya di emulator

Coba tambahkan izin ini pada _AndroidManifest.xml_ Anda:

<_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" _ />

Hai Saya menghadapi masalah yang sama "permintaan waktu habis" Saya telah mencoba setiap solusi yang mungkin seperti yang diberikan di atas yang tidak dapat bekerja untuk saya tetapi baru-baru ini saya menemukan satu modul yang mengatasi masalah ini.
https://www.npmjs.com/package/react-native-geolocation-service
Ini berhasil untuk saya .....

@vishalTechnoFreek , juga ada react-native-cross-geolocation .

Ini sepenuhnya kompatibel dengan geolokasi RN saat ini, tetapi menggunakan Google API baru. Dengan API ini Anda tidak perlu khawatir mode mana yang akan digunakan, layanan secara otomatis mendeteksi opsi terbaik.

Keuntungan lainnya adalah, saat RN memperbaiki masalah ini, Anda dapat menghapusnya tanpa memengaruhi aplikasi Anda, jika diinginkan.

Untuk kasus saya, apa yang menyebutkan @manurana tentang (mengunduh dan) membuka aplikasi Google Maps dan kemudian kembali ke Expo berhasil.

Saya bekerja dengan Genymotion dan Android 5.

Juga, untuk pengguna Genymotion, untuk membaca posisi dengan benar, jendela peta Genymotion harus dibuka; jika tidak, itu akan berhasil tetapi dengan lokasi default Geny

menyetel enableHighAccuracy menjadi true atau false tidak berhasil untuk saya.
menghilangkan argumen ke-3 untuk getCurrentPosition untuk menggunakan nilai default dari modul asli berfungsi untuk saya.

penyelamat 👍 ini berhasil untuk saya.

Saya guys,
Saya menghadapi kesalahan yang sama tetapi, setelah beberapa percobaan ulang dengan kolega saya, kami melihat sesuatu yang aneh (tetapi normal jika Anda memikirkan GPS).

Jika Anda menjalankan tes "di dalam kantor Anda" menggunakan perangkat fisik, pelacak GPS dapat diganggu oleh hal-hal eksternal seperti dinding, atau oleh alasan sederhana bahwa Anda mencoba melakukan operasi ini "di dalam ruangan" dan, umumnya, ini harus dilakukan di luar ruangan .

Nah, setelah ini kami keluar dari kantor kami, kami menjalankan ulang tes dan perangkat merespons sesuai rencana (kami tidak menerima kesalahan waktu Permintaan habis).

Saran saya adalah: coba geolocation menggunakan "enableHighAccuracy" disetel ke true, jika ini gagal (di kantor ini bisa gagal), coba lagi dengan false, ini akan berfungsi, dalam kasus saya itu berhasil.

Semoga ini bisa membantu.

Saya menghadapi masalah yang sama, tetapi menyetel enableHighAccuracy menjadi false tidak berhasil untuk saya. Jadi solusi yang tampaknya sempurna ini tidak berhasil untuk saya.

Saya menghadapi masalah serupa dengan beberapa permintaan (terus memilih gunakan lokasi saat ini) Saya telah menambahkan coba lagi untuk permintaan lokasi. bukan masalah sebenarnya tetapi mungkin akan membantu seseorang.

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
Paket ini memecahkan masalah saya.
Hampir semua saran di atas tidak berhasil untuk saya.

Hai, Tamu, saya memecahkan masalah yang salah, yang terjadi adalah ketika kami meminta lokasi pertama kali dan menggunakan "maximunAge", kami tidak memiliki lokasi sebelumnya yang di-cache jadi, ada bug, pastikan bahwa pertama kali ketika diminta lokasi tanpa "maximunAge"

jawaban sederhananya adalah keluar dari tempat Anda berada dan pergi ke ruang terbuka lalu coba lagi.

Sains sederhana.

Layanan GPS dipengaruhi oleh dinding tebal dan mobil.

Ini berhasil untuk saya. Tidak perlu mengedit apapun !!!

Dalam kasus saya, hapus maximumAge memecahkan masalah.

Terima kasih banyak! Kerja!

Hai,
Tidak ada solusi yang berhasil untuk saya.
Saya menggunakan navigator.geolocation, hanya menggunakan {enableHighAccuracy: false} sebagai parameter ketiga.
Di iOS berfungsi dengan baik dan di android tidak berfungsi di perangkat tertentu.
Saya telah memeriksa di Android 7, 8, 9. Ini tidak berfungsi di ponsel Lenovo dengan Android 7. Tetapi bekerja dengan perangkat lain dengan Android 7.

Apakah ada yang punya solusi untuk mengatasi masalah ini.
Setiap saran sangat berarti.

Terima kasih

@akhilsanker mungkin mencoba perpustakaan seperti react-native-fused-location

Hai @reyalpsirc ,

Terima kasih balasannya. Sangat menghargai waktu Anda.
Tidak ada masalah di iOS dan berfungsi dengan baik di sebagian besar perangkat Android. Saya memiliki batasan waktu yang terbatas dan akan sulit untuk menggunakan perpustakaan baru, seperti yang Anda sarankan.
Apakah Anda memiliki solusi lain untuk mengatasi masalah ini?
Terima kasih atas waktunya.

Terima kasih.

Maaf @akhilsanker , yang saya lakukan hanyalah menggunakan Geolocation react native untuk iOS dan FusedLocation untuk Android.

pengaturan maximumAge:0 berhasil untuk saya:
{ enableHighAccuracy: true, timeout: 60000, maximumAge:0 }
mungkin @GersonM benar ...

Modul geolokasi dihapus dari RN di master, dan tidak akan tersedia di 0,60. Silakan gunakan https://github.com/react-native-community/react-native-geolocation dan laporkan masalah di sana. Terima kasih

Ini 2019, mencoba 3 perpustakaan lokasi yang berbeda, tidak ada yang berfungsi untuk Android. Luar biasa.

Ini 2019, mencoba 3 perpustakaan lokasi yang berbeda, tidak ada yang berfungsi untuk Android. Luar biasa.

react-native-geolocation-service berfungsi dengan baik.

Jika sebuah paket tidak berfungsi, buat tiket terbitan di repo itu. Masalah tidak akan teratasi sendiri, bergabunglah dengan komunitas.

lihat komentar iwangsyah . Saya membutuhkan kedua tag meta <permission> __and__ <uses-permission>

https://www.npmjs.com/package/react-native-geolocation-service
Paket ini memecahkan masalah saya.
Hampir semua saran di atas tidak berhasil untuk saya.

Terima kasih!

Apakah halaman ini membantu?
0 / 5 - 0 peringkat