2016-09-16 2 views
0

현재 위치에서 마커를 만들고 이전 마커도 표시하려는 Android Map 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)); 
    } 
} 
} 
+0

정말로이 파일을 가져 오는 것과 비슷합니다. – danny117

+0

답을 확인하십시오 http://stackoverflow.com/questions/33430559/how-to-make-a-search-on-google-maps-for-finding-hospitals-etc/33431118#33431118 – AndroidHacker

+0

코드를 보며 외모를 보입니다. 마치 마커를 저장하고로드하는 데 필요한 모든 일을하고있는 것처럼 말입니다. 흥미로운 점은 if (isMapReady == true) 입니다. 이제는 onResume이 발생할 때마다이 조건이 참이되지 않습니까? onResume이 일어날 때까지는지도가 준비되지 않은 것일 수 있습니다. 이것을 확인할 수 있습니까? – CrashOverride

답변

1

공지 것을 : 더 이전 위치를 사용할 수없는 경우

  • getLastLocation() 방법은 null 값을 반환 할 수 있습니다 : getLastLocation Documentation
  • 마지막으로 알고있는 위치는 반드시을하지 않습니다 현재 위치
  • super.onStart(), super.onPause()super.onStop()onStart(), onPause() 및의 첫 번째 지침이되어야합니다.방법. 당신이 당신의 파일에 listOfPoints에 포함 된 위치를 저장하지만, 당신이 그 목록에 마지막으로 알려진 위치를 추가 결코 onPause() 방법에서 More infos about Activity Lifecycle and methods overriding

. onConnect() 메서드에서 해당 값을 추가하려고합니다.

편집 : 당신이 응용 프로그램을 시작하면, onCreate(), onStart()onResume() 메서드가 호출 (see Activity Lifecycle). 즉,지도가 준비되지 않은 경우 addMarker() 메서드가 호출 될 가능성이 높습니다. 이전에 onMapReady() 메소드가 호출 된 경우에만 마커를 추가 할 수 있습니다.

편집 (업데이트 된 이후 코드) :

  • 사용 openFileOutput("latlngpoints.txt", Context.MODE_APPEND) 대신 Context.MODE_PRIVATE
  • 당신은 또한 당신이 onResume() 방법에서와 똑같이 onMapReady() 또는 onConnected(Bundle connectionHint)에서 파일에서 마커를 읽어야
  • 의 (때문에 앱을 실행하면 아직지도가 준비되지 않고 if 문 이외의 내용은 실행하지 않습니다.

또한 파일에 중복 된 파일이 포함될 가능성이 높습니다.

+0

onConnect() 메서드에 다음 코드를 포함하도록 코드를 수정했습니다. LatLng newLatLng = new LatLng (mLastLocation.getLatitude(), mLastLocation.getLongitude()); listOfPoints.add (newLatLng); 하지만 코드를 실행하려고하면 "loadMarkers 코드에서 가상 메소드 addMarkers를 호출하려는 시도가 있었기 때문에 활동을 재개 할 수 없습니다"라는 오류가 발생합니다. –

+0

할 수있는 방법을 제안 해 주시겠습니까? –

+0

@AkhilAgarwal 당신은'onMapReady' 부울 속성 (디폴트로'false')을 사용하고'onMapReady()'메소드에서 그것을'true'로 설정할 수 있습니다. 그런 다음'onMessReady'가'true' 인 경우에만'onResume()'메소드에서 맵을 업데이트해야합니다. 아직 onMapReady() 콜백을 설정하지 않은 경우 https://developers.google.com/maps/documentation/android-api/map#add_map_code를 확인하십시오. – Sith