2016-09-16 10 views
0

私は現在の場所にマーカーを作成し、そのようなマーカーを以前に表示したいAndroidマップアプリケーションを作成しています。私は現在の場所でマーカーを作成することができますが、私は別の場所でアプリを再開するとき、私のアプリは、以前のものではなく、現在の位置マーカーを表示しています。助けてください。ここに私が試したものです:Androidマップアプリケーションにマーカーを保存

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()メソッドでそれを追加したいと思うでしょう。

EDIT:あなたがアプリを起動すると、onCreate()onStart()onResume()メソッドが呼び出される(see Activity Lifecycle)。つまり、マップがまだ準備されていない場合は、addMarker()メソッドが呼び出される可能性があります。以前にonMapReady()メソッドが呼び出された場合にのみ、マーカーを追加することができます。

EDIT(あなたは、コードを更新してから):

  • 使用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

関連する問題