我正在创建一个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 :(得分:0)
你可能不会丢失latlngs但是,你需要更聪明地使用onResume()。 在处于新加载状态时,Map可能尚未准备好在OnResume()方法中使用,因此,它不会在if块中输入。