2013-07-01 2 views
6

Я пишу приложение, которое использует возможность смещения местоположения в android.Используйте mock location, не устанавливая его в настройках

То, что я хотел бы достичь, состоит в том, чтобы издеваться над моим местоположением, не устанавливая флаг «разрешить макет местоположения» в настройках разработчика.

Я знаю, что это возможно, потому что это работает с этим приложением: https://play.google.com/store/apps/details?id=com.lexa.fakegps&hl=en

То, что я пытался:

Генерировать APK, переместите его в/системы/приложения, сделать перезагрузку
И Я также пробовал его с разрешением и без разрешения ACCESS_MOCK_LOCATION в манифесте.

Но все это приведет к этому исключению:
RuntimeException: Не удается запустить активность: SecurityException: Требуется ACCESS_MOCK_LOCATION обеспечения установки

+0

Я бы не хотел, чтобы я спросил: как это работает для вас с FakeGPS? Я установил приложение (из магазина), переместил .apk (он называется base.apk) в/system/app и после перезагрузки приложение работает. Тем не менее, я не могу напасть на места, пока «разрешить макет местоположений» выключен, и если я его включу, то обманываю себя с помощью a pp, а затем выключите «позволить макету местоположений», обман автоматически завершится. Помните, что я делаю неправильно? – Giladiald

+0

Я больше не использую это приложение. Но вы можете найти описание в игровом магазине полезным: https://play.google.com/store/apps/details?id=com.lexa.fakegps&hl=ru – lukassteiner

ответ

13

Я декомпилированы com.lexa.fakegps вы упомянули в вопросе, и что это сделать так:

private int setMockLocationSettings() { 
    int value = 1; 
    try { 
     value = Settings.Secure.getInt(getContentResolver(), 
       Settings.Secure.ALLOW_MOCK_LOCATION); 
     Settings.Secure.putInt(getContentResolver(), 
       Settings.Secure.ALLOW_MOCK_LOCATION, 1); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return value; 
} 

private void restoreMockLocationSettings(int restore_value) { 
    try { 
     Settings.Secure.putInt(getContentResolver(), 
       Settings.Secure.ALLOW_MOCK_LOCATION, restore_value); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

/* every time you mock location, you should use these code */ 
int value = setMockLocationSettings();//toggle ALLOW_MOCK_LOCATION on 
try { 
    mLocationManager.setTestProviderLocation(LocationManager.GPS_PROVIDER, fake_location); 
} catch (SecurityException e) { 
    e.printStackTrace(); 
} finally { 
    restoreMockLocationSettings(value);//toggle ALLOW_MOCK_LOCATION off 
} 

Поскольку время выполнения этого кода очень мало, другие приложения вряд ли можно обнаружить изменение ALLOW_MOCK_LOCATION.

Кроме того, необходимо,
1. требует корневого доступа к устройству
2. Перенесите приложение к /system/app или /system/priv-app

Я попробовал это в моем проекте, и он прекрасно работает.

+0

Это работает для Зефира? – Marlon

+0

Раньше я не пробовал этот код в Marshmallow, но он работает на Lollipop. @ Marlon – PageNotFound

+1

Да, похоже, он не работает в зефире, так как Google обновил системные настройки для выбора приложения, я не могу это сделать работать больше. Я декомпилировал com.incorporateapps.fakegps, потому что пользователи говорят, что он может сделать это в зефире. Код выглядит так же, но он не работает для меня, я не знаю, чего мне не хватает. Вы можете посмотреть на это? @PageNotFound – Marlon

2

Вы требует корневой доступ к устройству, чтобы сделать это.

+0

У меня есть root-доступ к устройству. В противном случае я не мог бы переместить apk в/system/app – lukassteiner

2

Попробуйте http://repo.xposed.info/module/com.brandonnalls.mockmocklocations

Некоторые приложения не позволяют использовать их, если «Разрешить фиктивные местоположения» включен дальше, даже если вы не издевается свое местоположение. Это помогает запретить приложениям обнаружить, что включено «Разрешить макеты».

Смежные вопросы