Как я могу имитировать свое местоположение на физическом устройстве (Nexus One)?
Я знаю, что вы можете сделать это с помощью эмулятора на панели управления эмулятором, но это не работает для физического устройства.
Как я могу имитировать свое местоположение на физическом устройстве (Nexus One)?
Я знаю, что вы можете сделать это с помощью эмулятора на панели управления эмулятором, но это не работает для физического устройства.
Кажется, единственный способ сделать это - использовать имитацию провайдера местоположения.
Вы должны включить фиктивные местоположения в панели разработки в своих настройках и добавить
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
в ваш манифест.
Теперь вы можете войти в свой код и создать своего собственного провайдера фиктивного местоположения и установить местоположение этого провайдера.
Если вы используете этот телефон только в лаборатории разработки, есть вероятность, что вы сможете припаять чип GPS и напрямую подключить к последовательному порту последовательности NMEA с другого устройства.
Хотел бы я иметь под рукой свой кабель. Я знаю, что вы можете подключиться к эмулятору через telnet, чтобы изменить его местоположение
$ telnet localhost 5554
Android Console: type 'help' for a list of commands
OK
geo fix -82.411629 28.054553
OK
Я не могу вспомнить, можете ли вы подключиться к своему устройству через Telnet, но я думаю, что можете. Надеюсь, это поможет.
Для этого (CLI) вам понадобится adb (мост отладки Android).
Вы можете использовать разрешение служб геолокации, чтобы имитировать местоположение ...
"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
);
}
setTestProviderStatus
используется здесь для уведомления / публикации / планирования события с помощью LocationManager о том, что поставщик GPS нашел исправление, чтобы можно было обработать указанное событие.
- person Dr1Ku; 11.04.2015
mLocationManager
- это LocationManager
, подключенный к LocationListener? как я могу это сделать? Спасибо..
- person Yehuda; 25.07.2015
LocationManager
и LocationListener
: blog.doityourselfandroid.com/2010/12/25/
- person Dr1Ku; 28.07.2015
То, что опубликовал Dr1Ku, работает. Использовал код сегодня, но нужно было добавить больше мест. Итак, вот некоторые улучшения:
Необязательно: вместо использования строки 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 Вы также найдете код, который действительно работает для мне на эмуляторе.
Mock Provider
нормальный GPS не работал, я не мог получить исправление (я тестировал прямо на устройстве). Это может быть не так, поскольку с тех пор в Android многое произошло.
- person Dr1Ku; 22.11.2013
В Android Market доступны приложения, позволяющие указать «фиктивное местоположение GPS» для вашего устройства.
Я выполнил поиск по https://market.android.com и нашел приложение под названием "My Fake Location", которое мне подходит. .
Поставщик Mock GPS, упомянутый выше Полом (по адресу http://www.cowlumbus.nl/forum/MockGpsProvider.zip) - еще один пример, который включает исходный код, хотя мне не удалось установить предоставленный APK (там написано Failure [INSTALL_FAILED_OLDER_SDK] и может потребоваться перекомпиляция).
Чтобы использовать фиктивные местоположения GPS, вам необходимо включить его в настройках вашего устройства. Зайдите в «Настройки» -> «Приложения» -> «Разработка» и установите флажок «Разрешить фиктивные местоположения».
Затем вы можете использовать приложение, подобное описанному выше, для установки координат GPS и карт Google, а другие приложения будут использовать указанное вами фиктивное местоположение GPS.
Я создал простой Handler, имитирующий движущуюся позицию из начальной позиции.
Запустите его в обратном вызове соединения:
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;
}
}
}
Надеюсь, это поможет ..
Это сработало для меня (Android Studio):
Отключите GPS и WiFi отслеживание на телефоне. На Android 5.1.1 и ниже выберите «Включить фиктивные местоположения» в параметрах разработчика.
Сделайте копию своего манифеста в каталоге src / debug. Добавьте к нему следующее (вне тега «application»):
использует-разрешение 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» в вашем файле градиента модуля до 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 () срабатывает с координатами вашего касания.
Я только что понял это, так что теперь мне не нужно бродить по окрестностям с телефонами в руках.
Добавить в свой манифест
<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);
}
Вам также необходимо включить фиктивные местоположения в настройках разработчика устройств. Если это недоступно, установите «приложение фиктивного определения местоположения» для своего приложения после того, как будет реализовано вышеупомянутое.
Решение, упомянутое icyerasor и предоставленное Педро по адресу http://pedroassuncao.com/blog/2009/11/12/android-location-provider-mock/ мне очень понравился. Однако он не предлагает поддержки для правильного запуска, остановки и перезапуска ложного поставщика GPS.
Я немного изменил его код и переписал класс как AsyncTask вместо Thread. Это позволяет нам взаимодействовать с потоком пользовательского интерфейса, поэтому мы можем перезапустить провайдер в той точке, где мы были, когда остановили его. Это удобно при изменении ориентации экрана.
Код вместе с образцом проекта для Eclipse можно найти на GitHub: https://github.com/paulhoux/Android-MockProviderGPS
Вся заслуга в том, что Педро проделал большую часть тяжелой работы.
Поддельное приложение GPS из Google Play помогло мне. Просто убедитесь, что вы прочитали все указания в описании приложения. Вы должны отключить другие службы определения местоположения, а также запустить приложение после включения «Поддельного GPS». Отлично работал для того, что мне было нужно.
Вот ссылка на приложение в GooglePlay: Fake GPS < / а>
Вышеупомянутые решения не сработали для меня, потому что я тестировал устройство Android с последней версией Google Play Services, в которой используется FusedLocationProviderClient. После установки разрешения фиктивного местоположения в манифесте приложения и приложения в качестве указанного приложения фиктивного местоположения в настройках разработчика (как упоминалось в предыдущих ответах) я затем добавил код Kotlin ниже, который успешно смоделировал местоположение.
locationProvider = FusedLocationProviderClient(context)
locationProvider.setMockMode(true)
val loc = Location(providerName)
val mockLocation = Location(providerName) // a string
mockLocation.latitude = latitude // double
mockLocation.longitude = longitude
mockLocation.altitude = loc.altitude
mockLocation.time = System.currentTimeMillis()
mockLocation.accuracy = 1f
mockLocation.elapsedRealtimeNanos = SystemClock.elapsedRealtimeNanos()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
mockLocation.bearingAccuracyDegrees = 0.1f
mockLocation.verticalAccuracyMeters = 0.1f
mockLocation.speedAccuracyMetersPerSecond = 0.01f
}
// locationManager.setTestProviderLocation(providerName, mockLocation)
locationProvider.setMockLocation(mockLocation)
Учебник Google для этого можно найти здесь, он предоставляет примеры кода и объясняет процесс.
http://developer.android.com/training/location/location-testing.html#SendMockLocations
Установите приложение Fake GPS https://play.google.com/store/apps/details?id=com.incorporateapps.fakegps.fre&hl=en.
Параметры разработчика -> Выберите приложение фиктивного местоположения (это означает, что выбрано приложение фиктивного местоположения).
Поддельное приложение GPS:
Двойная вкладка на карте для добавления -> нажмите кнопку воспроизведения -> Показать тост «Поддельное местоположение остановлено»
наконец, проверьте с помощью приложений карты Google.
Я написал приложение, которое запускает веб-сервер (REST-Like) на вашем телефоне Android, так что вы можете установить положение GPS удаленно. На веб-сайте представлена карта, на которой вы можете щелкнуть мышью, чтобы установить новое положение, или используйте клавиши «wasd» для перемещения в любом направлении. Приложение было быстрым решением, поэтому почти нет пользовательского интерфейса или документации, но реализация проста, и вы можете просмотреть все (только четыре) класса.
Репозиторий проекта: https://github.com/juliusmh/RemoteGeoFix
Если ваше устройство подключено к компьютеру и вы пытаетесь изменить шнуры отправки 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();
}
}
}
Не забудьте указать их в манифесте
android.permission.ACCESS_FINE_LOCATION
android.permission.ACCESS_MOCK_LOCATION
Интересно, нужна ли вам сложная настройка Mock Location. В моем случае, как только я получил местоположение исправления, я вызвал функцию, чтобы что-то сделать с этим новым местоположением. В таймере создайте фиктивную локацию. И вместо этого вызовите функцию с этим местоположением. Все время зная, что через короткое время GPS определит реальное текущее местоположение. Что нормально. Если у вас установлено достаточно большое время обновления.
Возможно, это не подход «программиста», но если вы хотите сэкономить свое время и мгновенно получить рабочее решение, попробуйте одно из приложений, предназначенных для имитации местоположения, доступных в Google Play:
фальшивый спуфер GPS-местоположения
Воспользуйтесь очень удобным и бесплатным интерактивным симулятором местоположения для телефонов и планшетов Android (CATLES). Он имитирует местоположение GPS на общесистемном уровне (даже в приложениях Google Maps или Facebook) и работает как на физических, так и на виртуальных устройствах:
Веб-сайт: http://ubicom.snet.tu-berlin.de/catles/index.html
Видео: https://www.youtube.com/watch?v=0WSwH5gK7yg
Используйте это разрешение в файле манифеста
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION">
Студия Android порекомендует, чтобы «фиктивное местоположение запрашивалось только в файле манифеста для тестирования или отладки (обычно 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);