Android GPS无法正常工作

时间:2012-05-16 20:31:32

标签: android gps nullpointerexception

每次运行代码时都会出现NullPointerException。我在代码中启用了Internet和GPS权限(ACCESS_FINE_LOCATION,ACCESS_MOCK_LOCATION和& ACCESS_COARSE_LOCATION)。我尝试过模拟器和手机,都失败了。这不是GPS或互联网不可用的问题,AFAIK。

我的代码段: -

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

    mapView = (MapView) findViewById(R.id.mapView);
    LinearLayout zoomLayout = (LinearLayout)findViewById(R.id.zoom);  
    View zoomView = mapView.getZoomControls(); 

    zoomLayout.addView(zoomView, 
        new LinearLayout.LayoutParams(
            LayoutParams.WRAP_CONTENT, 
            LayoutParams.WRAP_CONTENT)); 
    mapView.displayZoomControls(true);
    mapView.setStreetView(false);
    mapView.setSatellite(false);

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

    locationManager.requestLocationUpdates(
            LocationManager.GPS_PROVIDER, 
            MINIMUM_TIME_BETWEEN_UPDATES, 
            MINIMUM_DISTANCE_CHANGE_FOR_UPDATES,
            new MyLocationListener()
    );

    mc = mapView.getController();
    //        String coordinates[] = {"51.708945", "8.745928"};  //THIS WORKS IF ENABLED
    //        double lat = Double.parseDouble(coordinates[0]);
    //        double lng = Double.parseDouble(coordinates[1]);


    Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
    double lat = location.getLatitude(); //NULLPOINTER EXCEPTION THROWN HERE
    double lng = location.getLongitude();

    p = new GeoPoint(
        (int) (lat * 1E6), 
        (int) (lng * 1E6)); 

    mc.animateTo(p);
    mc.setZoom(17); 
    //---Add a location marker---
    MapOverlay mapOverlay = new MapOverlay();
    List<Overlay> listOfOverlays = mapView.getOverlays();
    listOfOverlays.clear();
    listOfOverlays.add(mapOverlay);     

    mapView.invalidate();
    } catch (Exception e) {}
}

当我试图获得纬度或经度时,它会抛出NullPointer异常。我该如何避免呢? locationManager对象在创建时不会抛出任何异常(使用getSystemService方法),也不会在请求位置更新时发出任何异常。我可以在使用它之前检查对象是否为null,但我不明白为什么它在那时为空...是否值得睡一觉?这是正确的编程方式吗?当我试图获得经度/纬度时,我不明白为什么它不起作用。我做错了吗?

解决的问题hereherehere无法解决我的问题。 谢谢。

1 个答案:

答案 0 :(得分:1)

我想说,最常见的问题是LocationManager没有最后一个已知位置,所以它返回null。在这种情况下,您需要等待位置更新才能获得该位置。

- =更新= - 就这样做:

public void onLocationChanged(Location location) {
    double lat = location.getLatitude();
    double lng = location.getLongitude();

    p = new GeoPoint(
        (int) (lat * 1E6), 
        (int) (lng * 1E6)); 

    mc.animateTo(p);
    mc.setZoom(17);
}

由于这是一个内部类,因此它可以访问所有活动成员。