Android mock location на устройстве?

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

Ответ 1

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

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

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

к вашему манифесту.

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

Ответ 2

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

Ответ 3

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

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

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

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

Ответ 4

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

"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);

Ответ 5

У меня был успех со следующим кодом. Хотя по какой-то причине он получил мне один замок (даже если я пробовал разные пары 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
    );      
}

Ответ 6

Что написал 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 Вы также найдете код, который действительно работает для меня на эмуляторе.

Ответ 7

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

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

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

Для того, чтобы использовать местоположения модуляции GPS, вам необходимо включить его в настройках вашего устройства. Перейдите в Настройки → Приложения → Разработка и установите флажок "Разрешить макеты"

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

Ответ 8

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

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

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

use-permission android: name= "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() будет стрелять с координатами вашего крана.

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

Ответ 9

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

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

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) {

    }
};

Класс обработчика:

   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;
        }
    }
}

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

Ответ 10

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

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

Код, а также пример проекта для Eclipse, можно найти на GitHub: https://github.com/paulhoux/Android-MockProviderGPS

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

Ответ 11

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

Вот ссылка на приложение в GooglePlay: Поддельный GPS

Ответ 13

Если ваше устройство подключено к компьютеру, и вы пытаетесь изменить отправку GPS-кабелей. С помощью элемента управления эмулятора он не будет работать.
Это элемент управления 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();  
        }
    }
}

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

Ответ 14

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

Поддельный GPS-спутник местоположения

Mock Locations

Поддельное местоположение GPS

Ответ 15

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

Параметры разработчика → Выберите приложение для определения местоположения (это означает, что выбрано приложение Fake location).

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

Двойная вкладка на карте для добавления → нажмите кнопку воспроизведения → Показать тост "Поддельное местоположение остановлено"

наконец, проверьте с помощью приложений карты google.

Ответ 16

Добавить в свой манифест

<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"
    tools:ignore="MockLocation,ProtectedPermissions" />

Функция фиктивного местоположения

void setMockLocation() {
    LocationManager locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
    locationManager.addTestProvider(LocationManager.GPS_PROVIDER, false, false,
            false, false, true, true, true, 0, 5);
    locationManager.setTestProviderEnabled(LocationManager.GPS_PROVIDER, true);

    Location mockLocation = new Location(LocationManager.GPS_PROVIDER);
    mockLocation.setLatitude(-33.852);  // Sydney
    mockLocation.setLongitude(151.211);
    mockLocation.setAltitude(10);
    mockLocation.setAccuracy(5);
    mockLocation.setTime(System.currentTimeMillis());
    mockLocation.setElapsedRealtimeNanos(System.nanoTime());
    locationManager.setTestProviderLocation(LocationManager.GPS_PROVIDER, mockLocation);
}

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

Ответ 17

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

Ответ 18

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

Репозиторий проекта: https://github.com/juliusmh/RemoteGeoFix

Ответ 19

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

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

Андроид-студия будет рекомендовать, что "Mock-местоположение должно запрашиваться только в файле манифеста теста или отладки (обычно src/debug/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); 

Ответ 20

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

Веб-сайт: http://ubicom.snet.tu-berlin.de/catles/index.html

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