[React Native] Làm thế nào để lấy tọa độ GPS trên Android
Cho mình hỏi cách nào để lấy tọa độ GPS trên Android (lấy 1 lần thôi)
Mình sử dụng geolocation có sẵn của Javascript, thì trên iOS chạy rất tốt, nhưng trên Android thì chờ mãi mà Callback vẫn không chạy (getCurrentLocation thì thi thoảng có chạy nhưng không thể cancel, watchPosition thì chờ mãi mãi luôn, cho dù đã có timeout).
Mình dùng hẳn code Java và dùng Location Manager thì cũng tương tự, GoogleApiClient thì chưa mò hết được, hiện tại cũng không được.
Tất cả mình đều đã thử trên máy thật rồi. App Google Map thì nó lấy GPS rất nhanh, nên chắc là GPS không bị hư.
Nhờ mọi người giúp đỡ ạ.
Mình chạy trên android thấy không có vấn đề. chỉ add
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
vào AndroidManifest.xml là xài bình thường mà. Nếu test trên máy ảo thì phải vào Extended control > Location để send lat/lng thì trong app mới nhận. (send trước khi nó báo timeout)Permission đó thì mình có rồi bạn , ở đây mình cần trên máy thật.
1.android >5 sẽ phải request permssion lúc runtime, khai báo trong manifest sẽ bị ignore.
2.get location từ LocationManager bằng instance method
3.để update location từ LocationManager bằng instance method
Không biết bạn đã làm đúng 3 điều trên chưa mà không lấy được location.
chắc mình sẽ thử vụ request lúc runtime, nhưng điện thoại của mình là Android 4.2 < 5 mà còn không được đây. Mình đã dùng requestUpdateLocation và đặt hàm đón event đầy đủ cả mà vẫn không bắt được. Còn getLastKnownLocation thì nó trả về dữ liệu cũ, hoặc null nên mình không dùng được.
Bạn thử bật log lên xem nào? Chứ nghe triệu chứng đoán bệnh thì khó rồi.
Thử đoán thôi nhé: vào máy thật ->Developer Option, xem có option này khi chạy ở chế độ debug / … cấm truy cập GeoApi hoặc Sensor k nhỉ?
Bạn đọc kĩ 3 điều mình viết nhé, nhất là điều thứ 3 bạn sẽ hiểu vì sao đón event nhưng cũng không ăn thua, android chỉ có thế, quan trọng là kết hợp và Tricks thì lúc nào cũng lấy được location tuy không phải mới nhất nhưng cũng không sai lệch nhiều
Đây là class của mình, nhờ bạn xem hộ là mình có mắc sai lầm gì không:
Lạ thật đấy, mình thấy log vẫn chạy function onLocationChanged() mà (bạn đang để 1p hoặc 10m chạy lại 1 lần). Lấy location bình thường luôn.
(code lỗi vì mình đang truyền các callback và option null)
Bạn attach cái log của logcat lúc đó xem nào? Chứ giờ thì chịu rồi.
Bạn có thử trên máy thật không, chứ trên máy ảo bên mình thì chạy cực kỳ tốt rồi.
Máy thật đó bạn. Máy mình dùng là Android L (5.0) Asus Zendphone 2.
À, mình biết lỗi này rồi. Bình thường Fused Location Provider nó sẽ cache cái vị trí cuối cùng nếu có ít nhất một client được kết nối với nó. Có vẻ có mỗi app của bạn hiện đang lấy vị trí nên nó sẽ phải kết nối với vệ tinh GPS. Mà qúa trình này sẽ khá chậm và thi thoảng bị timeout (do GPS bay trên trời nên muốn lấy nó cũng phải có time, rồi do vật cản, … và hàng tý lý do).
Bạn thử bật cả Wifi/3G hoặc Cell network xem tình hình thế nào (lấy từ cả NET hoặc CELL PHONE) xem nó lấy có bị lỗi không? Đem thử ra ngoài trời xem có nhanh hơn không? (một số tòa nhà được thiết kế sao đó mà cứ ngồi nhà là đek thể nào kết nối với ve tinh GPS được).
Trong trường hợp này bạn nên implement cả việc lấy từ Wifi/3G và Cellphone, chứ chỉ dựa vào GPS thì cũng hơi rủi ro.
Còn vụ GoogleApiClient lấy vẫn nhanh thì cũng chịu. Bạn đã thử test với vụ chỉ bật GPS và tắt hết Wifi/3G và/hoặc Cellphone chưa? Vì code của bạn hiện giờ mới chỉ lấy location từ GPS, trong khi GoogleApiClient nó wrapper cả 3 trường hợp nên nó lấy nhanh cũng phải.
Nếu k detect được GPS thì nên backup lấy từ wifi/3g, chứ if của bạn hiện giờ chưa làm gì cả.
Không, ý mình là App Google Maps lấy nhanh, chứ GoogleApiClient thì vẫn chưa được, mình vẫn đang nghiên cứu nó.