Google Maps API如何在旋转屏幕期间保存数据?

时间:2019-02-26 14:43:55

标签: java android google-maps

我正在开发应用程序,并且我有MapActivity,这里有地图。我想在旋转屏幕期间保存数据(最后一个坐标,缩放),然后尝试使用这种方式

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));
}

但是此代码不起作用。我遇到下一个错误

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) 

您能帮我解决我的问题吗?

2 个答案:

答案 0 :(得分:0)

在初始化mGoogleMap变量后,将还原代码移至onCreate并删除onRestoreInstanceState方法。

问题在于调用onRestoreInstanceState时,您的mGoogleMap变量为null。

答案 1 :(得分:0)

一种解决我的问题的新方法,为什么它不起作用?:

 // 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));
    }
}