0

I am trying to implement Maps v2 in actionbar tabs. The map tab is a fragment which is inherited from MapFragment. The app force closes after clicking on the maps tab. It gives null pointer exception inside onStart method where getMap() has been called. Here is the code. Please tell where I am wrong.

    public class MapActivity extends MapFragment implements LocationListener  {
int mNum;
GoogleMap googleMap;  


public static MapActivity newInstance() {
    MapActivity f = new MapActivity();

    // Supply num input as an argument.
    Bundle args = new Bundle();
    //args.putInt("num", num);
    //f.setArguments(args);

    return f;
}

/**
 * When creating, retrieve this instance's number from its arguments.
 */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.maplayout, container, false);

    return v;
}


/**
 * The Fragment's UI is just a simple text view showing its
 * instance number.
 */
public void onStart(){
    super.onStart();

    googleMap=getMap();

    // Enabling MyLocation Layer of Google Map
            googleMap.setMyLocationEnabled(true);               


             getActivity();
            // Getting LocationManager object from System Service LOCATION_SERVICE
            LocationManager locationManager = (LocationManager)getActivity().getSystemService(Context.LOCATION_SERVICE);

            // Creating a criteria object to retrieve provider
            Criteria criteria = new Criteria();

            // Getting the name of the best provider
            String provider = locationManager.getBestProvider(criteria, true);

            // Getting Current Location
            Location location = locationManager.getLastKnownLocation(provider);

            if(location!=null){
                    onLocationChanged(location);
            }

            locationManager.requestLocationUpdates(provider, 20000, 0, this);


         // Setting a click event handler for the map
            googleMap.setOnMapClickListener(new OnMapClickListener() {

                @Override
                public void onMapClick(LatLng latLng) {

                    // Creating a marker
                    MarkerOptions markerOptions = new MarkerOptions();

                    // Setting the position for the marker
                    markerOptions.position(latLng);

                    // Setting the title for the marker.
                    // This will be displayed on taping the marker
                    markerOptions.title(latLng.latitude + " : " + latLng.longitude);

                    // Clears the previously touched position
                    //googleMap.clear();

                    // Animating to the touched position
                    googleMap.animateCamera(CameraUpdateFactory.newLatLng(latLng));

                    // Placing a marker on the touched position
                    googleMap.addMarker(markerOptions);
                }
            });


        }


        @Override
        public void onLocationChanged(Location location) {

            TextView tvLocation = (TextView) getActivity().findViewById(R.id.tv_location);

            // Getting latitude of the current location
            double latitude = location.getLatitude();

            // Getting longitude of the current location
            double longitude = location.getLongitude();     

            // Creating a LatLng object for the current location
            LatLng latLng = new LatLng(latitude, longitude);

            // Showing the current location in Google Map
            googleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));

            // Zoom in the Google Map
            googleMap.animateCamera(CameraUpdateFactory.zoomTo(15));

            // Setting latitude and longitude in the TextView tv_location
            tvLocation.setText("Latitude:" +  latitude  + ", Longitude:"+ longitude );      

        }

        @Override
        public void onProviderDisabled(String provider) {
            // TODO Auto-generated method stub      
        }

        @Override
        public void onProviderEnabled(String provider) {
            // TODO Auto-generated method stub      
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
            // TODO Auto-generated method stub      
        }       

}

Edit: I think that this code should not be written in onStart method because the map is not displayed then. How to know that the map has been loaded, to obtain its object ?

1 Answers1

1

Getting a null map in OnStart means that Google Services API didn't start yet.

It's often due to missing permissions, or invalid Google API key, or Google Play Services not being activated on the host device.

You could get more information by posting you AndroidManifest as well as your maplayout.xml

And before launching your map activity, you should take care of the value of:

GooglePlayServicesUtil.isGooglePlayServicesAvailable(anyActivity)

Which will return an indication about Google Play Services state

Thibault D.
  • 10,041
  • 3
  • 25
  • 56
  • Good call on needing to check if play services is installed, all apps need to handle this because a new phone won't have this installed. – deepwinter Apr 23 '13 at 20:06