0
votes

Here Map crash On Start; My App Objective is to zoom to Current location On Start Of the app. my Tried code give below

public class MainActivity extends FragmentActivity implements OnMapReadyCallback {

GoogleMap googleMap;

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

    SupportMapFragment supportMapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.frg_map);
    googleMap = supportMapFragment.getMap();
    googleMap.setMyLocationEnabled(true);

    supportMapFragment.getMapAsync(this);
}

public void onMapReady(GoogleMap googleMap) {
    googleMap.setMyLocationEnabled(true);

    Criteria criteria = new Criteria();
    LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
    String mMapProvider = locationManager.getBestProvider(criteria, true);

    if (checkSelfPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && checkSelfPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        return;
    }
    Location location = locationManager.getLastKnownLocation(mMapProvider);
    if (location != null){
        onLcatonChanged(location);
    }
    locationManager.requestLocationUpdates(mMapProvider, 20000, 0, (LocationListener) this);

}

private void onLcatonChanged(Location location) {

    double latitude = location.getLatitude();
    double longitude = location.getLongitude();
    LatLng latLng = new LatLng(latitude, longitude);
    googleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
    googleMap.animateCamera(CameraUpdateFactory.zoomTo(15));
}}

My Error given below

Process: com.example.rahul.maptask, PID: 21986 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.rahul.maptask/com.example.rahul.maptask.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.android.gms.maps.GoogleMap com.google.android.gms.maps.SupportMapFragment.getMap()' on a null object reference at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2339) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2413) at android.app.ActivityThread.access$800(ActivityThread.java:155) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1317) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5343) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372)

1
try to change AppcompactActi.. to FragmentActivity .... - koutuk

1 Answers

1
votes

the issue is because the map is not ready right after starting the activity. You have to use the getMapAsync method from the apis: in your onCreate:

SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
    .findFragmentById(R.id.map);
mapFragment.getMapAsync(this);

Your activity should be declared like this:

public class MainActivity extends FragmentActivity
    implements OnMapReadyCallback {
...
}

And you have to implement the callback, that uses the map in the same way you were doing in the onCreate:

@Override
public void onMapReady(GoogleMap googleMap) {
    googleMap.setMyLocationEnabled(true);

    Criteria criteria = new Criteria();
    LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
    String mMapProvider = locationManager.getBestProvider(criteria, true);

    if (checkSelfPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && checkSelfPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        return;
    }
    Location location = locationManager.getLastKnownLocation(mMapProvider);
    if (location != null){
         onLcatonChanged(location);
    }
    locationManager.requestLocationUpdates(mMapProvider, 20000, 0, (LocationListener) this);
}