Search code examples
androidapimapsopenstreetmaposmdroid

Null Pointer Exception while getting current location using osmdroid


I'm using osmdroid API to get current location and display a overlay at that point, but I get the following error.

Error is caused by String provider = mLocMgr.getBestProvider(criteria, true); but I don't know what's wrong.

My Activity having error

public class LSLocationSender extends Activity implements LocationListener, MapViewConstants {

protected MapView mMapView;
protected IMapController mapController;
protected LocationManager mLocMgr;
protected ItemizedOverlay<OverlayItem> mMyLocationOverlay;
protected ResourceProxy mResourceProxy;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    mResourceProxy = new DefaultResourceProxyImpl(getApplicationContext());
    setContentView(R.layout.ls_location_sender);

    mMapView = (MapView) this.findViewById(R.id.mapview);
    mMapView.setTileSource(TileSourceFactory.MAPNIK);
    mMapView.setBuiltInZoomControls(true);
    mMapView.setMultiTouchControls(true);
    mapController = this.mMapView.getController();
    mapController.setZoom(15);

    Criteria criteria = new Criteria();
    criteria.setAccuracy(Criteria.ACCURACY_FINE);
    criteria.setAltitudeRequired(false);
    criteria.setBearingRequired(false);
    criteria.setCostAllowed(true);
    criteria.setPowerRequirement(Criteria.POWER_MEDIUM);

    String provider = mLocMgr.getBestProvider(criteria, true);
    Location location = mLocMgr.getLastKnownLocation(provider);
    GeoPoint mypoint = new GeoPoint(location.getLatitude(), location.getLongitude());
    GeoPoint mypointicon = new GeoPoint(location.getLatitude()+1000, location.getLongitude()+1000);
    mapController.setCenter(mypoint);
    mLocMgr = (LocationManager) getSystemService(LOCATION_SERVICE);
    mLocMgr.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 100, this);

    ArrayList<OverlayItem> items=new ArrayList<OverlayItem>();
    items.add(new OverlayItem("Here", "Sample Description", mypointicon));
    this.mMyLocationOverlay = new ItemizedIconOverlay<OverlayItem>(items,
            new ItemizedIconOverlay.OnItemGestureListener<OverlayItem>() {
                @Override
                public boolean onItemSingleTapUp(final int index,
                                                 final OverlayItem item) {
                    Toast.makeText(
                            LSLocationSender.this,
                            "Item '" + item, Toast.LENGTH_LONG).show();
                    return true; // We 'handled' this event.
                }
                @Override
                public boolean onItemLongPress(final int index,
                                               final OverlayItem item) {
                    Toast.makeText(
                            LSLocationSender.this,
                            "Item '" + item ,Toast.LENGTH_LONG).show();
                    return false;
                }
            }, mResourceProxy);
    this.mMapView.getOverlays().add(this.mMyLocationOverlay);
    mMapView.invalidate();
}

@Override
public void onLocationChanged(Location location) {
    GeoPoint currLoc = new GeoPoint(location);
    mapController.setCenter(currLoc);
    mMapView.invalidate();
}

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

My Logcat

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.saathi/com.android.saathi.LSLocationSender}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.location.LocationManager.getBestProvider(android.location.Criteria, boolean)' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2314)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2388)
        at android.app.ActivityThread.access$800(ActivityThread.java:148)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1292)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.location.LocationManager.getBestProvider(android.location.Criteria, boolean)' on a null object reference
        at com.android.saathi.LSLocationSender.onCreate(LSLocationSender.java:53)
        at android.app.Activity.performCreate(Activity.java:5953)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1128)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2267)

Solution

  • You never initialise mLocMgr you should call before using it.

    mLocMgr = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
    

    On your code before:

    String provider = mLocMgr.getBestProvider(criteria, true);
    

    Additionally remember about permissions in AndroidManifest if not add them yet:

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