Menemukan utas ini beberapa tahun kemudian. Pada 2016, sebagian besar perangkat Android akan memiliki API level> = 18 dan karenanya harus bergantung pada Location.isFromMockProvider () seperti yang ditunjukkan oleh Fernando .
Saya banyak bereksperimen dengan lokasi palsu / tiruan di berbagai perangkat dan distro Android. Sayangnya .isFromMockProvider () tidak 100% dapat diandalkan. Terkadang, lokasi palsu tidak akan diberi label sebagai tiruan . Ini tampaknya disebabkan oleh beberapa logika fusi internal yang salah di Google Location API.
Saya menulis posting blog mendetail tentang ini , jika Anda ingin mempelajari lebih lanjut. Untuk meringkas, jika Anda berlangganan pembaruan lokasi dari API Lokasi, kemudian mengaktifkan aplikasi GPS palsu dan mencetak hasil dari setiap Location.toString () ke konsol, Anda akan melihat sesuatu seperti ini:
Perhatikan bagaimana, dalam aliran pembaruan lokasi, satu lokasi memiliki koordinat yang sama dengan yang lain, tetapi tidak ditandai sebagai tiruan dan memiliki akurasi lokasi yang jauh lebih buruk.
Untuk memperbaiki masalah ini, saya menulis kelas utilitas yang andal akan menekan lokasi Mock di semua versi Android modern (API level 15 dan lebih tinggi):
LocationAssistant - Pembaruan lokasi tanpa kerumitan di Android
Pada dasarnya, ini "tidak mempercayai" lokasi bukan tiruan yang berada dalam jarak 1 km dari lokasi palsu terakhir yang diketahui dan juga menandainya sebagai tiruan. Ini dilakukan sampai sejumlah besar lokasi non-tiruan telah tiba. The LocationAssistant tidak hanya dapat menolak lokasi pura-pura, tetapi juga unburdens Anda dari sebagian besar kerumitan pengaturan dan berlangganan update lokasi.
Untuk hanya menerima pembaruan lokasi nyata (yaitu menekan tiruan), gunakan sebagai berikut:
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()
sekarang hanya akan dipanggil dengan info lokasi sebenarnya. Ada beberapa metode pendengar lagi yang perlu Anda terapkan, tetapi dalam konteks pertanyaan Anda (cara mencegah spoofing GPS), ini pada dasarnya.
Tentu saja, dengan OS yang di-root, Anda masih dapat menemukan cara spoofing info lokasi yang tidak mungkin dideteksi oleh aplikasi normal.