2011-10-12 44 views
10

Tôi nhận được cập nhật vị trí định kỳ qua GPS, vấn đề là thời gian cho đến khi cập nhật vị trí đầu tiên xảy ra - nó chỉ dài. Khi người dùng ở trong một tòa nhà, thời gian này càng trở nên tồi tệ hơn.Bắt đầu chiến lược vị trí

Vì vậy, tôi đang tìm một số chiến lược để cải thiện thời gian khởi động (tại thời điểm này tôi không sử dụng getLastKnownLocation nhưng tôi sẽ). Tôi bắt đầu đọc A Deep Dive Into Location để có được một số ý tưởng và có một số suy nghĩ bây giờ tôi muốn thảo luận với bạn.

Lúc đầu, bài đăng trên blog được đề cập ở trên đi qua từng nhà cung cấp vị trí trên thiết bị và truy vấn getLastKnownLocation, nhưng chỉ xem xét khi chúng không cũ và trong độ chính xác cho phép. Đây là câu hỏi đầu tiên của tôi: Tôi hy vọng sẽ có vị trí dựa trên mạng ngay lập tức, vì vậy tôi sẽ yêu cầu vị trí dựa trên mạng mới, sau đó tôi sẽ nhận được getLastKnownLocation từ nhà cung cấp GPS và nếu vị trí GPS cuối cùng là trong vòng tròn được hình thành bởi vị trí dựa trên điểm mạng và độ chính xác bán kính sau đó tôi sẽ lấy vị trí GPS, bất kể nó bao nhiêu tuổi. Bạn nghĩ sao?

Sau khi kiểm tra các vị trí cuối cùng được biết tôi sẽ bắt đầu theo dõi vị trí GPS và vì tôi chỉ cần nó mỗi 2 giây và thay đổi 10m, tôi sẽ sử dụng lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2 * 1000, 10, this);

Tuy nhiên tôi thấy một khuôn mẫu (bên trong trình bày Being Epic: Best Practices for Android Development trên slide 9596 rằng lúc đầu anh ta bật vị trí thô và tốt (với 0,0 cho thời gian và khoảng cách thay đổi) và sau đó, khi sự kiện đầu tiên được nhận, anh chuyển sang tần suất cập nhật thực sự cần thiết. -update đến nhanh hơn khi khoảng thời gian được đặt thành 0?

Trong opp osite với mẫu này, tôi sẽ giữ bản cập nhật thô cho đến khi nhận được bản cập nhật GPS đầu tiên. Bạn nghĩ sao?

Hy vọng sẽ nhận được một số câu trả lời thú vị!

---------------- Cập nhật ----------------

Tôi đã thực hiện một số điều tra: Tôi đã bật GPS và chờ đợi để sửa chữa. Sau đó, tôi quay GPS tắt và lái xe 50km (31 dặm). Sau đó, tôi đã sử dụng mã từ A Deep Dive Into Location để nhận tất cả getLastKnownLocation. Tôi đã thử nó hai lần, lần đầu tiên với GPS tắt và thứ hai với GPS bật, nhưng không có cách khắc phục:

1) với GPS tắt tôi đã
- Nhà cung cấp: mạng, đúng vị trí với độ chính xác 680m
- Nhà cung cấp : thụ động (mProvider = mạng), cùng một vị trí như trên, đồng thời như trên
- Nhà cung cấp: gps, vị trí vô

vì vậy, tôi biết được rằng khi gps tắt bạn không nhận được getLastKnownLocation.

2) với GPS bật tôi đã
- Nhà cung cấp: mạng, đúng vị trí với độ chính xác 652m
- Nhà cung cấp: thụ động (mProvider = mạng), cùng một vị trí như trên, đồng thời như trên
- Nhà cung cấp: gps, vị trí như nó đã được 2h trước đó với độ chính xác 12m, thời gian cũng là 2h trước đó

Ở đây tôi đã học được rằng các tin nhắn cũ không bị vô hiệu, thậm chí rõ ràng là chúng sai.

Trong trường hợp đó thuật toán hoạt động tốt, bởi vì tôi đã di chuyển trong thời gian tôi tắt GPS. Nhưng nếu tôi vào nhà thì sao? Trong trường hợp đó kết quả GPS cũ 2h sẽ rất tốt, ngay cả khi nó đã lỗi thời.

+0

Liên kết tốt để vẽ vị trí trong bản đồ Google bao gồm bán kính (độ chính xác): [freemaptools] (http://www.freemaptools.com/radius-around-point.htm) – ChrLipp

Trả lời

4

Tại Google IO 2013 họ đã thể hiện trong phiên Beyond the Blue Dot: New Features in Android Location một cách tiếp cận mới, xem video here.

Các kỹ sư tại Google đã thử rất nhiều chiến lược khác nhau, kết quả là "Nhà cung cấp vị trí được hợp nhất". Chất lượng của nó được hiển thị ở 12:17 trong video.

Ketan Parmar đã xuất bản blog post cách nhà cung cấp vị trí hợp nhất có thể được sử dụng trong một ứng dụng mẫu.

+0

Nhà cung cấp vị trí hợp nhất có cần AlarmManager và WakeLock không để nhận vị trí thường xuyên và ngăn thiết bị ngủ và thậm chí có được vị trí khi ứng dụng ở chế độ nền? Hoặc hợp nhất tự làm nó và AlarmManager và WakeLock là bên trong của Google chơi API? –

0

Bắt đầu lên người quản lý vị trí với các nhà cung cấp thụ động đầu tiên

locationManager.requestLocationUpdates(LocationManager.PASSIVE_PROVIDER, AlarmManager.INTERVAL_FIFTEEN_MINUTES, 75, this); 

sau đó một khi bạn nhận được một phản hồi từ mà bạn có thể chuyển sang phần cứng gps của bạn.

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); 
Các vấn đề liên quan