Android Map Save Markers摧毁应用程序

时间:2016-10-05 15:51:57

标签: android google-maps google-maps-markers

我正在创建一个Android应用,我想在当前位置创建标记,并显示之前的此类标记。我可以在当前位置创建标记,并且只要我暂停应用程序并再次恢复它,也可以显示这些标记。但是一旦我销毁应用程序并再次启动它,我就会丢失所有这些标记。这是我尝试过的:

private GoogleMap mMap;
private GoogleApiClient mGoogleApiClient;
public Location mLastLocation;
ArrayList<LatLng> listOfPoints = new ArrayList<>();
public boolean isMapReady = false;

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

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

if (mGoogleApiClient == null) {
    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .addApi(LocationServices.API)
            .build();

}
}


public void onMapReady(GoogleMap googleMap) {
   mMap = googleMap;
   isMapReady = true;
}

 public boolean onMarkerClick(final Marker marker) {
  return false;
 }

 public void onConnected(Bundle connectionHint) {
  if (ActivityCompat.checkSelfPermission(this,      android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

    return;
}
if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

    return;
}
mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
        mGoogleApiClient);

MarkerOptions mp = new MarkerOptions();
mp.position(new LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude()));

mp.title("my position");

mMap.addMarker(mp);

mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(
        new LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude()), 16));
LatLng newLatLng = new LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude());
listOfPoints.add(newLatLng);


 }

 public void onConnectionSuspended(int i) {

 }

public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

}

protected void onStart() {
super.onStart();
mGoogleApiClient.connect();
}

protected void onStop() {
super.onStop();
mGoogleApiClient.disconnect();

}

protected void onPause() {
super.onPause();
try {
    // Modes: MODE_PRIVATE, MODE_WORLD_READABLE, MODE_WORLD_WRITABLE
    FileOutputStream output = openFileOutput("latlngpoints.txt",
            Context.MODE_PRIVATE);
    DataOutputStream dout = new DataOutputStream(output);
    dout.writeInt(listOfPoints.size()); // Save line count
    for (LatLng point : listOfPoints) {
        dout.writeUTF(point.latitude + "," + point.longitude);
        Log.v("write", point.latitude + "," + point.longitude);
    }
    dout.flush(); // Flush stream ...
    dout.close(); // ... and close.
} catch (IOException exc) {
    exc.printStackTrace();
}
}

 protected void onResume(){
super.onResume();
if (isMapReady==true){
    try {
        FileInputStream input = openFileInput("latlngpoints.txt");
        DataInputStream din = new DataInputStream(input);
        int sz = din.readInt(); // Read line count
        for (int i = 0; i < sz; i++) {
            String str = din.readUTF();
            Log.v("read", str);
            String[] stringArray = str.split(",");
            double latitude = Double.parseDouble(stringArray[0]);
            double longitude = Double.parseDouble(stringArray[1]);
            listOfPoints.add(new LatLng(latitude, longitude));
        }
        din.close();
        loadMarkers(listOfPoints);
    } catch (IOException exc) {
        exc.printStackTrace();
    }
}
}
 protected void onSaveInstanceState(Bundle outState){
super.onSaveInstanceState(outState);

outState.putParcelableArrayList("places",  listOfPoints);
}
 private void restore(Bundle outState){
if (outState != null) {
    listOfPoints =(ArrayList<LatLng>)outState.getSerializable("places");
}
}
 protected void onRestoreInstanceState(Bundle outState) {
super.onRestoreInstanceState(outState);
restore(outState);
isMapReady = true;
}
private void loadMarkers(List<LatLng> listOfPoints) {
int i=listOfPoints.size();
while(i>0){
    i--;
    double Lat=listOfPoints.get(i).latitude;
    double Lon=listOfPoints.get(i).longitude;
    MarkerOptions mp = new MarkerOptions();

    mp.position(new LatLng(Lat, Lon));

    mp.title("my previous position");

    mMap.addMarker(mp);

    mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(
            new LatLng(Lat, Lon), 16));
}

}

1 个答案:

答案 0 :(得分:0)

你可能不会丢失latlngs但是,你需要更聪明地使用onResume()。 在处于新加载状态时,Map可能尚未准备好在OnResume()方法中使用,因此,它不会在if块中输入。