Birkaç yıl sonra bu konuya tökezledi. 2016'da çoğu Android cihazının API seviyesi> = 18 olacak ve bu nedenle Fernando'nun belirttiği gibi Location.isFromMockProvider () 'a güvenmesi gerekiyor .
Farklı Android cihazlarda ve dağıtımlarda sahte / sahte konumları kapsamlı bir şekilde denedim. Ne yazık ki .isFromMockProvider () % 100 güvenilir değil. Arada bir, sahte bir konum sahte olarak etiketlenmez . Bu, Google Konum API'sindeki bazı hatalı dahili füzyon mantığından kaynaklanıyor gibi görünüyor.
Daha fazlasını öğrenmek isterseniz bunun hakkında detaylı bir blog yazısı yazdım . Özetlemek gerekirse, Konum API'sinden konum güncellemelerine abone olursanız, sahte bir GPS uygulaması açarsanız ve her Location.toString () sonucunu konsola yazdırırsanız, şunun gibi bir şey göreceksiniz:
Konum güncellemeleri akışında, bir konumun diğerleriyle aynı koordinatlara sahip olduğunu, ancak sahte olarak işaretlenmediğini ve çok daha zayıf bir konum doğruluğuna sahip olduğuna dikkat edin.
Bu sorunu çözmek için, bir yardımcı sınıf yazdı olacak tüm modern Android sürümleri (yukarı API seviyesi 15 ve üzeri) arasında güvenilir bastırmak Mock yerleri:
LocationAssistant - Android'de sorunsuz konum güncellemeleri
Temel olarak, bilinen son sahte konumun 1 km yakınında bulunan sahte olmayan konumlara "güvenmez" ve bunları sahte olarak etiketler. Bunu, sahte olmayan önemli sayıda konum gelene kadar yapar. Konum Yardımcısı Sahte konumlara reddetmek değil, aynı zamanda kurulumu ve konum güncellemelerine abone karmaşası çoğundan sizi unburdens olabilir sadece.
Yalnızca gerçek konum güncellemelerini almak için (yani taklitleri bastırmak), aşağıdaki şekilde kullanın:
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()
artık yalnızca gerçek konum bilgileriyle çağrılacak. Uygulamanız gereken daha fazla dinleyici yöntemi vardır, ancak sorunuz bağlamında (GPS sahtekarlığını nasıl önleyebilirsiniz) temelde budur.
Tabii ki, köklü bir işletim sistemi ile, normal uygulamaların algılaması imkansız olan konum bilgisi sahteciliği yollarını yine de bulabilirsiniz.