С момента выпуска API 18, Location объект имеет способ isFromMockProvider, чтобы проверить, находится ли местоположение от MockProvider.
public static boolean isMockLocation(Location location) {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2 && location != null && location.isFromMockProvider();
}
На API 17 и ниже, фиктивные местоположения обнаружены с помощью Settings.Secure.
public static Boolean isMockLocationEnabled(Context context) {
return !Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ALLOW_MOCK_LOCATION).equals("0");
}
Общая схема с фиктивных местоположений является то, что подшипник, скорость, точность, высота и интервал времени (между последовательными точками данных) жестко закодированные значения. Но несколько раз isFromMockProvider ненадежен для некоторого местоположения означает, что они не помечены как макет местоположения. Но эти местоположения имеют гораздо более низкую точность, чем другие показания местоположения. Большинство Fake GPS отправляют все места с фиксированной точностью. Но когда вы отключите поддельный GPS, непомеченное местоположение может появиться из-за результата логики слияния FusedLocation API.
Так что вы можете сделать, чтобы обнаружить эти места
- Keep самый последний обнаруженный макет местоположение.
- Рассчитайте расстояние между последним мокром местоположением и текущим немаркированным местоположением.
- Если расчетное расстояние меньше 1 км, то отклоните его.
- Удалить последнее сохраненное местоположение, если вы получили по меньшей мере 10 удачных мест.
Этот подход будет работать большую часть времени, но когда-нибудь это решение по-прежнему будет обмануто.
Код скопирован с данного blog.