2010-03-27 4 views
131

Как я могу высмеять свое местоположение на физическом устройстве (Nexus One)? Я знаю, что вы можете сделать это с эмулятором на панели управления эмулятором, но это не работает для физического устройства.Android mock location на устройстве?

+6

На рынке есть несколько приложений, которые могут эмулировать местоположение GPS. Например, «Распознавание местоположения». – Vlad

+0

Для настольных компьютеров вы можете создавать/устанавливать драйверы, которые эмулируют устройство GPS/последовательный порт для целей такого рода тестирования. Возможно, вы могли бы создать или найти что-то подобное для Android. – AaronLS

+0

В этом магазине есть много приложений. Вы можете попробовать это: https://play.google.com/store/apps/details?id=com.yedapps.fakelocation.app.app.fakelocation&hl= en или this - https://play.google.com/store/apps/details?id=com.fakegps.mock&hl=ru – Yehuda

ответ

154

Кажется, единственный способ сделать это - использовать провайдера определения местоположения.

Вы должны включить фиктивные местоположения в панели разработки в настройках и добавьте

<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" /> 

в манифест.

Теперь вы можете зайти в свой код и создать свой собственный провайдер определения местонахождения и указать местоположение этого провайдера.

+19

неработающая ссылка :(plz update –

+80

На рынке есть приложение под названием «Fake GPS». Если вы включите Mock Locations на своем устройстве, он предлагает удобный графический интерфейс для настройки вашего местоположения. Я понимаю, что это не так. - свое решение, но, безусловно, достойное решение для быстрого тестирования. –

+2

[this] (http://pedroassuncao.com/2009/11/android-location-provider-mock/) может быть ссылкой - той же датой и соответствующим контентом. – DefenestrationDay

97

Если вы используете этот телефон только в лаборатории разработки, есть вероятность, что вы можете припаять GPS-чип и последовательный порт подачи напрямую с помощью последовательностей NMEA с другого устройства.

+64

Почему ненавистники? Этот ответ очень тяжелый. –

+53

Awesomely хардкор, хотя и бесполезно и бесполезно. – olivervbk

+13

Приятно, однако. – etienne

25

Вы можете использовать разрешение Опред.местополож на макете место ...

"android.permission.ACCESS_MOCK_LOCATION"

, а затем в коде Java,

// Set location by setting the latitude, longitude and may be the altitude... 
String[] MockLoc = str.split(","); 
Location location = new Location(mocLocationProvider);    
Double lat = Double.valueOf(MockLoc[0]); 
location.setLatitude(lat); 
Double longi = Double.valueOf(MockLoc[1]); 
location.setLongitude(longi); 
Double alti = Double.valueOf(MockLoc[2]); 
location.setAltitude(alti); 
+8

Что такое значение mocLocationProvider? – Victor

+0

, например. LocationManager.GPS_PROVIDER – enigma969

32

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

$ telnet localhost 5554 
Android Console: type 'help' for a list of commands 
OK 
geo fix -82.411629 28.054553 
OK 

Я не могу вспомнить, если вы можете телнет к устройству, но я думаю, что вы можете. Надеюсь, это поможет.

Для этого (CLI) вам понадобится adb (модем для отладки android).

+0

вы получаете разрешение, запрещенное всем, что вы отправляете в качестве команды на консоль вашего устройства. Возможно, это возможно с помощью приложения с терминалом, но я думаю, что для этого нужен root-доступ. – Janusz

+0

Просто так мы находимся на одной странице: вы не говорите об «оболочке adb», так? То, о чем я говорю, отличается, это настройка, которая позволяет вам устанавливать специфичные для Android параметры. Я знаю, например, вы можете настроить переадресацию портов (то есть localhost: 1234 переходит на телефон: 1234) без доступа root, поэтому вы можете настроить прокси-сервер SOCKS и туннель через кабель без root. –

+0

Вы можете использовать adb forward tcp: 6000 tcp: 23, чтобы переместить порт 6000 на ваш компьютер в порт 23 на устройстве, но я не смог подключиться, даже если порт показан как открытый. Использование telnet-клиента на устройстве и подключение к localhost также не удается – Janusz

21

У меня был успех со следующим кодом. Хотя по какой-то причине он получил мне один замок (даже если я пробовал разные пары LatLng), это сработало для меня. mLocationManager является LocationManager, который подключен к LocationListener:

private void getMockLocation() 
{ 
    mLocationManager.removeTestProvider(LocationManager.GPS_PROVIDER); 
    mLocationManager.addTestProvider 
    (
     LocationManager.GPS_PROVIDER, 
     "requiresNetwork" == "", 
     "requiresSatellite" == "", 
     "requiresCell" == "", 
     "hasMonetaryCost" == "", 
     "supportsAltitude" == "", 
     "supportsSpeed" == "", 
     "supportsBearing" == "", 

     android.location.Criteria.POWER_LOW, 
     android.location.Criteria.ACCURACY_FINE 
    );  

    Location newLocation = new Location(LocationManager.GPS_PROVIDER); 

    newLocation.setLatitude (/* TODO: Set Some Lat */); 
    newLocation.setLongitude(/* TODO: Set Some Lng */); 

    newLocation.setAccuracy(500); 

    mLocationManager.setTestProviderEnabled 
    (
     LocationManager.GPS_PROVIDER, 
     true 
    ); 

    mLocationManager.setTestProviderStatus 
    (
     LocationManager.GPS_PROVIDER, 
     LocationProvider.AVAILABLE, 
     null, 
     System.currentTimeMillis() 
    );  

    mLocationManager.setTestProviderLocation 
    (
     LocationManager.GPS_PROVIDER, 
     newLocation 
    );  
} 
+1

Хороший пост, см. мой ответ ниже для дополнений. – icyerasor

+0

Что такое 'setTestProviderStatus'? Я не вижу цели ... –

+0

Насколько я помню,' setTestProviderStatus' используется здесь, чтобы уведомлять/отправлять/планировать событие с помощью LocationManager, что поставщик GPS нашел исправление «сейчас», так что обработка этого события может произойти. – Dr1Ku

13

Что Dr1Ku размещены работы. Используется код сегодня, но необходимо добавить больше locs. Итак, вот некоторые улучшения:

Необязательно: вместо использования строки LocationManager.GPS_PROVIDER вы можете определить свой собственный константу PROVIDER_NAME и использовать ее. При регистрации для обновлений местоположения выберите поставщика через критерии, а не напрямую указывая его как строку.

Во-первых: Вместо вызова removeTestProvider, сначала проверьте, есть ли поставщик должен быть удален (чтобы избежать IllegalArgumentException):

if (mLocationManager.getProvider(PROVIDER_NAME) != null) { 
    mLocationManager.removeTestProvider(PROVIDER_NAME); 
} 

Во-вторых: Для того, чтобы опубликовать более одного места, вы должны установить время расположение:

newLocation.setTime(System.currentTimeMillis()); 
... 
mLocationManager.setTestProviderLocation(PROVIDER_NAME, newLocation); 

Там также, как представляется, тест Google, который использует MockLocationProviders: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/1.5_r4/android/location/LocationManagerProximityTest.java

Другое хороший рабочий пример можно найти по адресу: http://pedroassuncao.com/blog/2009/11/12/android-location-provider-mock/

Другой хорошей статьи: http://ballardhack.wordpress.com/2010/09/23/location-gps-and-automated-testing-on-android/#comment-1358 Вы также найдете код, который на самом деле работает для меня на эмуляторе.

+0

Прохладное предложение об определении вашего собственного провайдера, вещь с использованием GPS_PROVIDER заключается в том, что вы (по-видимому) не можете избавиться от макет провайдера (точнее, вы не можете переключиться на обычный GPS) до перезагрузки. Удивительный пост, я также проверю ссылки! – Dr1Ku

+0

@ Dr1KU До сих пор не удается вернуться к нормальному GPS? Это где-то указано? –

+0

@ KazDragon Тогда это было тогда. Из того, что я могу вспомнить, после включения «Mock Provider» нормальный GPS не работал, я не мог получить исправление (я тестировал непосредственно на устройстве). Это может быть не так, поскольку с тех пор многое произошло в Android. – Dr1Ku

6

Решение, упомянутое icyerasor и предоставленное Педро в http://pedroassuncao.com/blog/2009/11/12/android-location-provider-mock/, очень хорошо работало для меня. Тем не менее, он не предлагает поддержки для правильного запуска, остановки и повторного запуска провайдера mock GPS.

Я немного изменил свой код и переписал класс как AsyncTask вместо Thread. Это позволяет нам связываться с потоком пользовательского интерфейса, поэтому мы можем перезапустить поставщика в тот момент, когда мы были, когда остановили его. Это пригодится, когда меняется ориентация экрана.

код вместе с образцом проекта Затмения, можно найти на GitHub: https://github.com/paulhoux/Android-MockProviderGPS

Все кредиты должны пойти в Педро для делать большую часть тяжелой работы.

8

В Android Market есть приложения, которые позволяют указать «Mock GPS Location» для вашего устройства.

Я искал https://market.android.com и нашел приложение под названием «My Fake Location», которое работает для меня.

Поставщик Mock GPS, упомянутый Paul выше (at http://www.cowlumbus.nl/forum/MockGpsProvider.zip), является еще одним примером, включающим исходный код - хотя я не смог установить предоставленный APK (он говорит об ошибке [INSTALL_FAILED_OLDER_SDK] и может просто понадобиться перекомпиляция)

Чтобы использовать топовые местоположения GPS, вам необходимо включить его в настройках вашего устройства. Перейти к настройкам -> Приложения -> Разработка и проверка «Разрешить макет местоположения»

Вы можете использовать приложение, подобное описанному выше, чтобы установить GPS-координаты, а карты Google и другие приложения будут использовать указанное вами местоположение, ,

+0

очень полезный пример .. – NullPointerException

+0

Fake GPS проще. Мне просто интересно, почему они запрашивают идентификатор вызывающего абонента в разрешении на приложение: S –

0

Интересно, нужна ли вам сложная настройка местоположения Mock. В моем случае, когда я получил место для исправления, я вызывал функцию, чтобы что-то сделать с этим новым местоположением. В таймере создайте макет местоположения. И вместо этого вызовите функцию с этим местоположением. Зная все это, в скором времени GPS будет иметь реальное текущее местоположение. Это нормально. Если время обновления установлено достаточно долго.

1

Если ваше устройство подключено к компьютеру, и вы пытаетесь изменить отправку GPS-кабелей. С помощью регулятора Emulator он не будет работать.
Это элемент управления EMULATOR по какой-либо причине.
Просто установите его, чтобы обновить вас при смене GPS.

lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 

    ll = new LocationListener() {   
     public void onLocationChanged(Location location) { 
      // Called when a new location is found by the network location provider. 
      onGPSLocationChanged(location); 
     } 

     public void onStatusChanged(String provider, int status, Bundle extras) {  
      bigInfo.setText("Changed "+ status); 
     } 

     public void onProviderEnabled(String provider) { 
      bigInfo.setText("Enabled "+ provider); 
     } 

     public void onProviderDisabled(String provider) { 
      bigInfo.setText("Disabled "+ provider); 
     } 
     }; 

Когда GPS обновлен, перепишите следующий метод, чтобы сделать то, что вы хотите;

public void onGPSLocationChanged(Location location){ 
if(location != null){ 
    double pLong = location.getLongitude(); 
    double pLat = location.getLatitude(); 
    textLat.setText(Double.toString(pLat)); 
    textLong.setText(Double.toString(pLong)); 
    if(autoSave){ 
     saveGPS(); 
     } 
    } 
} 

Не забудьте положить их в Фиктивный приложение GPS манифеста
android.permission.ACCESS_FINE_LOCATION
android.permission.ACCESS_MOCK_LOCATION

3

из Google Play сделал трюк для меня. Просто убедитесь, что вы прочитали все указания в описании приложения. Вы должны отключить другие службы определения местоположения, а также запустить свое приложение после включения «Fake GPS». Работал отлично для того, что мне было нужно.

Вот ссылка на приложение на GooglePlay: Fake GPS

7

Это работает для меня (Android студия):

Отключить GPS и WiFi отслеживания по телефону. На Android 5.1.1 и ниже выберите «включить макет местоположения» в «Параметры разработчика».

Сделайте копию своего манифеста в каталоге src/debug. Добавьте следующий к нему (за пределами «приложения» метки):

использует разрешение-андроида: имя = «android.permission.ACCESS_MOCK_LOCATION»

Настройка карты Фрагмент под названием «карта». Включите следующий код в OnCreate():

lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
ll = new MyLocationListener(); 
if (lm.getProvider("Test") == null) { 
    lm.addTestProvider("Test", false, false, false, false, false, false, false, 0, 1); 
} 
lm.setTestProviderEnabled("Test", true); 
lm.requestLocationUpdates("Test", 0, 0, ll); 

map.setOnMapClickListener(new GoogleMap.OnMapClickListener() { 
    @Override 
    public void onMapClick(LatLng l) { 
     Location loc = new Location("Test"); 
     loc.setLatitude(l.latitude); 
     loc.setLongitude(l.longitude); 
     loc.setAltitude(0); 
     loc.setAccuracy(10f); 
     loc.setElapsedRealtimeNanos(System.nanoTime()); 
     loc.setTime(System.currentTimeMillis()); 
     lm.setTestProviderLocation("Test", loc); 
    } 
}; 

Обратите внимание, что вы, возможно, придется временно увеличить «minSdkVersion» в вашем модуле Gradle файла до 17 для того, чтобы использовать метод «setElapsedRealtimeNanos».

Включить следующий код внутри основного класса деятельности:

private class MyLocationListener implements LocationListener { 
    @Override 
    public void onLocationChanged(Location location) { 
     // do whatever you want, scroll the map, etc. 
    } 
} 

Запустить приложение с AS. На Android 6.0 и выше вы получите исключение безопасности. Теперь перейдите в «Параметры разработчика» в «Настройки» и выберите «Выбрать приложение для определения местоположения». Выберите свое приложение из списка.

Теперь, когда вы нажимаете на карту, onLocationChanged() будет стрелять с координатами вашего крана.

Я просто понял это, поэтому теперь мне не нужно бродяжничать по соседству с телефонами в руке.

+0

не работает с Android 6 –

+0

Я думаю, что он работает на android 6, если вы положили этот код на службу – Hamza

1

Может быть, это не «программист» подход, но если вы хотите сэкономить время и получить рабочий раствор мгновенная попробовать один из приложений, посвятивших издеваться расположение доступны в Google Play:

Fake GPS Location Spoofer

Mock Locations

Fake GPS location

+1

Вы их пробовали? Они работали по запросу в вопросе? – arekolek

+0

Да, они работают точно так, как было запрошено из коробки. – mklimek

+0

Любые предпочтения? Или все они нужны? : P – arekolek

7

Я создал простой обработчик, имитирующий движущееся положение из исходного положения.

Запустить его в связи обратного вызов:

private final GoogleApiClient.ConnectionCallbacks mConnectionCallbacks = new GoogleApiClient.ConnectionCallbacks() { 
    @Override 
    public void onConnected(Bundle bundle) { 
     if (BuildConfig.USE_MOCK_LOCATION) { 
      LocationServices.FusedLocationApi.setMockMode(mGoogleApiClient, true); 
      new MockLocationMovingHandler(mGoogleApiClient).start(48.873399, 2.342911); 
     } 
    } 

    @Override 
    public void onConnectionSuspended(int i) { 

    } 
}; 

Класс Handler:

private static class MockLocationMovingHandler extends Handler { 

    private final static int SET_MOCK_LOCATION = 0x000001; 
    private final static double STEP_LATITUDE = -0.00005; 
    private final static double STEP_LONGITUDE = 0.00002; 
    private final static long FREQUENCY_MS = 1000; 
    private GoogleApiClient mGoogleApiClient; 
    private double mLatitude; 
    private double mLongitude; 

    public MockLocationMovingHandler(final GoogleApiClient googleApiClient) { 
     super(Looper.getMainLooper()); 
     mGoogleApiClient = googleApiClient; 
    } 

    public void start(final double initLatitude, final double initLongitude) { 
     if (hasMessages(SET_MOCK_LOCATION)) { 
      removeMessages(SET_MOCK_LOCATION); 
     } 
     mLatitude = initLatitude; 
     mLongitude = initLongitude; 
     sendEmptyMessage(SET_MOCK_LOCATION); 
    } 

    public void stop() { 
     if (hasMessages(SET_MOCK_LOCATION)) { 
      removeMessages(SET_MOCK_LOCATION); 
     } 
    } 

    @Override 
    public void handleMessage(Message message) { 
     switch (message.what) { 
      case SET_MOCK_LOCATION: 
       Location location = new Location("network"); 
       location.setLatitude(mLatitude); 
       location.setLongitude(mLongitude); 
       location.setTime(System.currentTimeMillis()); 
       location.setAccuracy(3.0f); 
       location.setElapsedRealtimeNanos(System.nanoTime()); 
       LocationServices.FusedLocationApi.setMockLocation(mGoogleApiClient, location); 

       mLatitude += STEP_LATITUDE; 
       mLongitude += STEP_LONGITUDE; 
       sendEmptyMessageDelayed(SET_MOCK_LOCATION, FREQUENCY_MS); 
       break; 
     } 
    } 
} 

Надеется, что это может помочь ..

1

Установить поддельное приложение GPS https://play.google.com/store/apps/details?id=com.incorporateapps.fakegps.fre&hl=en

Параметры разработчика ->Выберите приложение для определения местоположения (Это означает, что выбрано приложение «Поддельное местоположение»).

Поддельные приложение GPS:

Двойной язычок на карте, чтобы добавить -> нажмите на кнопку воспроизведения -> Показать тост «Поддельные место остановил»

наконец проверить с Google Map приложений.

0

Я написал приложение, которое запускает WebServer (REST-Like) на Android-телефоне, поэтому вы можете установить GPS-позицию удаленно. На веб-сайте представлена ​​карта, на которую вы можете щелкнуть, чтобы установить новую позицию, или использовать клавиши «wasd» для перемещения в любом направлении. Приложение было быстрым решением, поэтому почти нет пользовательского интерфейса или документации, но реализация прямолинейна, и вы можете искать все в классах (всего четыре).

хранилище

проекта: https://github.com/juliusmh/RemoteGeoFix

0

Используйте это разрешение в файле манифеста

<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"> 

андроид студия будет рекомендовать «Мок место должно быть запрошены только в тестовой или отладки конкретного файла манифеста (обычно Src/отладки/AndroidManifest.XML)» просто отключить проверку

Теперь убедитесь, что вы проверили„Эмуляция расположения“в установке для разработчиков телефона

Используйте LocationManager

locationManager.addTestProvider(mocLocationProvider, false, false, 
       false, false, true, true, true, 0, 5); 
locationManager.setTestProviderEnabled(mocLocationProvider, true); 

Теперь установите где бы вы ни находились

Location mockLocation = new Location(mocLocationProvider); 
     mockLocation.setLatitude(lat); 
     mockLocation.setLongitude(lng); 
     mockLocation.setAltitude(alt); 
     mockLocation.setTime(System.currentTimeMillis()); 

locationManager.setTestProviderLocation (mocLocationProvider, mockLocation);

0

Используйте очень удобный и бесплатный интерактивный симулятор местоположения для телефонов и планшетов Android (названных CATLES). Он высмеивает GPS-местоположение на уровне всей системы (даже в пределах приложения Google Maps или Facebook), и она работает на физическом, так и виртуальных устройств:

Сайт: http://ubicom.snet.tu-berlin.de/catles/index.html

Видео: https://www.youtube.com/watch?v=0WSwH5gK7yg

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