Макет местоположения на Android устройстве?
Как я могу издеваться над своим местоположением на физическом устройстве (Nexus One)? Я знаю, что вы можете сделать это с помощью эмулятора на панели управления эмулятором, но это не работает для физического устройства.
19 ответов:
кажется, единственный способ сделать это использовать макет поставщика местоположения.
вы должны включить макет местоположения в панели разработки в настройках и добавить
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
к вашему манифесту.
теперь вы можете войти в свой код и создать свой собственный макет поставщика местоположения и установить местоположение этого поставщика.
Если вы используете этот телефон только в лаборатории разработки, есть шанс, что вы можете припаять чип GPS и подать последовательный порт непосредственно с последовательностями NMEA с другого устройства.
хотел бы я иметь свой кабель под рукой. Я знаю, что вы можете телнет к эмулятору, чтобы изменить его местоположение
$ telnet localhost 5554 Android Console: type 'help' for a list of commands OK geo fix -82.411629 28.054553 OK
Я не могу вспомнить, если вы можете telnet на устройство, но я думаю, что вы можете. Надеюсь, это поможет.
вам понадобится adb (Android debugging bridge) для этого (CLI).
вы можете использовать разрешение служб определения местоположения для макета местоположения...
"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);
у меня был успех со следующим кодом. Хотя по какой-то причине у меня был один замок (даже если я пробовал разные пары 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ку выложил работает. Использовал код сегодня, но нужно было добавить больше локов. Итак, вот некоторые улучшения:
необязательно: вместо использования LocationManager.Строки GPS_PROVIDER, вы, возможно, захотите, чтобы определить свои собственные аргумента provider_name constat и использовать его. При регистрации обновлений местоположения выберите поставщика с помощью критериев, а не напрямую указывая его в качестве строки.
во-первых: вместо вызова 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 Вы также найдете некоторый код, который на самом деле работает для меня на эмуляторе.
есть приложения, доступные в Android Market, которые позволяют указать "макет местоположения GPS" для вашего устройства.
Я искал https://market.android.com и нашел приложение под названием "Мое поддельное местоположение", которое работает для меня.
макет поставщика GPS, упомянутый Павлом выше (на http://www.cowlumbus.nl/forum/MockGpsProvider.zip) является еще одним примером, который включает в себя исходный код - хотя я не смог установить предоставленный APK (это говорит сбой [INSTALL_FAILED_OLDER_SDK] и может просто нужно перекомпилировать)
для того, чтобы использовать GPS макет местоположения вам нужно включить его в настройках устройства. Перейдите в Настройки -> Приложения -> разработка и поставьте галочку "эмуляция расположения"
затем вы можете использовать приложение, подобное описанным выше, чтобы установить координаты GPS, а Google maps и другие приложения будут использовать макет местоположения GPS, который вы укажете.
это сработало для меня (Android Studio):
отключить отслеживание GPS и WiFi на телефоне. На Android 5.1.1 и ниже, выберите "Разрешить фиктивное местоположение" в настройках.
сделайте копию манифеста в каталоге src/debug. Добавьте к нему (вне тега "приложение") следующее:
использует-разрешение android: name= " android.разрешение.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 () будет работать с координатами вашего крана.
Я только что понял это, так что теперь мне не нужно бродить по окрестностям с телефонами в руках.
Я создал простой обработчик, имитирующий перемещение из начальной позиции.
запустите его в обратном вызове соединения:
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; } } }
надеюсь, что это может помочь..
решение, упомянутое icyerasor и предоставленное Педро в http://pedroassuncao.com/blog/2009/11/12/android-location-provider-mock/ работал очень хорошо для меня. Тем не менее, он не предлагает поддержку для правильного запуска, остановки и перезапуска макет поставщика GPS.
Я немного изменил его код и переписал класс, чтобы быть AsyncTask вместо потока. Это позволяет нам взаимодействовать с потоком пользовательского интерфейса, поэтому мы можем перезапустить поставщика в точке где мы были, когда остановили его. Это очень удобно, когда меняется ориентация экрана.
код, а также Пример проекта для Eclipse, можно найти на GitHub: https://github.com/paulhoux/Android-MockProviderGPS
все кредиты должны идти к Педро для выполнения большей части тяжелой работы.
поддельные GPS приложение из google play сделал трюк для меня. Просто убедитесь, что вы прочитали все инструкции в описании приложения. Вы должны отключить другие службы определения местоположения, а также запустить приложение после включения "поддельные GPS". Работал отлично для того, что мне нужно.
вот ссылка на приложение на GooglePlay: поддельные GPS
учебник Google для этого можно найти здесь, он предоставляет примеры кода и объясняет процесс.
http://developer.android.com/training/location/location-testing.html#SendMockLocations
Если ваше устройство подключено к вашему компьютеру и вы пытаетесь изменить отправить GPS шнуры через эмулятор, он не будет работать.
Это эмулятор управления по какой-то причине.
Просто установите его, чтобы обновить вас на изменение 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(); } } }
Не забудьте положить их в манифест
андроид.разрешение.Функция
андроид.разрешение.ACCESS_MOCK_LOCATION
может быть, это не "программист" подход, но если вы хотите сэкономить свое время и получить рабочее решение instant попробуйте одно из приложений, которые предназначены для макета местоположения доступны в Google Play:
установить Поддельное приложение GPS https://play.google.com/store/apps/details?id=com.incorporateapps.fakegps.fre&hl=en
функции для разработчиков -> выберите макет приложения расположение(это значит, поддельное приложение местоположения выбрано).
поддельные GPS приложение:
двойная вкладка на карте для добавления - > нажмите кнопку воспроизведения - > показать тост "поддельное местоположение остановлено"
наконец, проверьте с Google map apps.
интересно, Нужна ли вам сложная настройка макета местоположения. В моем случае, как только я получил местоположение исправления, я вызывал функцию, чтобы что-то сделать с этим новым местоположением. В таймере создайте макет местоположения. И вместо этого вызовите функцию с этим местоположением. Зная все это время, что в скором времени GPS придумает реальное текущее местоположение. И это нормально. Если время обновления установлено достаточно долго.
Я написал приложение, которое запускает веб-сервер (REST-Like) на вашем телефоне Android, так что вы можете установите положение GPS удаленно. Веб-сайт предоставляет карту, на которой вы можете нажать, чтобы установить новую позицию, или использовать клавиши "wasd" для перемещения в любом направлении. Приложение было быстрым решением, поэтому почти нет пользовательского интерфейса или документации, но реализация прямолинейна, и вы можете посмотреть все в (только четыре) классах.
репозитория проекта : https://github.com/juliusmh/RemoteGeoFix
используйте очень удобный и бесплатный интерактивный симулятор местоположения для телефонов и планшетов Android (под названием CATLES). Он издевается над GPS-местоположением на общесистемном уровне (даже в приложениях Google Maps или Facebook), и он работает как на физических, так и на виртуальных устройствах:
используйте это разрешение в файле манифеста
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION">
android studio будет рекомендовать, чтобы " макет местоположения должен запрашиваться только в тестовом или отладочном файле манифеста (обычно 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);