Время поездки между двумя точками в Google Map Android API V2

Как отображать время в пути между двумя местоположениями в Google Map Android API V2, в моей программе я использую JSONParse для отображения расстояния вождения, но я не могу отображать время просмотра дисплея. В этой примерной программе я сделал: DirectionActivity.java

public class DirectionActivity extends FragmentActivity implements OnMyLocationChangeListener{ private LatLng start; private LatLng end; private String nama; private final String URL = "http://maps.googleapis.com/maps/api/directions/json?"; private GoogleMap map; private JSONHelper json; private ProgressDialog pDialog; private List<LatLng> listDirections; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_direction); json = new JSONHelper(); setupMapIfNeeded(); Bundle b = getIntent().getExtras(); if (b != null) { start = new LatLng(b.getDouble(MainActivity.KEY_LAT_ASAL), b.getDouble(MainActivity.KEY_LNG_ASAL)); end = new LatLng(b.getDouble(MainActivity.KEY_LAT_TUJUAN), b.getDouble(MainActivity.KEY_LNG_TUJUAN)); nama = b.getString(MainActivity.KEY_NAMA); } new AsyncTaskDirection().execute(); } private void setupMapIfNeeded() { if (map == null) { FragmentManager fragmentManager = getSupportFragmentManager(); SupportMapFragment supportMapFragment = (SupportMapFragment) fragmentManager .findFragmentById(R.id.mapsdirections); map = supportMapFragment.getMap(); if (map != null) { setupMap(); } } } private void setupMap() { map.setMyLocationEnabled(true); map.setOnMyLocationChangeListener(this); moveToMyLocation(); } private void moveToMyLocation() { LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); Criteria criteria = new Criteria(); Location location = locationManager.getLastKnownLocation(locationManager.getBestProvider(criteria, false)); if (location != null) { map.animateCamera(CameraUpdateFactory.newLatLngZoom( new LatLng(location.getLatitude(), location.getLongitude()), 13)); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); int resCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getApplicationContext()); if (resCode != ConnectionResult.SUCCESS) { GooglePlayServicesUtil.getErrorDialog(resCode, this, 1); } } private class AsyncTaskDirection extends AsyncTask<Void, Void, Void> { @Override protected Void doInBackground(Void... params) { String uri = URL + "origin=" + start.latitude + "," + start.longitude + "&destination=" + end.latitude + "," + end.longitude + "&sensor=true&units=metric"; JSONObject jObject = json.getJSONFromURL(uri); listDirections = json.getDirection(jObject); return null; } @Override protected void onPreExecute() { // TODO Auto-generated method stub super.onPreExecute(); pDialog = new ProgressDialog(DirectionActivity.this); pDialog.setMessage("Loading...."); pDialog.setCancelable(true); pDialog.show(); } @Override protected void onPostExecute(Void result) { // TODO Auto-generated method stub super.onPostExecute(result); pDialog.dismiss(); gambarDirection(); } } public void gambarDirection() { PolylineOptions line = new PolylineOptions().width(3).color(Color.BLUE); for (int i = 0; i < listDirections.size(); i++) { line.add(listDirections.get(i)); } map.addPolyline(line); // tambah marker di posisi end map.addMarker(new MarkerOptions() .position(end) .title(nama)); } @Override public void onMyLocationChange(Location location) { Toast.makeText(this, "Lokasi berubah ke " + location.getLatitude() + "," + location.getLongitude(), Toast.LENGTH_SHORT).show(); } } 

JSONHelper.java

 public class JSONHelper { private InputStream is = null; private JSONObject jsonObject = null; private String json = ""; private final String TAG_TEMPATMAKAN = "tempatmakan"; private final String TAG_ID = "id"; private final String TAG_NAMA = "nama"; private final String TAG_ALAMAT = "alamat"; private final String TAG_LAT = "lat"; private final String TAG_LNG = "lng"; private final String TAG_ROUTES = "routes"; private final String TAG_LEGS = "legs"; private final String TAG_STEPS = "steps"; private final String TAG_POLYLINE = "polyline"; private final String TAG_POINTS = "points"; private final String TAG_START = "start_location"; private final String TAG_END = "end_location"; public JSONObject getJSONFromURL(String url) { try { DefaultHttpClient httpClient = new DefaultHttpClient(); HttpGet httpGet = new HttpGet(url); HttpResponse httpResponse = httpClient.execute(httpGet); HttpEntity httpEntity = httpResponse.getEntity(); is = httpEntity.getContent(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } try { BufferedReader reader = new BufferedReader(new InputStreamReader( is, "iso-8859-1"), 8); StringBuilder sb = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } is.close(); json = sb.toString(); } catch (Exception e) { // TODO: handle exception } try { jsonObject = new JSONObject(json); } catch (JSONException e) { // TODO: handle exception } return jsonObject; } public ArrayList<TempatMakan> getTempatMakanAll(JSONObject jobj) { ArrayList<TempatMakan> listTempatMakan = new ArrayList<TempatMakan>(); try { JSONArray arrayTempatMakan = jobj.getJSONArray(TAG_TEMPATMAKAN); for (int i = 0; i < arrayTempatMakan.length(); i++) { JSONObject jobject = arrayTempatMakan.getJSONObject(i); Log.d("log", "muter ke " + i); listTempatMakan.add(new TempatMakan(jobject.getInt(TAG_ID), jobject.getString(TAG_NAMA), jobject .getString(TAG_ALAMAT), jobject .getDouble(TAG_LAT), jobject.getDouble(TAG_LNG))); } } catch (JSONException e) { e.printStackTrace(); } return listTempatMakan; } /* * Untuk decode Polyline * * @params String * * @return List<LatLng> */ private List<LatLng> decodePoly(String encoded) { List<LatLng> poly = new ArrayList<LatLng>(); int index = 0, len = encoded.length(); int lat = 0, lng = 0; while (index < len) { int b, shift = 0, result = 0; do { b = encoded.charAt(index++) - 63; result |= (b & 0x1f) << shift; shift += 5; } while (b >= 0x20); int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); lat += dlat; shift = 0; result = 0; do { b = encoded.charAt(index++) - 63; result |= (b & 0x1f) << shift; shift += 5; } while (b >= 0x20); int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); lng += dlng; LatLng position = new LatLng((double) lat / 1E5, (double) lng / 1E5); poly.add(position); } return poly; } /* * Untuk mendapatkan direction * * @params JSONObject * * @return List<LatLng> */ public List<LatLng> getDirection(JSONObject jObj) { List<LatLng> directions = new ArrayList<LatLng>(); try { JSONObject objRoute = jObj.getJSONArray(TAG_ROUTES).getJSONObject(0); JSONObject objLegs = objRoute.getJSONArray(TAG_LEGS).getJSONObject(0); JSONArray arraySteps = objLegs.getJSONArray(TAG_STEPS); for (int wi2t = 0; wi2t < arraySteps.length(); wi2t++) { JSONObject step = arraySteps.getJSONObject(wi2t); JSONObject objStart = step.getJSONObject(TAG_START); JSONObject objEnd = step.getJSONObject(TAG_END); double latStart = objStart.getDouble(TAG_LAT); double lngStart = objStart.getDouble(TAG_LNG); directions.add(new LatLng(latStart, lngStart)); JSONObject poly = step.getJSONObject(TAG_POLYLINE); String encodedPoly = poly.getString(TAG_POINTS); List<LatLng> decodedPoly = decodePoly(encodedPoly); for (int eka = 0; eka < decodedPoly.size(); eka++) { directions.add(new LatLng(decodedPoly.get(eka).latitude, decodedPoly.get(eka).longitude)); } double latEnd = objEnd.getDouble(TAG_LAT); double lngEnd = objEnd.getDouble(TAG_LNG); directions.add(new LatLng(latEnd, lngEnd)); } } catch (JSONException e) { // TODO: handle exception } return directions; } } 

MainActivity.java

 public class MainActivity extends FragmentActivity implements OnInfoWindowClickListener { private GoogleMap map; private JSONHelper json; private ProgressDialog pDialog; private Button btnGetDirection; private List<TempatMakan> listTempatMakan; private final String URL_API = "http://lhocation1203.hostzi.com/dataapi/tempatmakan.php"; public static final String KEY_NAMA = "nama"; public static final String KEY_ALAMAT = "alamat"; public static final String KEY_LAT_TUJUAN = "lat_tujuan"; public static final String KEY_LNG_TUJUAN = "lng_tujuan"; public static final String KEY_LAT_ASAL = "lat_asal"; public static final String KEY_LNG_ASAL = "lng_asal"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); json = new JSONHelper(); new AsynTaskMain().execute(); setupMapIfNeeded(); } private void setupMapIfNeeded() { if (map == null) { FragmentManager fragmentManager = getSupportFragmentManager(); SupportMapFragment supportMapFragment = (SupportMapFragment) fragmentManager.findFragmentById(R.id.maps); map = supportMapFragment.getMap(); if (map != null) { setupMap(); } } } private void setupMap() { map.setMyLocationEnabled(true); map.setOnInfoWindowClickListener(this); moveToMyLocation(); } private void moveToMyLocation() { LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); Criteria criteria = new Criteria(); Location location = locationManager.getLastKnownLocation(locationManager.getBestProvider(criteria, false)); if (location != null) { map.animateCamera(CameraUpdateFactory.newLatLngZoom( new LatLng(location.getLatitude(), location.getLongitude()), 13)); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); int resCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getApplicationContext()); if (resCode != ConnectionResult.SUCCESS) { GooglePlayServicesUtil.getErrorDialog(resCode, this, 1); } } private class AsynTaskMain extends AsyncTask<Void, Void, Void> { @Override protected void onPostExecute(Void result) { // TODO Auto-generated method stub pDialog.dismiss(); runOnUiThread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub for (int i = 0; i < listTempatMakan.size(); i++) { map.addMarker(new MarkerOptions() .position(new LatLng(listTempatMakan.get(i).getLat(), listTempatMakan.get(i).getLng())) .title(listTempatMakan.get(i).getNama()) .snippet(listTempatMakan.get(i).getAlamat())); } } }); super.onPostExecute(result); } @Override protected void onPreExecute() { // TODO Auto-generated method stub super.onPreExecute(); pDialog = new ProgressDialog(MainActivity.this); pDialog.setMessage("Loading...."); pDialog.setCancelable(true); pDialog.show(); } @Override protected Void doInBackground(Void... params) { // TODO Auto-generated method stub JSONObject jObject = json.getJSONFromURL(URL_API); listTempatMakan = json.getTempatMakanAll(jObject); return null; } } @Override public void onInfoWindowClick(Marker marker) { // marker id -> m0, m1, m2 dst.. String id = marker.getId(); id = id.substring(1); LatLng myLocation = new LatLng(map.getMyLocation().getLatitude(), map.getMyLocation().getLongitude()); if (myLocation != null) { Bundle bundle = new Bundle(); bundle.putString(KEY_NAMA, listTempatMakan.get(Integer.parseInt(id)).getNama()); bundle.putString(KEY_ALAMAT, listTempatMakan.get(Integer.parseInt(id)).getAlamat()); bundle.putDouble(KEY_LAT_TUJUAN, marker.getPosition().latitude); bundle.putDouble(KEY_LNG_TUJUAN, marker.getPosition().longitude); bundle.putDouble(KEY_LAT_ASAL, myLocation.latitude); bundle.putDouble(KEY_LNG_ASAL, myLocation.longitude); Intent i = new Intent(MainActivity.this, InfoTempatMakanActivity.class); i.putExtras(bundle); startActivity(i); } else { Toast.makeText(this, "Tidak dapat menemukan lokasi anda ", Toast.LENGTH_LONG).show(); } } } 

InfoTempatMakanActivity.java

 public class InfoTempatMakanActivity extends Activity implements OnClickListener { private TextView tvNama; private TextView tvAlamat; private Button btnGetDirection; private LatLng lokasiTujuan; private LatLng lokasiAwal; private String nama; private String alamat; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_info_tempat_makan); initialize(); Bundle bundle = getIntent().getExtras(); if (bundle != null) { nama = bundle.getString(MainActivity.KEY_NAMA); alamat = bundle.getString(MainActivity.KEY_ALAMAT); lokasiTujuan = new LatLng(bundle.getDouble(MainActivity.KEY_LAT_TUJUAN), bundle.getDouble(MainActivity.KEY_LNG_TUJUAN)); lokasiAwal = new LatLng(bundle.getDouble(MainActivity.KEY_LAT_ASAL), bundle.getDouble(MainActivity.KEY_LNG_ASAL)); } setTeksView(); } private void setTeksView() { tvNama.setText(nama); tvAlamat.setText(alamat); } private void initialize() { tvAlamat = (TextView) findViewById(R.id.alamatTempatMakan); tvNama = (TextView) findViewById(R.id.namaTempatMakan); btnGetDirection = (Button) findViewById(R.id.btnDirection); btnGetDirection.setOnClickListener(this); } @Override public void onClick(View v) { Bundle bundle = new Bundle(); bundle.putDouble(MainActivity.KEY_LAT_ASAL, lokasiAwal.latitude); bundle.putDouble(MainActivity.KEY_LNG_ASAL, lokasiAwal.longitude); bundle.putDouble(MainActivity.KEY_LAT_TUJUAN, lokasiTujuan.latitude); bundle.putDouble(MainActivity.KEY_LNG_TUJUAN, lokasiTujuan.longitude); bundle.putString(MainActivity.KEY_NAMA, nama); Intent intent = new Intent(this, DirectionActivity.class); intent.putExtras(bundle); startActivity(intent); } } 

TempatMakan.java

 public class TempatMakan { private int id; private String nama; private String alamat; private double lat; private double lng; public TempatMakan() { // TODO Auto-generated constructor stub } public TempatMakan(int id, String nama, String alamat, double lat, double lng) { super(); this.id = id; this.nama = nama; this.alamat = alamat; this.lat = lat; this.lng = lng; } public String getNama() { return nama; } public void setNama(String nama) { this.nama = nama; } public String getAlamat() { return alamat; } public void setAlamat(String alamat) { this.alamat = alamat; } public double getLat() { return lat; } public void setLat(double lat) { this.lat = lat; } public double getLng() { return lng; } public void setLng(double lng) { this.lng = lng; } } 

Google Directions JSON Response имеет объект под названием «Расстояние и продолжительность» в массиве «LEGS», например:

 "legs": [ { "distance": { "text": "0.3 km", "value": 263 }, "duration": { "text": "1 min", "value": 52 }, ....... //omitted value ] 

Таким образом, вы можете попытаться разобрать расстояние и продолжительность (если нужно) в ваше приложение. Может быть, вот так:

 JSONArray legs = jobject.getString("legs"); for (int i = 0; i < legs.length(); i++) { JSONObject legsObject = legs.getJSONObject(i); JSONObject distanceObject = legsObject.getString("distance"); String distanceText = distanceObject.getString("text"); String distanceValue = String.valueOf(distanceObject.getString("value")); //do anything else } 

О, и поместите пар массивов ног в синтаксический анализ ArrayTempatMakan. Я могу получить расстояние и продолжительность с помощью парсера Jackson JSON, поэтому вы сможете это сделать с помощью парсера org.JSON.

Удачи ^^

РЕДАКТИРОВАТЬ :

В этом getDirection (JSONObject jObj) Вы успешно получаете objLegs здесь, вам нужно получить расстояние и длительность в пределах objLegs

  JSONObject objRoute = jObj.getJSONArray(TAG_ROUTES).getJSONObject(0); JSONObject objLegs = objRoute.getJSONArray(TAG_LEGS).getJSONObject(0); JSONArray arraySteps = objLegs.getJSONArray(TAG_STEPS); 

Я думаю, вы должны добавить это ниже objLegs :

 JSONObject objDistance = objLegs.getJSONObject("distance"); JSONObject objDuration = objLegs.getJSONObject("duration"); String text_distance = objDistance.getString("text"); Log.d("Distance", text_distance); //adds an entry to the logCat, Check whether the value of Distance is successfully taken. String text_duration = objDuration.getString("text"); Log.d("Duration", text_duration); //adds an entry to the logCat, Check whether the value of Distance is successfully taken. 

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

Если вы все еще не можете вставить расстояние и продолжительность, включите класс TempatMakan в свой пост.

EDIT 2:

Объявите расстояние и продолжительность как строку внутри вашего TempatMakan.Java:

 private String durasi; private String jarak; 

Внутри вашего конструктора:

 public TempatMakan(int id, String nama, String alamat, String jarak, String durasi, double lat, double lng) { super(); this.id = id; this.nama = nama; this.alamat = alamat; this.lat = lat; this.lng = lng; this.jarak = jarak; this.durasi = durasi; } 

Затем объявите соответствующие геттеры и сеттеры для durasi и durasi .

Внутри вашего JSONHelper.java , метода getTempatMakanAll , добавьте следующие:

 for (int i = 0; i < arrayTempatMakan.length(); i++) { JSONObject jobject = arrayTempatMakan.getJSONObject(i); JSONObject objRoute = jobject.getJSONArray(TAG_ROUTES).getJSONObject(0); JSONObject objLegs = objRoute.getJSONArray(TAG_LEGS).getJSONObject(0); JSONObject objDistance = objLegs.getJSONObject("distance"); JSONObject objDuration = objLegs.getJSONObject("duration"); Log.d("log", "muter ke " + i); listTempatMakan.add( new TempatMakan( jobject.getInt(TAG_ID), jobject.getString(TAG_NAMA), jobject.getString(TAG_ALAMAT), objDistance.getString("text"),//jarak objDuration.getString("text"),//durasi jobject.getDouble(TAG_LAT), jobject.getDouble(TAG_LNG))); } 

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

Удачи, и, к сожалению, я не могу дать вам другой код или изменить ваш проект, вам нужно будет выяснить себя 🙂

PS: Скрипси или Тугас Кулия?

Intereting Posts
Почему Sonar не читает мои JUnit XML-результаты на Jenkins? Как создавать приложения в android, которые нельзя удалить? Можем ли мы сделать системные приложения? Удалить подчеркивание из AutoCompleteTextView через xml Активация элементов анимации Android L Android EditText, показывает как запятую, так и точку как возможный разделитель в случае numberDecimal input type Отображение карты Google Android Google возвращает ошибку при использовании onTap () – предполагается, что будет показан Alertdialog Как отобразить arraylist в gridview в android Есть ли способ удалить щелчок на мобильных устройствах Touch Touch? Объект не является частью схемы для этого Царства Как ограничить только левый, верхний и нижний для TextView AndroidStudio (0.8.9 Mac) Новый проект Gradle не удалось синхронизировать Как сохранить состояние Spinner в onSaveInstanceState при изменении ориентации в android Построение OpenSSL на Android NDK Кто-нибудь использовал Robotium или Calculon для тестирования приложений Android? Facebook android sdk 4.0, способ отменить обратный вызов из LoginManager