Наткнулся на эту ветку пару лет спустя. В 2016 году большинство устройств Android будут иметь уровень API> = 18 и, следовательно, должны полагаться на Location.isFromMockProvider (), как указал Фернандо .
Я много экспериментировал с фальшивыми / фиктивными локациями на разных устройствах и дистрибутивах Android. К сожалению .isFromMockProvider () не на 100% надежен. Время от времени поддельное местоположение не будет помечено как фиктивное . Похоже, это происходит из-за некоторой ошибочной внутренней логики объединения в Google Location API.
Я написал подробный пост об этом в блоге , если вы хотите узнать больше. Подводя итог, если вы подпишетесь на обновления местоположения из Location API, затем включите поддельное приложение GPS и распечатаете результат каждого Location.toString () на консоли, вы увидите что-то вроде этого:
Обратите внимание, что в потоке обновлений местоположения одно местоположение имеет те же координаты, что и другие, но не помечено как фиктивное и имеет гораздо более низкую точность определения местоположения.
Чтобы решить эту проблему, я написал служебный класс, который надежно подавит фиктивные местоположения во всех современных версиях 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) это в основном это.
Конечно, с рутированной ОС вы все еще можете найти способы подделки информации о местоположении, которые обычные приложения не могут обнаружить.