2012-01-17 4 views
2

DDMS не может отправить местоположение в эмулятор. Я попытался отправить только местоположение из DDMS, но эмулятор не смог получить местоположение. Ничего не отображается в журнале DDMS, когда я нажимаю кнопку «Отправить».Отправьте GPS-координаты на эмулятор Android, используя DDMS, telnet или любые другие средства

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

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

Я тестирую эмулятор Android 2.2. Может ли кто-нибудь сообщить мне, что не так?

Мое приложение (см. Ниже) написано на C# с использованием Mono для Android и может потребоваться исправление (я новичок на всех Android-устройствах, поэтому я мог что-то пропустить). OnLocationChanged (Location location) просто не срабатывает, как если бы слушатель не был правильно определен. Любая помощь оценивается.

Примечание: При первом запуске этой операции LocationManager.GetLastKnownLocation имеет значение NULL, но материал поставщика теста не доступен. Когда я снова запускаю его, GetLastKnowLocation по-прежнему является нулевым, но доступ к нему и настройкам тестируемого поставщика. Weird.

[Activity(Label = "Location Demo")] 
public class LocationActivity : Activity, ILocationListener 
{ 
    private TextView _locationText; 
    private LocationManager _locationManager; 
    private StringBuilder _builder; 
    private Geocoder _geocoder; 

    protected override void OnCreate(Bundle savedInstanceState) 
    { 
     base.OnCreate(savedInstanceState); 
     SetContentView(Resource.Layout.LocationActivity); 
     _geocoder = new Geocoder(this); 
     _locationText = FindViewById<TextView>(Resource.Id.TextView1); 
     _locationManager = (LocationManager)GetSystemService(LocationService); 

     if (_locationManager.GetLastKnownLocation("gps") == null) 
     { 
      _locationManager.AddTestProvider("gps", false, false, false, false, false, false, false, 0, 5); 
      _locationManager.SetTestProviderEnabled("gps", true); 
      Location loc = new Location("gps"); 
      loc.Latitude = 50; 
      loc.Longitude = 50; 
      _locationManager.SetTestProviderLocation("gps", loc); 
     } 
     Location lastKnownLocation = _locationManager.GetLastKnownLocation("gps"); 

     if (lastKnownLocation != null) 
     { 
      _locationText.Text += string.Format("Last known location, lat: {0}, long: {1}", lastKnownLocation.Latitude, lastKnownLocation.Longitude); 
     } 
     else 
     { 
      _locationText.Text += string.Format("Last location unknown"); 
     } 
     _locationManager.RequestLocationUpdates("gps", 5000, 2, this); 
    } 
    public void OnLocationChanged(Location location) 
    { 
     _locationText.Text += string.Format("Location updated, lat: {0}, long: {1}", location.Latitude, location.Longitude); 
    } 
    public void OnProviderDisabled(string provider){} 
    public void OnProviderEnabled(string provider){} 
    public void OnStatusChanged(string provider, Android.Locations.Availability availability, Bundle extras){} 

} 

Kudos to https://stackoverflow.com/users/170333/greg-shackles за то, что вы зашли так далеко.

+0

Что произойдет, если вы удалите код поставщика тестов? Это может переопределить данные о местоположении, которые вы предоставляете. –

+0

Удаление тестового провайдера означает, что GetLastKnownLocation всегда возвращает null – cymorg

ответ

1

Наконец-то разрешилось это. Когда эмулятор запускается VS2010 (т. Е. F5, начнет отладку), он не будет вести себя так, как ожидалось. Запустите эмулятор внешне с помощью AVD.exe, запустите виртуальное устройство и разверните приложение. к нему (используя F5, начать отладку), и все работает нормально.

Почему запуск эмулятора изнутри или снаружи VS2010 должен иметь какое-либо значение, это тайна, с которой я могу жить. Спасибо всем за полезные советы.

+0

На самом деле, DDMS по-прежнему не отправляет GPS-координаты, но telnet делает. – cymorg

2

Я думаю, проблема может быть в том, как вы звоните RequestLocationUpdates(). Этот третий параметр - это минимальное расстояние, которое необходимо перенести устройство перед получением обновлений, поэтому вы сообщаете системе отправлять обновления только после того, как устройство переместило 2 метра. Если он работает на реальном устройстве, это, вероятно, потому, что вы переместились более чем на 6 футов. :)

Попробуйте начать с RequestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this). Это запустит поток обновлений на реальном устройстве, но только один, когда вы нажимаете «Отправить» в DDMS. Как только это сработает, я вернусь оттуда, как часто вы получаете обновления.

Также, при запуске эмулятора всегда GetLastKnownLocation(). Это лучше для устройств, поскольку оно может отправить вам сетевое местоположение в качестве начальной оценки или местоположение GPS, если другая программа использовала его в последнее время.

EDIT

Она также может быть проблема с разрешениями. Обычно вам нужно изменить AndroidManifest.xml, чтобы получить доступ к GPS. Линия

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

См. Документы here.

+0

К сожалению, приложение не работает на реальном устройстве - у меня есть эмулятор, чтобы его попробовать. Изменение RequestLocationUpdates в соответствии с рекомендациями не имеет значения, местоположение все еще не обновляется. GetLastKnownLocation, являющийся нулевым для начала эмулятора, имеет смысл. Еще одна вещь, которую следует отметить, заключается в том, что эта разработка полностью выполнена на Windows, LocationManager.GPS_PROVIDER не является допустимым вариантом, используя Mono для Android через VS2010. Есть очень мало образцов Mono для Android с VS2010, кроме того, что есть на Xaramin.com. – cymorg

+0

@cymorg Обновлено с другой возможностью. Кроме того, это не главная проблема, и у меня нет опыта работы с C# или Mono, но я думаю, что постоянный поставщик GPS для вас будет [этот] (http://docs.mono-android.net/? ссылка = F% 3aAndroid.Locations.LocationManager.GpsProvider). –

+0

AndroidManifest.xml имеет правильное разрешение пользователя - до сих пор нет радости. Начиная думать о том, что эмулятор не работает правильно на Windows7. – cymorg

1

Вызов

_locationManager.RequestLocationUpdates("gps", 5000, 2, this); 

функция, прежде чем делать какие-либо операции местоположения, как показано ниже:

base.OnCreate(savedInstanceState); 
SetContentView(Resource.Layout.LocationActivity); 
_geocoder = new Geocoder(this); 
_locationText = FindViewById<TextView>(Resource.Id.TextView1); 
_locationManager = (LocationManager)GetSystemService(LocationService); 
_locationManager.RequestLocationUpdates("gps", 5000, 2, this); //this will cause updated location to be retrieved from telnet 

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

+0

Ничего, nada, nil, null, ничего. Сообщение Telnet отправлено ОК, но приложение не может прочитать его из эмулятора. Я теряю желание разрешить это и начать думать об обходных решениях, которые я презираю, потому что всегда лучше смотреть на свои проблемы. – cymorg

0

Есть ли у вашего эмулируемого изображения Android оборудование GPS? Описание в эмуляторе должно иметь «hw.gps = yes».

У меня были такие же симптомы, прежде чем воссоздать новое изображение с помощью правильного (эмулируемого) оборудования. Я обнаружил, что простая веб-страница, отображающая current location, была удобной при отладке среды эмуляции.