Разработка Android - GPS не работает - Приложение зависает при отправке координат - PullRequest
2 голосов
/ 18 февраля 2011

фон проблемы :

Я немного новичок в разработке Android. Все, что я сейчас пытаюсь сделать, - это получить координаты GPS с устройства GPS телефона и отобразить их на Картах Google или просто в TextView, или как угодно. Основная задача - получить их.

Я прочитал несколько уроков. Я использую
- Android 2.3.3
- Уровень API 10
- Затмение 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();
}
}

1 Ответ

1 голос
/ 18 февраля 2011

Согласно this , конструктор Geopoint принимает (широта * 1e6, долгота * 1e6) в качестве параметров; тогда как вы вводите (долгота, широта) при вызове getLastKnownLocation, и вы забыли масштабный коэффициент в другом вызове (в onLocationChanged). Широта и логистика не масштабируются в Местоположение объектов.

В любом случае, эта ошибка должна приводить только к отображению синей карты ((0,0) в Атлантическом океане), поэтому могут возникнуть другие проблемы.


Редактировать:

1 / при воспроизведении вашего комментария, если вы смешаете долготу и широту, вы можете получить несуществующую точку (широта всегда остается в пределах [-90 °, 90 °], тогда как долгота может изменяться в [-180 °, 180 °) ])

2 / в SDK 2.3 (API уровня 9) есть ошибка, приводящая к сбою эмулятора при отправке фиктивных местоположений. Не знаю, правда ли это для 2.3.3 (уровень 10), но я использовал 2.1u1 (уровень 7) для тестирования.

3 / У меня работает следующий код:

package test.testmap;

import java.util.List;

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;
import android.widget.LinearLayout;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;

public class MyMapsActivity extends MapActivity 
{
    private MapController mapController;
    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

        drawable = this.getResources().getDrawable(R.drawable.icon);
        itemizedOverlay = new HelloItemizedOverlay(drawable);

        mView = (MapView) findViewById(R.id.mapview);
        mView.setBuiltInZoomControls(true);

        mapOverlays = mView.getOverlays();
        mapOverlays.add(itemizedOverlay);

        mapController = mView.getController();
    }

    @Override
    protected boolean isRouteDisplayed() 
    {
        return false;
    }

    public class GeoUpdateHandler implements LocationListener 
    {
        @Override
        public void onLocationChanged(Location location) 
        {
            Log.d(this.getClass().getName(),"onLocationChanged : lat = "+location.getLatitude()+" lon = "+location.getLongitude());
            int lat = (int) Math.round(location.getLatitude()*1.0e6);
            int lng = (int) Math.round(location.getLongitude()*1.0e6);
            GeoPoint point = new GeoPoint(lat, lng);
            itemizedOverlay.addOverlay(new OverlayItem(point, "", ""));
            mapController.animateTo(point);
            mapController.setZoom(8);
        }

        @Override
        public void onProviderDisabled(String provider) 
        {
            Log.d(this.getClass().getName(),"onProviderDisabled");
        }

        @Override
        public void onProviderEnabled(String provider) 
        {
            Log.d(this.getClass().getName(),"onProviderEnabled");
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) 
        {
            Log.d(this.getClass().getName(),"onStatusChanged");
        }
    }

    @Override
    protected void onResume()
    {
        handler = new GeoUpdateHandler();
        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 0, handler);
        super.onResume();
    }
}
...