Tình cờ gặp chủ đề này một vài năm sau đó. Vào năm 2016, hầu hết các thiết bị Android sẽ có cấp độ API> = 18 và do đó phải dựa vào Location.isFromMockProvider () như Fernando đã chỉ ra .
Tôi đã thử nghiệm rộng rãi với các vị trí giả / nhái trên các thiết bị Android và bản phân phối khác nhau. Rất tiếc .isFromMockProvider () không đáng tin cậy 100%. Thỉnh thoảng, một địa điểm giả mạo sẽ không được dán nhãn là giả mạo . Điều này dường như là do một số logic kết hợp nội bộ sai trong API Vị trí của Google.
Tôi đã viết một bài blog chi tiết về điều này , nếu bạn muốn tìm hiểu thêm. Tóm lại, nếu bạn đăng ký cập nhật vị trí từ API Vị trí, sau đó bật một ứng dụng GPS giả và in kết quả của từng Location.toString () vào bảng điều khiển, bạn sẽ thấy một cái gì đó như sau:
Lưu ý rằng, trong luồng cập nhật vị trí, một vị trí có cùng tọa độ với các vị trí khác, nhưng không bị gắn cờ là mô phỏng và có độ chính xác vị trí kém hơn nhiều.
Để khắc phục sự cố này, tôi đã viết một lớp tiện ích sẽ ngăn chặn vị trí Mock một cách đáng tin cậy trên tất cả các phiên bản Android hiện đại (API cấp 15 trở lên):
LocationAssistant - Cập nhật vị trí không có rắc rối trên Android
Về cơ bản, nó "làm mất lòng tin" các vị trí không phải là giả nằm trong vòng 1 km tính từ vị trí giả được biết đến cuối cùng và cũng gắn nhãn chúng là giả. Nó thực hiện điều này cho đến khi một số lượng đáng kể các vị trí không phải giả đã đến. Các LocationAssistant có thể không chỉ loại bỏ các địa điểm giả, mà còn unburdens bạn từ hầu hết các rắc rối của thành lập và đăng ký vào cập nhật vị trí.
Để chỉ nhận thông tin cập nhật về vị trí thực (tức là ngăn chặn chế độ giả), hãy sử dụng nó như sau:
public class MyActivity extends Activity implements LocationAssistant.Listener {
private LocationAssistant assistant;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
assistant = new LocationAssistant(this, this, LocationAssistant.Accuracy.HIGH, 5000, false);
}
@Override
protected void onResume() {
super.onResume();
assistant.start();
}
@Override
protected void onPause() {
assistant.stop();
super.onPause();
}
@Override
public void onNewLocationAvailable(Location location) {
}
...
}
onNewLocationAvailable()
bây giờ sẽ chỉ được gọi với thông tin vị trí thực. Có một số phương pháp lắng nghe khác mà bạn cần thực hiện, nhưng trong bối cảnh câu hỏi của bạn (làm thế nào để ngăn chặn việc giả mạo GPS) về cơ bản thì đây là nó.
Tất nhiên, với một hệ điều hành đã root, bạn vẫn có thể tìm cách giả mạo thông tin vị trí mà các ứng dụng thông thường không thể phát hiện được.