2010-12-11 32 views
6

Ứng dụng của tôi sử dụng LocationListener để theo dõi vị trí hiện tại. Miễn là Nhà cung cấp GPS cung cấp các bản sửa lỗi thường xuyên, điều này hoạt động tốt. Tuy nhiên, tôi muốn ứng dụng của mình cảnh báo cho người dùng nếu vị trí không còn đáng tin cậy nữa vì bản sửa lỗi không còn tồn tại nữa. Do đó, tôi đã sử dụng timeCheckHandler để gọi getLastKnownLocation cứ sau vài giây.Vấn đề về Android tìm ra cách sửa lỗi GPS mới nhất gần đây là

Vấn đề của tôi là ngay cả khi các bản sửa lỗi chính xác được nhận thường xuyên, thời gian trả về bằng cách áp dụng getTime() đến vị trí được trả về bởi getLastKnownLocation thường lớn hơn thời gian hiện tại được trả về bởi System.currentTimeMillis(), thường khoảng 20 giây .

Tôi đã điều tra thêm vấn đề bằng cách thêm mã vào onLocationChanged (arg0) để ghi thời gian sửa lỗi (arg0.getTime()) và thời gian hiện tại (System.currentTimeMillis()). Một lần nữa tôi thấy sự khác biệt khoảng 20 giây.

mã hiện lần đọc như sau:

public void onLocationChanged(Location arg0) { 
    mapview.handleLocationChanged(mapview, arg0.getLatitude(), arg0.getLongitude(), arg0.getBearing(), arg0.getAccuracy(), "GPS fix"); 
    addDebugNote("Fix received at time: "+Long.toString(arg0.getTime()/1000)+" Now: "+Long.toString((System.currentTimeMillis())/1000)); 
} 

và điển hình đầu ra để tập tin gỡ lỗi của tôi đọc:

Fix received at time: 1292091908 Now: 1292091928 

Tại sao mình sẽ thấy sự khác biệt này giữa thời gian sửa chữa và thời gian hệ thống hiện tại ?

Tôi có phải chấp nhận rằng sự khác biệt khoảng 20 giây là bình thường không?

+0

Tôi đã gặp vấn đề tương tự và tôi đã thêm: 'arg0.setTime (Hệ thống.currentTimeMillis()); 'là dòng đầu tiên trong phương thức' onLocationChanged (Location arg0) 'để" sửa "dấu thời gian. Tôi không chắc chắn nếu điều này sẽ tạo ra bất kỳ tác dụng phụ sau này – ApollonDigital

Trả lời

20

Thời gian định vị GPS đến độc lập với thời gian/thời gian của nhà cung cấp mạng của bạn. System.currentTimeMillis() sẽ cho bạn thời gian thiết bị được thiết lập trên thiết bị của bạn.

Nếu bạn muốn biết làm thế nào gần đây vấn đề là bạn có thể:

  1. Đồng bộ hóa cả lần (GPS và thiết bị) trong mã của bạn khi khởi động ứng dụng bằng cách lấy chênh lệch giữa hai ngay sau khi bạn có được cập nhật vị trí GPS đầu tiên. Tại thời điểm thiết bị truy vấn tức thì đó và xem sự khác biệt trong cả hai. Lưu sự khác biệt này trong biến.

  2. Sử dụng yếu tố này làm yếu tố sửa trong bản cập nhật vị trí tiếp theo để biết thời gian chính xác dựa trên khung tham chiếu bạn cần. (Thời gian thiết bị hoặc GPS)

Ngoài ra tôi đã thấy rằng việc sử dụng NETWORK làm nhà cung cấp vị trí bạn chỉ có thể nhận được thời gian thiết bị. Vì vậy, nếu bạn đang nghe các bản cập nhật từ cả hai (GPS và mạng), bạn cũng có thể cần phân biệt điều này bằng cách sử dụng location_obj.getProvider() và lọc ra nhà cung cấp GPS.

+1

Cảm ơn. Điều này rất hữu ích. (Tôi tưởng tượng GPS thời gian phải rất chính xác để cho nó làm việc với độ chính xác như vậy. Tôi tự hỏi tại sao các mạng điện thoại chỉ đơn giản là không đồng bộ hóa với nó.) – prepbgg

+0

điểm tốt, có lẽ nó chỉ là nhiều khả năng mạng đó là trên gps? một trong hai cách, nếu điện thoại của bạn đồng bộ hóa thời gian để gps chúng tôi sẽ không gặp phải một thời gian mạng đã được tắt khi chúng tôi đã cố gắng để getTime()? về cơ bản, chúng tôi sẽ phải định thời gian khi chúng tôi sử dụng mạng để cập nhật vị trí –

1

Lặp lại kiểm tra hôm nay tôi đã thấy rằng sự khác biệt giữa thời gian GPS và thời gian Hệ thống là 22 giây. Vấn đề này được thảo luận ở đâu đó trên web và có vẻ như nó là bình thường khi có sự khác biệt giữa thời gian GPS và thời gian hệ thống của điện thoại (trong trường hợp của tôi được thiết lập tự động cập nhật từ mạng). thời gian là khoảng 15 hoặc 17 giây (tùy thuộc vào nguồn nào là chính xác) từ thời gian UTC ... nó không đồng bộ vì thời gian GPS chưa được cập nhật từ năm 1980 cho "giây nhuận" định kỳ. Ghi nhớ điều này Tôi nghĩ câu trả lời cho nhu cầu của tôi là kiểm tra mức độ sửa lỗi mới nhất hiện tại sẽ so sánh thời gian hệ thống hiện tại với thời gian hệ thống (không phải là thời gian GPS) của bản sửa lỗi mới nhất.

+0

Đọc lại tài liệu tham khảo Android cho Vị trí Tôi được nhắc rằng getTime() trả về thời gian sửa lỗi của UTC, và tôi cho rằng tôi có thể dựa vào điều này là chính xác. Do đó, nó phải là thời gian hệ thống của điện thoại không chính xác. Đọc thêm trên internet Tôi thấy rằng nó là bình thường đối với đồng hồ của điện thoại để trôi ra khỏi đồng bộ bởi nhiều giây. – prepbgg

Các vấn đề liên quan