Як я можу висміювати своє місцезнаходження на фізичному пристрої (Nexus One)? Я знаю, що ви можете зробити це за допомогою емулятора на панелі керування емулятора, але це не працює для фізичного пристрою.
Як я можу висміювати своє місцезнаходження на фізичному пристрої (Nexus One)? Я знаю, що ви можете зробити це за допомогою емулятора на панелі керування емулятора, але це не працює для фізичного пристрою.
Відповіді:
Здається, єдиний спосіб зробити це - скористатися макетом провайдера місцезнаходження.
Ви повинні увімкнути макет місцеположень на панелі розробки у своїх налаштуваннях та додати
<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
Я не можу пригадати, чи можете ви телефонувати на свій пристрій, але я думаю, що ви можете. Я сподіваюся, що це допомагає.
Для цього вам знадобиться adb (андроїд-налагоджувальний міст) (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
);
}
setTestProviderStatus
тут використовується для сповіщення / публікації / планування події з LocationManager про те, що постачальник GPS знайшов виправлення «зараз», щоб відбулася обробка зазначеної події.
mLocationManager
це , LocationManager
який підключений до LocationListener»? як я можу це зробити? Дякую ..
LocationManager
сервісу та LocationListener
: blog.doityourselfandroid.com/2010/12/25/…
Що розміщував 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 багато трапилось.
На Android Market доступні додатки, які дозволяють вказати "Mock GPS Location" для вашого пристрою.
Я шукав https://market.android.com і знайшов додаток під назвою "Моє підроблене місце", яке працює для мене.
Згаданий Пол Постачальник Mock GPS (за адресою http://www.cowlumbus.nl/forum/MockGpsProvider.zip ) - це ще один приклад, який включає вихідний код - хоча я не зміг встановити наданий APK (він говорить про помилку [INSTALL_FAILED_OLDER_SDK] і може просто знадобитися перекомпіляція)
Щоб використовувати GPS-макетні місця, потрібно включити його в налаштуваннях вашого пристрою. Перейдіть у Налаштування -> Програми -> Розробка та встановіть прапорець "Дозволити макет розташування"
Потім ви можете використовувати додаток, подібний до описаного вище, для встановлення координат GPS, а карти Google та інші додатки використовуватимуть макетне GPS-розташування, яке ви вказуєте.
Це працювало для мене (Android Studio):
Відключити відстеження GPS та WiFi на телефоні. В ОС Android 5.1.1 та пізніших версій виберіть "Увімкнути макет місцеположення" в Параметрах розробника.
Зробіть копію свого маніфесту в каталозі src / debug. Додайте до нього таке (поза тегом "додаток"):
використовує-дозвіл 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 () запустить координати вашого крана.
Я щойно зрозумів це, тому тепер мені не доведеться топтати околиці з телефонами в руці.
Я створив простий обробник, що імітує рухоме положення з початкового положення.
Почніть його у зворотній зв'язок:
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
Вся заслуга повинна бути приділена Педро за те, що він проводив більшу частину важкої роботи.
Додайте до свого маніфесту
<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);
}
Вам також потрібно буде включити глузливі місця в налаштуваннях для розробників пристроїв. Якщо це недоступно, встановіть "прикладну програму розташування" у своїй програмі, як тільки було зазначено вище.
Підроблена програма GPS від Google play зробила для мене трюк. Просто переконайтеся, що ви прочитали всі вказівки в описі програми. Вам потрібно відключити інші служби локації, а також запустити додаток після ввімкнення "Підробленого GPS". Працював чудово для того, що мені було потрібно.
Ось посилання на додаток на GooglePlay: Підроблений GPS
Підручник Google для цього можна знайти тут, він містить приклади коду та пояснює процес.
http://developer.android.com/training/location/location-testing.html#SendMockLocations
Встановіть підроблений додаток GPS https://play.google.com/store/apps/details?id=com.incorporateapps.fakegps.fre&hl=uk
Опції для розробників -> Вибрати макет місцеположення (це означає, вибрано підроблену програму розташування).
Підроблений додаток GPS :
Подвійну вкладку на карті, щоб додати -> натисніть кнопку відтворення -> Показати тост "Підроблене місце зупинене"
нарешті, ознайомтесь із програмами Google map.
Я написав додаток, що працює на веб-сервері (як 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:
Скористайтеся дуже зручним та безкоштовним інтерактивним симулятором розташування для телефонів та планшетів 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);
Вищезазначені рішення для мене не спрацювали, тому що я тестував на пристрої Android з останньою версією Служб Google Play, яка використовує FusedLocationProviderClient . Після встановлення дозволу на макет розташування в маніфесті програми та додатку як зазначеному додатку макету місцеположення в налаштуваннях розробника (як згадувалось у попередніх відповідях), я додав нижче код Котліна, який успішно висміював місце розташування.
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)