java - 如何在 Android Studio 中实现 Google Distance/Matrix Api?

标签 java google-maps google-distancematrix-api

我正在编写一个应用程序来计算 route 的两个位置。我已经实现了 google places API 以根据名称或地址获取纬度/经度,但我无法实现 Distance API。当我尝试导入时,类/方法没有出现。下面是我正在尝试做的一个例子。

    private static final String API_KEY = "YOUR_API_KEY";
    private static final GeoApiContext context = new 
    GeoApiContext().setApiKey(API_KEY);


    public DistanceMatrix estimateRouteTime(DateTime time, Boolean isForCalculateArrivalTime, DirectionsApi.RouteRestriction routeRestriction, LatLng departure, LatLng... arrivals) {
        try {
            DistanceMatrixApiRequest req = DistanceMatrixApi.newRequest(context);
            if (isForCalculateArrivalTime) {
                req.departureTime(time);
            } else {
                req.arrivalTime(time);
            }
            if (routeRestriction == null) {
                routeRestriction = DirectionsApi.RouteRestriction.TOLLS;
            }
            DistanceMatrix trix = req.origins(departure)
                    .destinations(arrivals)
                    .mode(TravelMode.DRIVING)
                    .avoid(routeRestriction)
                    .language("fr-FR")
                    .await();
            return trix;

        } catch (ApiException e) {
            System.out.println(e.getMessage());
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        return null;
    }

GeoApiContext 和 DistanceMatrix 不会在导入时出现。 感谢您的帮助。

最佳答案

回答我的问题...

    public class GetJson extends AsyncTask<Void, Void, DeliveryData> {

    @Override
    protected void onPreExecute() {
        // progressDialog 
    }

    @Override
    protected DeliveryData doInBackground(Void... params) {
        Utils util = new Utils();
        DeliveryData json = util.getInfo("https://maps.googleapis.com/maps/api/distancematrix/json?units=metric&origins="+latLngCompany.latitude+","+latLngCompany.longitude+
                "&destinations="+latPlace+","+lonPlace+"&key=" + APISERVERKEY);
        deliveryData.saveDeliveryData();

        return json;

    }

    @Override
    protected void onPostExecute(DeliveryData deliveryData) {
        //progressDialog.dismiss
    }
}

创建了一个 AsyncTask 以使用特定参数从 url 获取 json。

public class Utils {

public DeliveryData getInfo(String end){

    String json;
    DeliveryData output;
    json = NetworkUtils.getJSONFromAPI(end);
    output = parseJson(json);


    return output;
}

private DeliveryData parseJson(String json){
    try {
        DeliveryData deliveryData = new DeliveryData();

        JSONObject distanceJson = new JSONObject(json)
                .getJSONArray("rows")
                .getJSONObject(0)
                .getJSONArray("elements")
                .getJSONObject(0)
                .getJSONObject("distance");
        Double distanceDouble = null ;
        String distance = distanceJson.get("text").toString();
        if (distance.contains("km")){
            distanceDouble = Double.parseDouble(distance.replace("km", ""));

        }else {
            distanceDouble = Double.parseDouble("0." + distance.replace("m", ""));
        }

        deliveryData.setDistance(distanceDouble);

        return deliveryData;
    }catch (JSONException e){
        e.printStackTrace();
        return null;
    }
}

}

在 getInfo 中,来自 url 的数据被传递给 string。然后,调用 parseJson 将字符串转换为 JsonObject。 我的 Json 只有一个位置。因此,对象在数组中被选中,String 被解析为 Double,不包括字符。最后将距离保存在object上。

public class NetworkUtils {

public static String getJSONFromAPI (String url){
    String output = "";
        try {
            URL apiEnd = new URL(url);
            int responseCode;
            HttpURLConnection connection;
            InputStream is;

            connection = (HttpURLConnection) apiEnd.openConnection();
            connection.setRequestMethod("GET");
            connection.setReadTimeout(15000);
            connection.setConnectTimeout(15000);
            connection.connect();

            responseCode = connection.getResponseCode();
            if(responseCode < HttpURLConnection.HTTP_BAD_REQUEST){
                is = connection.getInputStream();
            }else {
                is = connection.getErrorStream();
            }

            output = convertISToString(is);
            is.close();
            connection.disconnect();

        }  catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (ProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }


    return output;
}

private static String convertISToString(InputStream is){
    StringBuffer buffer = new StringBuffer();

    try {

        BufferedReader br;
        String row;

        br = new BufferedReader(new InputStreamReader(is));
        while ((row = br.readLine())!= null){
            buffer.append(row);
        }
        br.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return buffer.toString();
}
}

这个类负责连接到服务器并从 url 中获取数据。

关于java - 如何在 Android Studio 中实现 Google Distance/Matrix Api?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56176753/

相关文章:

java - 从内存中的 XML 创建 Spring ApplicationContext

javascript - 在没有 URL 的应用程序中使用 Google Map V3 API ClientID

javascript - Duration_in_traffic 小于 google Distance Matrix API 中的持续时间

javascript - 谷歌地图 :turning the GPolyline cursor to pointer

reactjs - 如何使用 @react-google-maps/api 在 ReactJS 中使用距离矩阵 API?

java - Play 框架未编译

java - 使用 vtd-xml 加载巨大的 4Gb XML 文件

java - 创建子类时父类(super class)打印意外值

javascript - Sencha Touch - Map.Geo = null