0

I'm developing the app and I have MapActivity where I have a map. I wanted to save data(the last coordinates, zoom) during rotation screen and I tried to do it using this way

private GoogleMap mGoogleMap;

 @Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // saving the last zoom, coordinates
    double lat = mGoogleMap.getCameraPosition().target.latitude;
    double lon = mGoogleMap.getCameraPosition().target.longitude;
    float zoom = mGoogleMap.getCameraPosition().zoom;

    savedInstanceState.putDouble("map_lat", lat);
    savedInstanceState.putDouble("map_lon", lon);
    savedInstanceState.putFloat("map_zoom", zoom);

    super.onSaveInstanceState(savedInstanceState);
}

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

    // get the last zoom, coordinates
    double lat = savedInstanceState.getDouble("map_lat");
    double lon = savedInstanceState.getDouble("map_lon");
    LatLng latLng = new LatLng(lat, lon);
    float zoom = savedInstanceState.getFloat("map_zoom", 15);

    mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, zoom));
}

But this code doesn't work. I get the next error

2019-02-26 17:41:15.529 20867-20867/? E/Zygote: isWhitelistProcess - Process is Whitelisted 2019-02-26 17:41:15.529 20867-20867/? E/libpersona: scanKnoxPersonas 2019-02-26 17:41:15.529 20867-20867/? E/libpersona: Couldn't open the File - /data/system/users/0/personalist.xml - No such file or directory 2019-02-26 17:41:21.286 20867-20867/com.example.mapsapp E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.mapsapp, PID: 20867 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.mapsapp/com.example.mapsapp.activities.MapActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.android.gms.maps.GoogleMap.moveCamera(com.google.android.gms.maps.CameraUpdate)' on a null object reference at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2957) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032) at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4921) at android.app.ActivityThread.-wrap19(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1702) at android.os.Handler.dispatchMessage(Handler.java:105) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6942) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.android.gms.maps.GoogleMap.moveCamera(com.google.android.gms.maps.CameraUpdate)' on a null object reference at com.example.mapsapp.activities.MapActivity.onRestoreInstanceState(MapActivity.java:99) at android.app.Activity.performRestoreInstanceState(Activity.java:1108) at android.app.Instrumentation.callActivityOnRestoreInstanceState(Instrumentation.java:1267) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2930) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)  at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4921)  at android.app.ActivityThread.-wrap19(Unknown Source:0)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1702)  at android.os.Handler.dispatchMessage(Handler.java:105)  at android.os.Looper.loop(Looper.java:164)  at android.app.ActivityThread.main(ActivityThread.java:6942)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374) 

Can you help me to solve my problem?

2 Answers2

0

Move the restoring code to onCreate, after the mGoogleMap variable is initialized and remove the onRestoreInstanceState method.

The problem is that your mGoogleMap variable is null when onRestoreInstanceState is called.

Derek K
  • 2,756
  • 1
  • 21
  • 37
  • but my mGoogleMap is initialized in onMapReady() where I can't get savedInstanceState – Danil Ochagov Feb 26 '19 at 15:52
  • So simply declare lat, lot and zoom variables outside as a class members, and then use them inside onMapReady() after map is initialized. – Derek K Feb 26 '19 at 16:19
  • I did it but it doesn't work again. What's wrong with this? – Danil Ochagov Feb 26 '19 at 16:38
  • I've been testing my new code and it works all but my camera don't move to the last place where i was. Why? I tried to add a marker in resetDataOnMap() method and it was set in the last place. Therefore, why don't the camera move to that place? – Danil Ochagov Feb 26 '19 at 16:57
  • Try mGoogleMap.animateCamera. Read also this https://stackoverflow.com/a/34117053/1860868 – Derek K Feb 26 '19 at 17:42
  • If my answer was helpful don't forget to accept it :-) Thanks. – Derek K Feb 26 '19 at 19:19
0

A new way to fix my problem, why doesn't it work?:

 // the last data before rotation the screen
private float mLastZoom = 0;
private LatLng mLastLatLng = null;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_map);

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

    // restore data after rotation
    if (savedInstanceState != null) {
        double lat = savedInstanceState.getDouble("map_lat");
        double lon = savedInstanceState.getDouble("map_lon");
        mLastLatLng = new LatLng(lat, lon);
        mLastZoom = savedInstanceState.getFloat("map_zoom");
    }
}

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // saving the last zoom, coordinates
    double lat = mGoogleMap.getCameraPosition().target.latitude;
    double lon = mGoogleMap.getCameraPosition().target.longitude;
    float zoom = mGoogleMap.getCameraPosition().zoom;

    savedInstanceState.putDouble("map_lat", lat);
    savedInstanceState.putDouble("map_lon", lon);
    savedInstanceState.putFloat("map_zoom", zoom);

    super.onSaveInstanceState(savedInstanceState);
}

@Override
public void onMapReady(GoogleMap googleMap) {
    mGoogleMap = googleMap;
    resetDataOnMap();
}

 private void resetDataOnMap() {
    if (mLastLatLng != null && mLastZoom != 0) {
        mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(mLastLatLng, mLastZoom));
    }
}