GeoPoint中的空指针异常

时间:2012-10-18 17:08:11

标签: java android

以下代码有什么问题。它在此行(location.setLatitude(latitude);)上抛出Null Pointer Exception。我试图在应用程序启动后立即创建一个圆圈,这就是我从onCreate方法传递位置对象的原因。

private Location location;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);    

    locationListener = new GPSLocationListener();

    locationManager.requestLocationUpdates(
            LocationManager.GPS_PROVIDER, 
            0, 
            0, 
            locationListener);
    mapView = (MapView) findViewById(R.id.mapView);
    listView = (ListView) findViewById(R.id.mylist);
    mapView.setStreetView(true);
    mapView.setBuiltInZoomControls(true);

    mapController = mapView.getController();
    mapController.setZoom(15);

    GeoPoint initialPoint = new GeoPoint( (int) (36.778261* 1E6), (int) (-119.417932 * 1E6));
    double latitude = initialPoint .getLatitudeE6() / 1E6;
    double longitude = initialPoint .getLongitudeE6() / 1E6;

    location.setLatitude(latitude);
    location.setLongitude(longitude);
    locationListener.onLocationChanged(location);
}

以下是负责LocationUpdate的课程。

private class GPSLocationListener implements LocationListener {

    MapOverlay mapOverlay;

    public GPSLocationListener(MapView mapView) {

    }

    @Override
    public void onLocationChanged(Location location) {
        if (location != null) {
            GeoPoint point = new GeoPoint(
                    (int) (location.getLatitude() * 1E6), 
                    (int) (location.getLongitude() * 1E6));

            mapController.animateTo(point);
            mapController.setZoom(15);

            if (mapOverlay == null) {
                mapOverlay = new MapOverlay(this,android.R.drawable.star_on);
                List<Overlay> listOfOverlays = mapView.getOverlays();
                listOfOverlays.add(mapOverlay);
            }
            mapOverlay.setPointToDraw(point);
            mapView.invalidate();
        }
    }

    @Override
    public void onProviderDisabled(String provider) {
    }

    @Override
    public void onProviderEnabled(String provider) {
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
    }
}

任何建议都会有很大的帮助。

更新: -

进行更改后,我正在

java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0

以下是我进行更改的代码。

GeoPoint initialPoint = new GeoPoint( (int) (36.778261), (int) (-119.417932));
double latitude = initialPoint .getLatitudeE6() / 1E6;
double longitude = initialPoint .getLongitudeE6() / 1E6;

this.location = new Location("TechGeeky Randomly Initialized");
location.setLatitude(latitude);
location.setLongitude(longitude);
locationListener.onLocationChanged(location);

我在这里做错了吗?

3 个答案:

答案 0 :(得分:1)

我认为您要执行此操作不是从LocationManager获取最后一个已知位置,而是从onCreate()中您自己定义的位置(例如随机位置)开始。要实现这一点,只需创建一个新的Location对象,如下所示:

this.location = new Location("TechGeeky Randomly Initialized");

在这些行之前执行此实例化以避免异常:

location.setLatitude(latitude);
location.setLongitude(longitude);
locationListener.onLocationChanged(location);

答案 1 :(得分:0)

使用此代码初始化Location对象: -

如果您想使用移动网络获取位置请将此代码放入onCreate

Location location=null;  
location=locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

如果您想使用GPS获取位置将此代码放入onCreate

location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

答案 2 :(得分:0)

您已实例化位置对象。你在哪里创建对象到位置。请使用以下方法创建对象到位置:

location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

将location对象作为参数传递给方法并检查null条件。