Предыстория проблемы:
Я несколько новичок в разработке Android. Все, что я пытаюсь сделать на данный момент, это получить GPS-координаты с GPS-устройства телефона и отобразить их на Google Maps или просто в TextView
или где-то еще. Основная задача – их получить.
Я прочитал несколько руководств. Я использую
- Android 2.3.3
- уровень API 10
- Eclipse 3.6.1
- Windows 7
Описание проблемы :
Я написал класс GeoUpdateHandler
, который реализует LocationListener
и реализует его методы onLocationChange()
и т. д. А в MyMapsActivity
я использую обычный requestLocationUpdates
из LocationManager
для получения периодических обновлений.
Когда я запускаю приложение, я отправляю GPS-координаты из элемента управления эмулятором Eclipse (Окно --> Показать представление --> Другое --> Android --> Управление эмулятором) для отправки долготы и широты. Как только эмулируемое устройство получает координаты, приложение зависает. Ничего не происходит, и курсор меняется на синий кружок (что означает раздумья/зависание), и ничего не происходит. Если я использую locationManager.getLastKnownLocation(String provider)
, он становится нулевым. Очевидно, потому что нет последнего известного местоположения. Он застревает, прежде чем узнать один!
Я также пытался отправить координаты через telnet. (cmd --> telnet localhost 5554 --> geo fix . Но происходит то же самое.
Я попытался запустить устройство независимо от приложения, отправить координаты, а затем запустить приложение. Но то же самое происходит, когда я запускаю приложение: оно зависает.
Следующий код HelloItemizedOverlay
взят из учебника Android MapView и отлично работает с заданными вручную координатами. Проблема возникает при попытке получить местоположение GPS.
public class MyMapsActivity extends MapActivity
{
private MapController mapController;
private MapView mapView;
private LocationManager locationManager;
LinearLayout linLayout;
MapView mView;
List<Overlay> mapOverlays;
Drawable drawable;
HelloItemizedOverlay itemizedOverlay;
GeoUpdateHandler handler;
Location location;
public void onCreate(Bundle bundle)
{
super.onCreate(bundle);
setContentView(R.layout.main); // bind the layout to the activity
mView = (MapView) findViewById(R.id.mapview);
mView.setBuiltInZoomControls(true);
mapOverlays = mView.getOverlays();
drawable = this.getResources().getDrawable(R.drawable.icon);
itemizedOverlay = new HelloItemizedOverlay(drawable);
mapController = mView.getController();
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
handler = new GeoUpdateHandler();
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 3000, 0, handler);
location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
GeoPoint point = new GeoPoint((int)location.getLongitude(),(int)location.getLatitude());
OverlayItem overlayitem = new OverlayItem(point, "", "");
mView.setBuiltInZoomControls(true);
itemizedOverlay.addOverlay(overlayitem);
mapOverlays.add(itemizedOverlay);
mapController.setZoom(8);
mapController.animateTo(point);
}
@Override
protected boolean isRouteDisplayed()
{
return false;
}
public class GeoUpdateHandler implements LocationListener
{
@Override
public void onLocationChanged(Location location)
{
int lat = (int) (location.getLatitude());
int lng = (int) (location.getLongitude());
GeoPoint point = new GeoPoint(lat, lng);
mapController.animateTo(point); // mapController.setCenter(point);
}
@Override
public void onProviderDisabled(String provider)
{
}
@Override
public void onProviderEnabled(String provider)
{
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras)
{
}
}
@Override
protected void onResume()
{
handler = new GeoUpdateHandler();
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 0, handler);
super.onResume();
}
}