Натрапив на цю нитку через пару років. У 2016 році більшість пристроїв Android матимуть рівень API> = 18 і, отже, повинні покладатися на Location.isFromMockProvider (), як зазначив Фернандо .
Я багато експериментував з фальшивими / макетними локаціями на різних пристроях Android та дистрибутивах. На жаль, .isFromMockProvider () не є 100% надійним. Час від часу фальшиве місце не буде позначено як знущання . Здається, це пов’язано з деякою помилковою внутрішньою логікою синтезу в Google Location API.
Про це я написав докладний допис у блозі , якщо ви хочете дізнатись більше. Підводячи підсумок, якщо ви підписалися на оновлення місцезнаходжень з API розташування, а потім увімкнули підроблену програму GPS і надрукували результат кожного Location.toString () на консолі, ви побачите щось подібне:
Зверніть увагу, що в потоці оновлень місцезнаходжень одне місцезнаходження має ті самі координати, що й інші, але не позначене як макет і має набагато гіршу точність розташування.
Щоб усунути цю проблему, я написав допоміжний клас , який буде надійно придушувати Mock місця у всіх сучасних версіях Android (рівень API 15 і вище):
LocationAssistant - Безпроблемні оновлення місцезнаходження на Android
По суті, він "не довіряє" непромисловим локаціям, що знаходяться в радіусі 1 км від останнього відомого макетного місця, а також позначає їх як макет. Він робить це, поки не прибуде значна кількість непромислових місць. LocationAssistant може не тільки відмовитися від фіктивних місць розташування, а й розвантажує вас від більшості клопоту настройки і підписок на оновлення розташування.
Щоб отримувати лише реальні оновлення місцезнаходження (тобто придушувати макети), використовуйте їх наступним чином:
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()
тепер буде викликано лише реальну інформацію про місцезнаходження. Існує ще кілька методів прослуховування, які потрібно застосувати, але в контексті вашого запитання (як запобігти спуфінгу GPS) це в основному це.
Звичайно, з корінною ОС ви все ще можете знайти способи підробки інформації про місцезнаходження, які неможливо виявити звичайним програмам.