2016-10-05 3 views
0

現在の場所にマーカーを作成し、以前のマーカーを表示したいAndroid Appを作成しています。現在の場所にマーカーを作成することができます。また、マーカーを表示するには、アプリを一時停止してからもう一度やり直してください。しかし、一度私はアプリを破壊し、再びそれを開始すると、すべてのマーカーが緩んでいます。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)); 
} 

} 

答えて

0

あなたはlatlngsを失うことがないかもしれないが、uはonResumeを(使用方法の詳細スマートにする必要があります):ここで私が試したものです。 新しく読み込まれたときに、MapがOnResume()メソッドで使用できる状態になっていない可能性があり、ifブロックに入力されていない可能性があります。

+0

私はonRestoreInstanceを次のように更新しました。 –

+0

isMapReadyブール値フラグをtrueに更新して、onRestoreInstanceを更新しました。しかし、まだ運がありません。 –

+0

onResumeで書かれたものすべてをメソッドに取り出せますか?また、onResumeとonMapReadyから呼び出します。 –

関連する問題