Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 两个位置之间不显示多段线,但显示时间和距离_Java_Android_Google Maps_Android Maps V2 - Fatal编程技术网

Java 两个位置之间不显示多段线,但显示时间和距离

Java 两个位置之间不显示多段线,但显示时间和距离,java,android,google-maps,android-maps-v2,Java,Android,Google Maps,Android Maps V2,注意:很抱歉我的英语不好,因为英语不是我的母语。为此,我使用了谷歌翻译。 我正在开发一个Android地图应用程序,用户可以在其中找到他们朋友的当前位置。为了存储当前位置,我使用Firebase实时数据库。在Lalit Singh之前的帮助下,它现在显示了时间和距离,但仍然没有更新两个不同位置之间的多段线。我的更新代码如下 java(我从fire base获取好友位置,并调用更新的时间、距离和多段线方法) CalculateInstanceTime.java(添加了新类) 保存在Fire Bas

注意:很抱歉我的英语不好,因为英语不是我的母语。为此,我使用了谷歌翻译。

我正在开发一个Android地图应用程序,用户可以在其中找到他们朋友的当前位置。为了存储当前位置,我使用Firebase实时数据库。在Lalit Singh之前的帮助下,它现在显示了时间和距离,但仍然没有更新两个不同位置之间的多段线。我的更新代码如下

java(我从fire base获取好友位置,并调用更新的时间、距离和多段线方法)

CalculateInstanceTime.java(添加了新类)

保存在Fire Base方法中的数据


添加以下代码并替换为图形多段线代码,请使用

 String url = getUrl(origin, dest);
 FetchUrl FetchUrl = new FetchUrl();

 // Start downloading json data from Google Directions API
FetchUrl.execute(url);
在要绘制方向的位置使用上述代码,
origin
dest
是LatLng对象,例如:

LatLng dest = new LatLng(Double.parseDouble(d_lat), Double.parseDouble(d_lng));
以下是获取方向的方法

private String getUrl(LatLng origin, LatLng dest) {

        // Origin of route
        String str_origin = "origin=" + origin.latitude + "," + origin.longitude;

        // Destination of route
        String str_dest = "destination=" + dest.latitude + "," + dest.longitude;


        // Sensor enabled
        String sensor = "sensor=false";

        // Building the parameters to the web service
        String parameters = str_origin + "&" + str_dest + "&" + sensor;

        // Output format
        String output = "json";

        // Building the url to the web service


        return "https://maps.googleapis.com/maps/api/directions/" + output + "?" + parameters;
    }
在此之后,请使用以下类别

private class FetchUrl extends AsyncTask<String, Void, String> {

        @Override
        protected String doInBackground(String... url) {

            // For storing data from web service
            String data = "";

            try {
                // Fetching the data from web service
                data = downloadUrl(url[0]);
                Log.d("Background Task data", data);
            } catch (Exception e) {
                Log.d("Background Task", e.toString());
            }
            return data;
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);

            ParserTask parserTask = new ParserTask();

            // Invokes the thread for parsing the JSON data
            parserTask.execute(result);

        }
    }

    /**
     * A class to parse the Google Places in JSON format
     */

    private class ParserTask extends AsyncTask<String, Integer, List<List<HashMap<String, String>>>> {

        // Parsing the data in non-ui thread
        @Override
        protected List<List<HashMap<String, String>>> doInBackground(String... jsonData) {

            JSONObject jObject;
            List<List<HashMap<String, String>>> routes = null;

            try {
                jObject = new JSONObject(jsonData[0]);

                Log.d("ParserTask", jsonData[0]);

                JSONArray array = jObject.getJSONArray("routes");
                JSONObject paths = array.getJSONObject(0);
                JSONArray legs = paths.getJSONArray("legs");
                JSONObject steps = legs.getJSONObject(0);
                JSONObject distance = steps.getJSONObject("distance");
                JSONObject duration = legs.getJSONObject(0).getJSONObject("duration");
                parsedDistance = distance.getString("text");
                if (parsedDistance.contains("km")) {
                    String[] val = parsedDistance.split(" ");
                    String val1 = val[0];
                    distance_from = convertInMiles(val1);
                } else {
                    distance_from = parsedDistance;
                }
                address = legs.getJSONObject(0).getString("end_address");
                time = duration.getString("text");
                DataParser parser = new DataParser();
                Log.d("ParserTask", parser.toString());

                // Starts parsing data
                routes = parser.parse(jObject);
                Log.d("ParserTask", "Executing routes");
                Log.d("ParserTask", routes.toString());

            } catch (Exception e) {
                Log.d("ParserTask", e.toString());
                e.printStackTrace();
            }
            return routes;
        }

        // Executes in UI thread, after the parsing process
        @Override
        protected void onPostExecute(List<List<HashMap<String, String>>> result) {
            ArrayList<LatLng> points;
            PolylineOptions lineOptions = null;

            // Traversing through all the routes
            if (result != null && result.size() > 0) {
                for (int i = 0; i < result.size(); i++) {
                    points = new ArrayList<>();
                    lineOptions = new PolylineOptions();

                    // Fetching i-th route
                    List<HashMap<String, String>> path = result.get(i);

                    // Fetching all the points in i-th route
                    for (int j = 0; j < path.size(); j++) {
                        HashMap<String, String> point = path.get(j);

                        double lat = Double.parseDouble(point.get("lat"));
                        double lng = Double.parseDouble(point.get("lng"));
                        LatLng position = new LatLng(lat, lng);

                        points.add(position);
                    }

                    // Adding all the points in the route to LineOptions
                    lineOptions.addAll(points);
                    lineOptions.width(10);
                    lineOptions.color(Color.BLACK);

                    p_distance.setText("Distance : " + distance_from);
                    p_time.setText("ETA :" + time);
                    if (p_time.getText().toString().length() == 10) {
                        arrival_time = p_time.getText().toString().substring(5, p_time.getText().toString().length() - 4);
                        Log.d("arrival_time", arrival_time);
                        SessionManager.put(Constants.TIME, arrival_time);
                    } else if (p_time.getText().toString().length() > 10) {
                        arrival_time = p_time.getText().toString().substring(5, p_time.getText().toString().length() - 5);
                        Log.d("arrival_time", arrival_time);
                        SessionManager.put(Constants.TIME, arrival_time);
                    }
                    p_address.setText("Address : " + address);
                    navigation.setVisibility(View.VISIBLE);
                    Log.d("onPostExecute", "onPostExecute lineoptions decoded");
                }

            }

            // Drawing polyline in the Google Map for the i-th route
            if (lineOptions != null) {
                mMap.addPolyline(lineOptions);
            } else {
                Log.d("onPostExecute", "without Polylines drawn");
            }
        }
    }

private String downloadUrl(String strUrl) throws IOException {
        String data = "";
        InputStream iStream = null;
        HttpURLConnection urlConnection = null;
        try {
            URL url = new URL(strUrl);

            // Creating an http connection to communicate with url
            urlConnection = (HttpURLConnection) url.openConnection();

            // Connecting to url
            urlConnection.connect();

            // Reading data from url
            iStream = urlConnection.getInputStream();

            BufferedReader br = new BufferedReader(new InputStreamReader(iStream));

            StringBuffer sb = new StringBuffer();

            String line = "";
            while ((line = br.readLine()) != null) {
                sb.append(line);
            }

            data = sb.toString();
            Log.d("downloadUrl", data);
            br.close();

        } catch (Exception e) {
            Log.d("Exception", e.toString());
        } finally {
            assert iStream != null;
            iStream.close();
            assert urlConnection != null;
            urlConnection.disconnect();
        }
        return data;
    }
私有类FetchUrl扩展异步任务{
@凌驾
受保护的字符串doInBackground(字符串…url){
//用于存储来自web服务的数据
字符串数据=”;
试一试{
//从web服务获取数据
数据=下载url(url[0]);
Log.d(“后台任务数据”,数据);
}捕获(例外e){
Log.d(“后台任务”,例如toString());
}
返回数据;
}
@凌驾
受保护的void onPostExecute(字符串结果){
super.onPostExecute(结果);
ParserTask ParserTask=新的ParserTask();
//调用线程以解析JSON数据
执行(结果);
}
}
/**
*以JSON格式解析GooglePlaces的类
*/
私有类ParserTask扩展了AsyncTask{
//解析非ui线程中的数据
@凌驾
受保护列表doInBackground(字符串…jsonData){
JSONObject jObject;
列表路由=空;
试一试{
jObject=新的JSONObject(jsonData[0]);
Log.d(“ParserTask”,jsonData[0]);
JSONArray数组=jObject.getJSONArray(“路由”);
JSONObject路径=array.getJSONObject(0);
JSONArray legs=path.getJSONArray(“legs”);
JSONObject步骤=legs.getJSONObject(0);
JSONObject距离=步长。getJSONObject(“距离”);
JSONObject持续时间=legs.getJSONObject(0.getJSONObject(“持续时间”);
ParsedInstance=distance.getString(“文本”);
if(parsedInstance.contains(“km”)){
字符串[]val=parsedInstance.split(“”);
字符串val1=val[0];
距离=换算英里(val1);
}否则{
距离=解析距离;
}
地址=legs.getJSONObject(0).getString(“结束地址”);
time=duration.getString(“文本”);
DataParser=新的DataParser();
Log.d(“ParserTask”,parser.toString());
//开始解析数据
routes=parser.parse(jObject);
Log.d(“ParserTask”,“执行路由”);
Log.d(“ParserTask”,routes.toString());
}捕获(例外e){
Log.d(“ParserTask”,例如toString());
e、 printStackTrace();
}
返回路线;
}
//解析过程后,在UI线程中执行
@凌驾
受保护的void onPostExecute(列表结果){
阵列列表点;
PolylineOptions lineOptions=null;
//穿越所有路线
if(result!=null&&result.size()>0){
对于(int i=0;i10){
arrival_time=p_time.getText().toString().substring(5,p_time.getText().toString().length()-5);
Log.d(“到达时间”,到达时间);
SessionManager.put(常量.TIME,到达时间);
}
p_address.setText(“地址:+地址”);
navigation.setVisibility(View.VISIBLE);
d(“onPostExecute”、“onPostExecute行选项解码”);
}
}
//拉伸多边形
  private String getDirectionsUrl(LatLng origin, LatLng dest) {

    String str_origin = "origin=" + origin.latitude + "," + origin.longitude;

    String str_dest = "destination=" + dest.latitude + "," + dest.longitude;

    String sensor = "sensor=false";

    String parameters = str_origin + "&" + str_dest + "&" + sensor;

    String output = "json";

    return "https://maps.googleapis.com/maps/api/directions/" + output + "?" + parameters;
}

  @SuppressLint("NewApi")
  public static String downloadUrl(String strUrl) throws IOException {
    String data = "";
    HttpURLConnection urlConnection;
    URL url = new URL(strUrl);

    // Creating an http connection to communicate with url
    urlConnection = (HttpURLConnection) url.openConnection();

    // Connecting to url
    urlConnection.connect();

    // Reading data from url
    try (InputStream iStream = urlConnection.getInputStream()) {
        BufferedReader br = new BufferedReader(new InputStreamReader(iStream));

        StringBuilder sb = new StringBuilder();

        String line;
        while ((line = br.readLine()) != null) {
            sb.append(line);
        }

        data = sb.toString();

        br.close();

    } catch (Exception e) {
        Log.d("Exception while down", e.toString());
    } finally {
        urlConnection.disconnect();
    }
    return data;
}

  private class DownloadTask extends AsyncTask<String, Void, String> {

    // Downloading data in non-ui thread
    @Override
    protected String doInBackground(String... url) {

        // For storing data from web service
        String data = "";

        try {
            // Fetching the data from web service
            data = downloadUrl(url[0]);
        } catch (Exception e) {
            Log.d("Background Task", e.toString());
        }
        return data;
    }

    // Executes in UI thread, after the execution of
    // doInBackground()
    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);

        ParserTask parserTask = new ParserTask();

        // Invokes the thread for parsing the JSON data
        parserTask.execute(result);
    }
}

private class ParserTask extends AsyncTask<String, Integer, List<List<HashMap<String, String>>>> {

    @Override
    protected List<List<HashMap<String, String>>> doInBackground(String... jsonData) {

        JSONObject jObject;
        List<List<HashMap<String, String>>> routes = null;

        try {
            jObject = new JSONObject(jsonData[0]);
            DirectionsJSONParser parser = new DirectionsJSONParser();

            // Starts parsing data
            routes = parser.parse(jObject);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return routes;
    }

    @Override
    protected void onPostExecute(List<List<HashMap<String, String>>> result) {
        ArrayList<LatLng> points = new ArrayList<>();
        PolylineOptions lineOptions = new PolylineOptions();
        for (int i = 0; i < result.size(); i++) {
            List<HashMap<String, String>> path = result.get(i);
            for (int j = 0; j < path.size(); j++) {
                HashMap<String, String> point = path.get(j);
                double lat = Double.parseDouble(point.get("lat"));
                double lng = Double.parseDouble(point.get("lng"));
                LatLng position = new LatLng(lat, lng);
                points.add(position);
            }
            lineOptions.addAll(points);
            lineOptions.width(10);
            lineOptions.color(Color.WHITE);
            mMap.addPolyline(lineOptions);
        }
    }
}
@Override
public void onLocationChanged(Location location) {
    Log.d("onLocationChanged", "entered");

    mLastLocation = location;

    DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
    dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
    Date date = new Date();
    mLastUpdateTime = ((dateFormat.format(date).toString()));

    saveToFirebase();

    if (mCurrLocationMarker != null) {
        mCurrLocationMarker.remove();
    }

    latitude = location.getLatitude();
    longitude = location.getLongitude();

    LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
    MarkerOptions markerOptions = new MarkerOptions();
    markerOptions.position(latLng);
    markerOptions.draggable(false);
    markerOptions.title("Current Position");
    markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA));
    mCurrLocationMarker = mMap.addMarker(markerOptions);

    //move map camera
    mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
    mMap.animateCamera(CameraUpdateFactory.zoomTo(11));

    Toast.makeText(MapsActivity.this, "Your Current Location", Toast.LENGTH_LONG).show();

    //stop location updates
    if (mGoogleApiClient != null) {
     LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient,
   this);
        Log.d("onLocationChanged", "Removing Location Updates");
    }
}
public void saveToFirebase() {

    DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("Email").push();
    String email = FirebaseAuth.getInstance().getCurrentUser().getEmail();
    UserInformation userInformation = new UserInformation(email, mLastLocation.getLatitude(), mLastLocation.getLongitude());
    ref.setValue(userInformation);
}
 String url = getUrl(origin, dest);
 FetchUrl FetchUrl = new FetchUrl();

 // Start downloading json data from Google Directions API
FetchUrl.execute(url);
LatLng dest = new LatLng(Double.parseDouble(d_lat), Double.parseDouble(d_lng));
private String getUrl(LatLng origin, LatLng dest) {

        // Origin of route
        String str_origin = "origin=" + origin.latitude + "," + origin.longitude;

        // Destination of route
        String str_dest = "destination=" + dest.latitude + "," + dest.longitude;


        // Sensor enabled
        String sensor = "sensor=false";

        // Building the parameters to the web service
        String parameters = str_origin + "&" + str_dest + "&" + sensor;

        // Output format
        String output = "json";

        // Building the url to the web service


        return "https://maps.googleapis.com/maps/api/directions/" + output + "?" + parameters;
    }
private class FetchUrl extends AsyncTask<String, Void, String> {

        @Override
        protected String doInBackground(String... url) {

            // For storing data from web service
            String data = "";

            try {
                // Fetching the data from web service
                data = downloadUrl(url[0]);
                Log.d("Background Task data", data);
            } catch (Exception e) {
                Log.d("Background Task", e.toString());
            }
            return data;
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);

            ParserTask parserTask = new ParserTask();

            // Invokes the thread for parsing the JSON data
            parserTask.execute(result);

        }
    }

    /**
     * A class to parse the Google Places in JSON format
     */

    private class ParserTask extends AsyncTask<String, Integer, List<List<HashMap<String, String>>>> {

        // Parsing the data in non-ui thread
        @Override
        protected List<List<HashMap<String, String>>> doInBackground(String... jsonData) {

            JSONObject jObject;
            List<List<HashMap<String, String>>> routes = null;

            try {
                jObject = new JSONObject(jsonData[0]);

                Log.d("ParserTask", jsonData[0]);

                JSONArray array = jObject.getJSONArray("routes");
                JSONObject paths = array.getJSONObject(0);
                JSONArray legs = paths.getJSONArray("legs");
                JSONObject steps = legs.getJSONObject(0);
                JSONObject distance = steps.getJSONObject("distance");
                JSONObject duration = legs.getJSONObject(0).getJSONObject("duration");
                parsedDistance = distance.getString("text");
                if (parsedDistance.contains("km")) {
                    String[] val = parsedDistance.split(" ");
                    String val1 = val[0];
                    distance_from = convertInMiles(val1);
                } else {
                    distance_from = parsedDistance;
                }
                address = legs.getJSONObject(0).getString("end_address");
                time = duration.getString("text");
                DataParser parser = new DataParser();
                Log.d("ParserTask", parser.toString());

                // Starts parsing data
                routes = parser.parse(jObject);
                Log.d("ParserTask", "Executing routes");
                Log.d("ParserTask", routes.toString());

            } catch (Exception e) {
                Log.d("ParserTask", e.toString());
                e.printStackTrace();
            }
            return routes;
        }

        // Executes in UI thread, after the parsing process
        @Override
        protected void onPostExecute(List<List<HashMap<String, String>>> result) {
            ArrayList<LatLng> points;
            PolylineOptions lineOptions = null;

            // Traversing through all the routes
            if (result != null && result.size() > 0) {
                for (int i = 0; i < result.size(); i++) {
                    points = new ArrayList<>();
                    lineOptions = new PolylineOptions();

                    // Fetching i-th route
                    List<HashMap<String, String>> path = result.get(i);

                    // Fetching all the points in i-th route
                    for (int j = 0; j < path.size(); j++) {
                        HashMap<String, String> point = path.get(j);

                        double lat = Double.parseDouble(point.get("lat"));
                        double lng = Double.parseDouble(point.get("lng"));
                        LatLng position = new LatLng(lat, lng);

                        points.add(position);
                    }

                    // Adding all the points in the route to LineOptions
                    lineOptions.addAll(points);
                    lineOptions.width(10);
                    lineOptions.color(Color.BLACK);

                    p_distance.setText("Distance : " + distance_from);
                    p_time.setText("ETA :" + time);
                    if (p_time.getText().toString().length() == 10) {
                        arrival_time = p_time.getText().toString().substring(5, p_time.getText().toString().length() - 4);
                        Log.d("arrival_time", arrival_time);
                        SessionManager.put(Constants.TIME, arrival_time);
                    } else if (p_time.getText().toString().length() > 10) {
                        arrival_time = p_time.getText().toString().substring(5, p_time.getText().toString().length() - 5);
                        Log.d("arrival_time", arrival_time);
                        SessionManager.put(Constants.TIME, arrival_time);
                    }
                    p_address.setText("Address : " + address);
                    navigation.setVisibility(View.VISIBLE);
                    Log.d("onPostExecute", "onPostExecute lineoptions decoded");
                }

            }

            // Drawing polyline in the Google Map for the i-th route
            if (lineOptions != null) {
                mMap.addPolyline(lineOptions);
            } else {
                Log.d("onPostExecute", "without Polylines drawn");
            }
        }
    }

private String downloadUrl(String strUrl) throws IOException {
        String data = "";
        InputStream iStream = null;
        HttpURLConnection urlConnection = null;
        try {
            URL url = new URL(strUrl);

            // Creating an http connection to communicate with url
            urlConnection = (HttpURLConnection) url.openConnection();

            // Connecting to url
            urlConnection.connect();

            // Reading data from url
            iStream = urlConnection.getInputStream();

            BufferedReader br = new BufferedReader(new InputStreamReader(iStream));

            StringBuffer sb = new StringBuffer();

            String line = "";
            while ((line = br.readLine()) != null) {
                sb.append(line);
            }

            data = sb.toString();
            Log.d("downloadUrl", data);
            br.close();

        } catch (Exception e) {
            Log.d("Exception", e.toString());
        } finally {
            assert iStream != null;
            iStream.close();
            assert urlConnection != null;
            urlConnection.disconnect();
        }
        return data;
    }
import android.content.Context;
import android.os.AsyncTask;
import android.util.Log;    
import com.google.android.gms.maps.model.LatLng;    
import org.json.JSONObject;    
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Set;    
class CalculateDistanceTime {    
private taskCompleteListener mTaskListener;
private Context mContext;      
CalculateDistanceTime(Context context) {
    mContext = context;
}    
void setLoadListener(taskCompleteListener taskListener) {
    mTaskListener = taskListener;
}       
void getDirectionsUrl(LatLng origin, LatLng dest) {

    // Origin of route
    String str_origin = "origin=" + origin.latitude + "," + origin.longitude;

    // Destination of route
    String str_dest = "destination=" + dest.latitude + "," + dest.longitude;


    // Sensor enabled
    String sensor = "sensor=false";

    // Building the parameters to the web service
    String parameters = str_origin + "&" + str_dest + "&" + sensor;

    // Output format
    String output = "json";

    // Building the url to the web service
    String url = "https://maps.googleapis.com/maps/api/directions/" + output + "?" + parameters;


    DownloadTask downloadTask = new DownloadTask();

    // Start downloading json data from Google Directions API

    downloadTask.execute(url);
}

private String downloadUrl(String strUrl) throws IOException {
    String data = "";
    HttpURLConnection urlConnection;
    URL url = new URL(strUrl);

    // Creating an http connection to communicate with url
    urlConnection = (HttpURLConnection) url.openConnection();

    // Connecting to url
    urlConnection.connect();

    // Reading data from url
    try (InputStream iStream = urlConnection.getInputStream()) {
        BufferedReader br = new BufferedReader(new InputStreamReader(iStream));

        StringBuilder sb = new StringBuilder();

        String line;
        while ((line = br.readLine()) != null) {
            sb.append(line);
        }

        data = sb.toString();

        br.close();

    } catch (Exception e) {
        Log.d("Excp. while downloading", e.toString());
    } finally {
        urlConnection.disconnect();
    }
    return data;
}


interface taskCompleteListener {
    void taskCompleted(String[] time_distance);
}

private class DownloadTask extends AsyncTask<String, Void, String> {

    // Downloading data in non-ui thread
    @Override
    protected String doInBackground(String... url) {

        // For storing data from web service
        String data = "";

        try {
            // Fetching the data from web service
            data = downloadUrl(url[0]);
        } catch (Exception e) {
            Log.d("Background Task", e.toString());
        }
        return data;
    }

    // Executes in UI thread, after the execution of
    // doInBackground()
    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);

        ParserTask parserTask = new ParserTask();

        // Invokes the thread for parsing the JSON data
        parserTask.execute(result);

    }
}

private class ParserTask extends AsyncTask<String, Integer, List<HashMap<String, String>>> {

    // Parsing the data in non-ui thread
    @Override
    protected List<HashMap<String, String>> doInBackground(String... jsonData) {

        JSONObject jObject;
        List<HashMap<String, String>> routes = null;

        try {
            jObject = new JSONObject(jsonData[0]);
            DistanceTimeParser parser = new DistanceTimeParser();

            // Starts parsing data
            routes = parser.parse(jObject);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return routes;
    }

    // Executes in UI thread, after the parsing process
    @Override
    protected void onPostExecute(List<HashMap<String, String>> result) {

        String duration_distance = "";


        if (result.size() < 1) {
            Log.e("Error : ", "No Points found");
            return;
        }


        String[] date_dist = new String[2];

        // Traversing through all the routes
        for (int i = 0; i < result.size(); i++) {

            // Fetching i-th route
            HashMap<String, String> tmpData = result.get(i);
            Set<String> key = tmpData.keySet();
            Iterator it = key.iterator();
            while (it.hasNext()) {
                String hmKey = (String) it.next();
                duration_distance = tmpData.get(hmKey);

                System.out.println("Key: " + hmKey + " & Data: " + duration_distance);

                it.remove(); // avoids a ConcurrentModificationException
            }

            date_dist[i] = duration_distance;
        }

        mTaskListener.taskCompleted(date_dist);
    }
  }
}
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class DistanceTimeParser {
    public List<HashMap<String, String>> parse(JSONObject jObject) {


    List<HashMap<String, String>> routes = new ArrayList<HashMap<String, String>>();
    JSONArray jRoutes = null;
    JSONArray jLegs = null;

    JSONObject jDistance = null;
    JSONObject jDuration = null;

    try {

        jRoutes = jObject.getJSONArray("routes");

        jLegs = ((JSONObject) jRoutes.get(0)).getJSONArray("legs");

        List<HashMap<String, String>> path = new ArrayList<HashMap<String, String>>();


        /** Getting distance from the json data */
        jDistance = ((JSONObject) jLegs.get(0)).getJSONObject("distance");
        HashMap<String, String> hmDistance = new HashMap<String, String>();
        hmDistance.put("distance", jDistance.getString("text"));

        /** Getting duration from the json data */
        jDuration = ((JSONObject) jLegs.get(0)).getJSONObject("duration");
        HashMap<String, String> hmDuration = new HashMap<String, String>();
        hmDuration.put("duration", jDuration.getString("text"));

        routes.add(hmDistance);

        routes.add(hmDuration);

    } catch (JSONException e) {
        e.printStackTrace();
    } catch (Exception e) {
    }

    return routes;
}
}
import com.google.android.gms.maps.model.LatLng;    
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;    
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
class DirectionsJSONParser {


List<List<HashMap<String,String>>> parse(JSONObject jObject){

    List<List<HashMap<String, String>>> routes = new ArrayList<>() ;
    JSONArray jRoutes ;
    JSONArray jLegs ;
    JSONArray jSteps ;

    try {

        jRoutes = jObject.getJSONArray("routes");


        for(int i=0;i<jRoutes.length();i++){
            jLegs = ( (JSONObject)jRoutes.get(i)).getJSONArray("legs");
            List path = new ArrayList<>();

            for(int j=0;j<jLegs.length();j++){
                jSteps = ( (JSONObject)jLegs.get(j)).getJSONArray("steps");


                for(int k=0;k<jSteps.length();k++){
                    String polyline;
                    polyline = (String)((JSONObject)((JSONObject)jSteps.get(k)).get("polyline")).get("points");
                    List<LatLng> list = decodePoly(polyline);


                    for(int l=0;l<list.size();l++){
                        HashMap<String, String> hm = new HashMap<>();
                        hm.put("lat", Double.toString((list.get(l)).latitude) );
                        hm.put("lng", Double.toString((list.get(l)).longitude) );
                        path.add(hm);
                    }
                }
                routes.add(path);
            }
        }

    } catch (JSONException e) {
        e.printStackTrace();
    }catch (Exception ignored){
    }

    return routes;
}

private List<LatLng> decodePoly(String encoded) {

    List<LatLng> poly = new ArrayList<>();
    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 p = new LatLng((((double) lat / 1E5)),
                (((double) lng / 1E5)));
        poly.add(p);
    }

    return poly;
}
}
private String getDirectionsUrl(LatLng origin, LatLng dest) {

        String str_origin = "origin=" + origin.latitude + "," + origin.longitude;


        String str_dest = "destination=" + dest.latitude + "," + dest.longitude;


        String sensor = "sensor=false";


        String parameters = str_origin + "&" + str_dest + "&" + sensor;

        String output = "json";


        return "https://maps.googleapis.com/maps/api/directions/" + output + "?" + parameters;
    }

    public static String downloadUrl(String strUrl) throws IOException {
        String data = "";
        HttpURLConnection urlConnection;
        URL url = new URL(strUrl);

        // Creating an http connection to communicate with url
        urlConnection = (HttpURLConnection) url.openConnection();

        // Connecting to url
        urlConnection.connect();

        // Reading data from url
        try (InputStream iStream = urlConnection.getInputStream()) {
            BufferedReader br = new BufferedReader(new InputStreamReader(iStream));

            StringBuilder sb = new StringBuilder();

            String line;
            while ((line = br.readLine()) != null) {
                sb.append(line);
            }

            data = sb.toString();

            br.close();

        } catch (Exception e) {
            Log.d("Exception while down", e.toString());
        } finally {
            urlConnection.disconnect();
        }
        return data;
    }

private class DownloadTask extends AsyncTask<String, Void, String> {

        // Downloading data in non-ui thread
        @Override
        protected String doInBackground(String... url) {

            // For storing data from web service
            String data = "";

            try {
                // Fetching the data from web service
                data = downloadUrl(url[0]);
            } catch (Exception e) {
                Log.d("Background Task", e.toString());
            }
            return data;
        }

        // Executes in UI thread, after the execution of
        // doInBackground()
        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);

            ParserTask parserTask = new ParserTask();

            // Invokes the thread for parsing the JSON data
            parserTask.execute(result);
        }
    }

private class ParserTask extends AsyncTask<String, Integer, List<List<HashMap<String, String>>>> {

        @Override
        protected List<List<HashMap<String, String>>> doInBackground(String... jsonData) {

            JSONObject jObject;
            List<List<HashMap<String, String>>> routes = null;

            try {
                jObject = new JSONObject(jsonData[0]);
                DirectionsJSONParser parser = new DirectionsJSONParser();

                // Starts parsing data
                routes = parser.parse(jObject);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return routes;
        }

        @Override
        protected void onPostExecute(List<List<HashMap<String, String>>> result) {
            ArrayList<LatLng> points = new ArrayList<>();
            lineOptions = new PolylineOptions();
            for (int i = 0; i < result.size(); i++) {
                List<HashMap<String, String>> path = result.get(i);
                for (int j = 0; j < path.size(); j++) {
                    HashMap<String, String> point = path.get(j);
                    double lat = Double.parseDouble(point.get("lat"));
                    double lng = Double.parseDouble(point.get("lng"));
                    LatLng position = new LatLng(lat, lng);
                    points.add(position);
                }
                lineOptions.addAll(points);
                lineOptions.width(10);                   
                lineOptions.color(Color.WHITE);
                googleMap.addPolyline(lineOptions);                
        }
    }
               distance_task.getDirectionsUrl(latLng1, latLng2);
               distance_task.setLoadListener(new CalculateDistanceTime.taskCompleteListener() {
                        @Override
                        public void taskCompleted(String[] time_distance) {
                            text1.setText(time_distance[0]); //Distance
                            text2.setText(time_distance[1]); //Time
                        }
                    });
               String url = getDirectionsUrl(latLng1, latLng2);
               DownloadTask downloadTask = new DownloadTask();
               downloadTask.execute(url);