So, I have been working on getting this up and running for some time now. Problem is I have my map key from Google placed correctly in main.xml, but I can't seem to get a provider information as the map does not display at all. I have run it a couple of times and the fail us at the same place. I tried to debug and noticed that there is a provider string returned, however, after that a null.
The code fails at
@Override
protected void onResume() {
super.onResume();
locationManager
.requestLocationUpdates(getBestProvider(), 1000, 1, this);
}
with the following error message.
08-20 05:14:43.573: E/AndroidRuntime(239): Uncaught handler: thread main exiting due to uncaught exception
08-20 05:14:43.583: E/AndroidRuntime(239): java.lang.RuntimeException: Unable to resume activity {com.shawnbe.mallfinder/com.shawnbe.mallfinder.MallFinderActivity}: java.lang.NullPointerException
08-20 05:14:43.583: E/AndroidRuntime(239): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2950)
08-20 05:14:43.583: E/AndroidRuntime(239): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2965)
08-20 05:14:43.583: E/AndroidRuntime(239): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2516)
08-20 05:14:43.583: E/AndroidRuntime(239): at android.app.ActivityThread.access$2200(ActivityThread.java:119)
08-20 05:14:43.583: E/AndroidRuntime(239): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
08-20 05:14:43.583: E/AndroidRuntime(239): at android.os.Handler.dispatchMessage(Handler.java:99)
08-20 05:14:43.583: E/AndroidRuntime(239): at android.os.Looper.loop(Looper.java:123)
08-20 05:14:43.583: E/AndroidRuntime(239): at android.app.ActivityThread.main(ActivityThread.java:4363)
08-20 05:14:43.583: E/AndroidRuntime(239): at java.lang.reflect.Method.invokeNative(Native Method)
08-20 05:14:43.583: E/AndroidRuntime(239): at java.lang.reflect.Method.invoke(Method.java:521)
08-20 05:14:43.583: E/AndroidRuntime(239): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
08-20 05:14:43.583: E/AndroidRuntime(239): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
08-20 05:14:43.583: E/AndroidRuntime(239): at dalvik.system.NativeStart.main(Native Method)
08-20 05:14:43.583: E/AndroidRuntime(239): Caused by: java.lang.NullPointerException
08-20 05:14:43.583: E/AndroidRuntime(239): at com.shawnbe.mallfinder.MallFinderActivity.onResume(MallFinderActivity.java:61)
08-20 05:14:43.583: E/AndroidRuntime(239): at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1149)
08-20 05:14:43.583: E/AndroidRuntime(239): at android.app.Activity.performResume(Activity.java:3763)
08-20 05:14:43.583: E/AndroidRuntime(239): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2937)
08-20 05:14:43.583: E/AndroidRuntime(239): ... 12 more
Occasionally, the code seems launches the grid but no map. While on other runs, it simply fails out.
Below is my activity code.
package com.shawnbe.mallfinder;
import java.util.List;
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;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.location.Criteria;
import android.location.Location;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;
public class MallFinderActivity extends MapActivity implements
android.location.LocationListener {
/** Called when the activity is first created. */
private MapController mapController;
private MapView mapView;
private android.location.LocationManager locationManager;
private GeoPoint currentPoint;
private Location currentLocation = null;
private TextView latituteField;
private TextView longitudeField;
private String bestProvider;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
MapView mapView = (MapView) findViewById(R.id.mapView);
mapView.setBuiltInZoomControls(true);
Location location;
//getBestProvider();
if(bestProvider !=null)
location = locationManager.getLastKnownLocation(bestProvider);
List<Overlay> mapOverlays = mapView.getOverlays();
Drawable drawable = this.getResources().getDrawable(
R.drawable.androidmarker);
MapItemizedOverlay itemizedoverlay = new MapItemizedOverlay(drawable,
this);
LocalGeoPoints loc = new LocalGeoPoints();
for (OverlayItem a : loc.overlayitems) {
itemizedoverlay.addOverlay(a);
}
mapOverlays.add(itemizedoverlay);
}
@Override
protected void onResume() {
super.onResume();
locationManager
.requestLocationUpdates(getBestProvider(), 1000, 1, this);
}
public void getLastLocation() {
String provider = getBestProvider();
currentLocation = locationManager.getLastKnownLocation(provider);
if (currentLocation != null) {
setCurrentLocation(currentLocation);
} else {
Toast.makeText(this, "Location not yet acquired", Toast.LENGTH_LONG)
.show();
}
}
public void animateToCurrentLocation() {
if (currentPoint != null) {
mapController.animateTo(currentPoint);
}
}
public String getBestProvider() {
locationManager = (android.location.LocationManager) getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
criteria.setPowerRequirement(Criteria.NO_REQUIREMENT);
criteria.setAccuracy(Criteria.NO_REQUIREMENT);
bestProvider = locationManager.getBestProvider(criteria, false);
return bestProvider;
}
public void setCurrentLocation(Location location) {
int currLatitude = (int) (location.getLatitude() * 1E6);
int currLongitude = (int) (location.getLongitude() * 1E6);
currentPoint = new GeoPoint(currLatitude, currLongitude);
currentLocation = new Location("");
currentLocation.setLatitude(currentPoint.getLatitudeE6() / 1e6);
currentLocation.setLongitude(currentPoint.getLongitudeE6() / 1e6);
}
@Override
protected boolean isRouteDisplayed() {
return false;
}
/* Remove the locationlistener updates when Activity is paused */
@Override
protected void onPause() {
super.onPause();
locationManager.removeUpdates(this);
}
@Override
public void onLocationChanged(Location location) {
int lat = (int) (location.getLatitude());
int lng = (int) (location.getLongitude());
latituteField.setText(String.valueOf(lat));
longitudeField.setText(String.valueOf(lng));
}
@Override
public void onProviderEnabled(String provider) {
Toast.makeText(this, "Enabled new provider " + provider,
Toast.LENGTH_SHORT).show();
}
@Override
public void onProviderDisabled(String provider) {
Toast.makeText(this, "Disabled provider " + provider,
Toast.LENGTH_SHORT).show();
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
}
And below is my main.xml ccomplete with the key I obtained from the google map registeration site.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<FrameLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<com.google.android.maps.MapView
android:id="@+id/mapView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true"
android:apiKey="0steid872FeGgae0eO2Dhdyei37sFPHG65t7N6XA"/>
</FrameLayout>
</LinearLayout>
https://developers.google.com/maps/documentation/android/mapkey - official information, what to do.
Step by step.
1) Create keystore
2) Generating hash MD5 from your keystore
3) Sign in here : https://developers.google.com/android/maps-api-signup
4) Add key to your application
Good luck!
In onCreate
you should init locationManager
field. Move
locationManager = (android.location.LocationManager) getSystemService(Context.LOCATION_SERVICE);
string from getBestProvider()
method to your onCreate()
Look at your stacktrace. You have only one place where NPE can potentially occurred
. . .
08-20 05:14:43.583: E/AndroidRuntime(239): Caused by: java.lang.NullPointerException
08-20 05:14:43.583: E/AndroidRuntime(239): at com.shawnbe.mallfinder.MallFinderActivity.onResume(MallFinderActivity.java:61)
08-20 05:14:43.583: E/AndroidRuntime(239): at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1149)
The reason you are getting a NullPointer is that you never set locationManager
before you use it in onResume()
.
onCreate()
is going to get called where you have getBestProvider()
commented out. Then onResume()
gets called and that uses locationManager. Although you have yet another even more complicated situation here. I'll see if I can walk through procedurally what code will execute in onResume()...
If I were you I'd simplify things, only set the locationManager in onCreate()
(as a general programming practice you want to limit the number of side effects in methods, what I mean is in getBestProvider()
, you should just return the best provider, and try not to do anything else to your state, or you get crazy unexpected things outside that method). If you're still getting some madness, I would just put that first line of getBestProvider()
in onResume()
protected void onResume()
{
super.onResume();
locationManager = (android.location.LocationManager) getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(getBestProvider(), 1000, 1, this);
}
You probably don't want to leave it that way, but it will ensure that your problem is that locationManager is null in onResume()
Good luck.
if you have valid map key then check whether you are getting an instance of locationManager into onResume i guess you have to instantiate location manager in onResume() .
locationManager = (android.location.LocationManager)getSystemService(Context.LOCATION_SERVICE);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With