折线不显示在2个位置之间,但显示时间和距离

时间:2017-10-19 06:52:06

标签: java android google-maps android-maps-v2

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

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

mapsActivity.java(我从火基地获取朋友位置,并更新时间,距离和折线方法)

  public void proceed(final View view) {

    DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("Email");

    ref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) {
                UserInformation details = dataSnapshot1.getValue(UserInformation.class);

                if (mMap != null) {
                    mMap.clear();
                }

                MarkerOptions markerOptions = new MarkerOptions();
                LatLng latLng1 = new LatLng(details.getLatitude(), details.getLongitude());
                markerOptions.position(latLng1);
                markerOptions.title(String.valueOf(latLng1));
                mMap.addMarker(markerOptions).setIcon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN));
                mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
                mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng1));
                mMap.animateCamera(CameraUpdateFactory.zoomTo(14));

                distance_task.getDirectionsUrl(latLng1, markerOptions.getPosition());
                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, markerOptions.getPosition());
                DownloadTask downloadTask = new DownloadTask();
                downloadTask.execute(url);
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

CalculateDistanceTime.java(添加了新类)

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);
}   } }

DistanceTimeParser.java(添加了新类)

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;
} }

DirectionsJSONParser.java(添加了新类)

public 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;
} }

在mapsActivity.java中添加了这4个方法

  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);
        }
    }
}

mapsActivity.java(我在地图中的当前位置)

@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");
    }
}

Fire Base方法中保存的数据

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);
}

2 个答案:

答案 0 :(得分:1)

我假设你需要路线,距离和时间。 首先创建这3个类。

  1. CalculateDistanceTime.java

    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);
        }
      }
    }
    
  2. DistanceTimeParser.java

    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;
    }
    }
    
  3. DirectionsJSONParser.java

    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;
    }
    }
    
  4. 简单地复制这三个文件后。 对于任何MapsActivity,您可以执行以下操作 这是您可以在任何活动中使用以下代码的点,上面的代码对于每个活动都是相同的(方向图)。

    创建一个全局变量CalculateDistanceTime distance_task; 将其onCreate初始化为distance_task = new CalculateDistanceTime(this);

    在MapsActivity.java中发布这4种方法。

    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);                
            }
        }
    

    此时您已获得所有必需的代码 现在使用以下代码传递您所在位置和朋友位置的latlng,您将拥有时间距离和路线。

                   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);
    

    要显示距离和时间,您必须创建两个TextView(请参阅上面的text1和Text2)。

答案 1 :(得分:0)

添加以下代码并替换为您的绘图折线代码,使用此

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

 // Start downloading json data from Google Directions API
FetchUrl.execute(url);

使用上面的代码来绘制路线origin&amp; 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;
    }