我正在创建一个Android地图应用程序,我想在当前位置创建标记并显示以前的这些标记。我可以在当前位置创建标记,但是当我在其他位置恢复应用时,我的应用只显示当前位置标记,而不是之前的位置标记。请帮忙。这里是我的尝试:在Android地图上保存标记App
public class Main extends FragmentActivity implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener {
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);
}
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));
}
}
}
看起来你是非常接近得到这。 – danny117
检查这个答案http://stackoverflow.com/questions/33430559/how-to-make-a-search-on-google-maps-for-finding-hospitals-etc/33431118#33431118 – AndroidHacker
通过你的代码看起来它看起来就像你正在做所有正确的事情来保存和加载标记。有趣的一件事是如果(isMapReady == true) 每当onResume发生时,现在这种情况是不是真的?这可能是因为onResume发生时,地图尚未准备好。你能证实这一点吗? – CrashOverride