2015-05-22 5 views
0

Я делаю программу в android, где я получаю координаты gps при изменении местоположения. Мне нужно сохранить предыдущую широту и долготу при изменении местоположения. Тогда я смогу рассчитать расстояние позже. Может ли кто-нибудь помочь мне, как сохранить текущие координаты и предыдущие координаты программно. Благодарю. Вот мой код. Игнорируйте кнопки и таймер, я должен сохранить предыдущие координаты при изменении местоположения.Как сохранить предыдущие координаты gps

package com.example.higher.myosmand; 

import android.app.Activity; 
import android.content.Context; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.preference.PreferenceManager; 
import android.support.v7.app.ActionBarActivity; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.Toast; 

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.Timer; 
import java.util.TimerTask; 


public class MainActivity extends Activity { 

private LocationManager locationManager; 
private LocationListener locationListener; 
private Location currentLocation; 
private TextView latlon; 
private TextView distance; 
ArrayList<String> list = new ArrayList<>(); 
ListView listView; 
private TextView listText; 
private float results[] = new float[2]; 
double lat; 
double lon; 
double currentLat; 
double currentLon; 
double accuracy; 
double speed; 
double altitude; 
double time; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    latlon = (TextView) findViewById(R.id.latlon); 
    distance = (TextView) findViewById(R.id.distanceText); 
    listView = (ListView)findViewById(R.id.listView); 
    listText = (TextView)findViewById(R.id.listText); 

    locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); 

    locationListener = new LocationListener() { 

     @Override 
     public void onLocationChanged(Location loc) { 
      //locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener); 
      lat = loc.getLatitude(); 
      lon = loc.getLongitude(); 
      accuracy = loc.getAccuracy(); 
      speed = loc.getSpeed(); 
      altitude = loc.getAltitude(); 
      time = loc.getTime(); 
      /*currentLocation = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
      currentLat = currentLocation.getLatitude(); 
      currentLon = currentLocation.getLongitude();*/ 
      listView.setAdapter(new ArrayAdapter<String>(MainActivity.this, R.layout.activity_simplelist, R.id.listText, list)); 

      list.add("latitude: " + lat + " longitude: " + lon); 
      //list.add("speed: " + speed + " accuracy: " + accuracy); 
      distance.setText("size: " + list.size()); 
     } 

     @Override 
     public void onProviderDisabled(String arg0) { 
      //TODO auto generated method stub 
     } 

     @Override 
     public void onProviderEnabled(String arg0) { 
      //TODO auto generated method stub 
     } 

     @Override 
     public void onStatusChanged(String arg0, int arg1, Bundle arg2) { 
      //TODO auto generated method stub 
     } 
    }; 
} 

public void setMyTimer(){ 

    Timer myTimer = new Timer(); 
    TimerTask myTask = new TimerTask() { 
     @Override 
     public void run() { 
      runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        listView.setAdapter(new ArrayAdapter<String>(MainActivity.this, R.layout.activity_simplelist, R.id.listText, list)); 
        list.add("latitude: " + lat + " longitude: " + lon); 

        //distance.setText("Current Location:\n Latitude: " + currentLat +" Longitude: " + currentLon); 
       } 
      }); 
     } 
    }; 
    myTimer.schedule(myTask, 5000, 5000); 
} 

public void startButton(View view) { 
    //locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener); 
    latlon.setText("latitude: " + lat + " \nlongitude: " + lon + " \naccuracy: " + accuracy + 
      "\nspeed: " + speed + "\naltitude: " + altitude + "\ntime: " + time); 
} 

public void endButton(View view) { 
    //locationManager.removeUpdates(locationListener); 

    //locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener); 

} 

public void resetButton(View view) { 
    list.clear(); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    //locationManager.removeUpdates(locationListener); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 

}

+1

Просьба предоставить дополнительную информацию о ваших целях. Ответ на этот вопрос потребует некоторого знания вашей программы, ее структуры и контекста ее выполнения. – OYRM

+0

Что мне нужно сделать, так это получить координаты всякий раз, когда меняется местоположение, и когда устройство будет внутри автомобиля, я должен рассчитать расстояние между этими точками в реальном времени. – AIK

ответ

0

Используйте этот код внутри onLocationChanged метода. Он хранит ваши предыдущие координаты местоположения в переменную предыдущая:

private LatLng prev; 
private int flag=0; 

@Override 
     public void onLocationChanged(Location location) { 
       LatLng current = new LatLng(location.getLatitude(), location.getLongitude()); 
      if(flag==0) 
      { 
       prev=current; 
       flag=1; 
      } 
    //Do whatever you want here 
      prev=current; 
      current = null; 
} 
+0

Могу ли я показать широту и долготу отдельно, потому что вы сделали объект, и я поместил свою широту и долготу отдельно, чтобы потом вычислить расстояние. я поставил мой код, пожалуйста, – AIK

+0

Я нашел ваш код проще и получил намек на это. Это сработало. – AIK

+0

О, спасибо, в любое время! Счастливое кодирование! – charoup

1

Использование SharedPreferences для простого хранения ключ-значение.

// saving 
PreferenceManager.getDefaultSharedPreferences(context).edit() 
    .putLong("current_latitude", latitude) 
    .putLong("current_latitude", longitude) 
    .commit(); 

// loading 
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); 
long latitude = prefs.getLong("current_latitude", 0); 
long longitude = prefs.getLong("current_longitude", 0); 
+0

Спасибо за подсказку. я буду читать об общих предпочтениях и применять его в своем коде, и будет ли это работать внутри метода onLocationChanged? – AIK

1

В попытке упростить ответ embloo, вы можете просто сохранить текущее местоположение предыдущей переменной местоположении перед обновлением до текущего местоположения в onLocationChanged методы. Например:

@Override 
public void onLocationChanged(Location location) { 
    mPreviousLocation = mCurrentLocation; 
    mCurrentLocation = location; 

    // update values or UI below here 
} 
Смежные вопросы