есть ли способ прочитать "выберите приложение фиктивного местоположения" в настройках разработчика Android?
Я знаю рекомендуемый способ узнать в Android, является ли местоположение поддельной точкой, примерно так:
boolean isMock = false;
if (android.os.Build.VERSION.SDK_INT >= 18) {
isMock = location.isFromMockProvider();
} else { // Old Android versions (<6)
isMock = !Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ALLOW_MOCK_LOCATION).equals("0");
}
Итак, для текущих Android-устройств я должен запросить разрешение на местоположение, чтобы узнать, является ли это фиктивным местоположением. Но я думаю, что в этом нет необходимости, если я могу прочитать "Выберите приложение для фиктивного местоположения".
Кроме того, если вы хотите показать предупреждающее сообщение, вы можете настроить это сообщение. Например: можно сказать что-то вроде этого: "Удалите приложение com.lexa.fakegps". А когда пользователь нажимает "Принять", вы можете перенаправить на следующую ссылку: https://play.google.com/store/apps/details?id=com.lexa.fakegps
Кроме того, существуют поддельные приложения gps, которые возвращают false в методе isFromMockProvider.
Кроме того, вы можете делать статистику с приложениями, более полезными для ваших пользователей.
И, наконец, я не понимаю, почему вы можете прочитать все настройки разработчика, кроме "выбрать приложение для фиктивного местоположения":
https://developer.android.com/reference/android/provider/Settings
Есть какое-нибудь решение? Или это просто глупое невозможное?
2 ответа
Я не тестировал это, но это выглядит нормально. Я потратил час или около того, пытаясь придумать собственное решение, и оно было прямо здесь, на GitHub.
Итак, прежде всего... используя следующий код
boolean isMock = false;
if (android.os.Build.VERSION.SDK_INT >= 18) {
isMock = location.isFromMockProvider();
} else { // Old Android versions (<6)
isMock = !Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ALLOW_MOCK_LOCATION).equals("0");
}
вы не можете гарантировать, что местоположение устройства постоянно подделывается.
Для более старых версий android
isMock = !Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ALLOW_MOCK_LOCATION).equals("0");
используется, но то, что он делает, в основном просто показывает, включил ли пользователь настройки для разрешения фиктивного местоположения... поэтому он просто действует как фильтр для проверки
Поэтому, если я использую старый телефон и включаю этот параметр, даже если я не использую поддельное местоположение, он все равно возвращает значение true.
Для последних версий android
isMock = location.isFromMockProvider();
он глючный... может не всегда возвращать правильный ответ, т.е. даже если вы устанавливаете местоположение с помощью приложения фиктивного местоположения, иногда оно может возвращать false.
Вывод:
Завершить чтение настройки "выберите приложение фиктивного местоположения" и принять решение о ее значении - это просто глупость. и вы не можете писать программы, которые всегда не содержат ошибок.
Я лично пробовал и тестировал некоторые из поддельных приложений GPS, таких как
Lexa Fake GPS Location
Fake GPS
для меня во время моих тестов isFromMockProvider() всегда возвращал мне правильный результат. Поэтому я обнаружил, что вероятность обнаружения ошибки очень мала.
И чтобы убедиться, что это ошибочное значение, я нашел это средство в этом посте: Местоположение на Android: хватит издеваться надо мной! Цитирую средство из этой статьи
Поскольку большинство показаний местоположения правильно помечены, выявить и отклонить ложноотрицательные результаты не так уж сложно. Я выбрал следующую стратегию:
Запомните последнее место, помеченное как фиктивное
Если новое "немодельное" значение находится в пределах 1 км от последнего фиктивного, отклоните его.
- Очищайте последнее фиктивное местоположение только после 20 последовательных "немодельных" чтений.
И я также рекомендую вам пройти FauChristian Answer для обнаружения или предотвращения, если пользователь использует поддельное местоположение
Спасибо...