Наткнулся на эту ветку пару лет спустя. В 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);
...
// You can specify a different accuracy and interval here.
// The last parameter (allowMockLocations) must be 'false' to suppress mock locations.
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) {
// No mock locations arriving here
}
...
}
onNewLocationAvailable()
теперь будет вызываться только с информацией о реальном местоположении. Есть еще несколько методов прослушивания, которые вам нужно реализовать, но в контексте вашего вопроса (как предотвратить подделку GPS) это в основном так.
Конечно, с рутованной ОС вы все еще можете найти способы подмены информации о местоположении, которые невозможно обнаружить обычным приложениям.