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

Ren*_*ade 2 java google-maps google-distancematrix-api

我正在编写一个应用程序,可以在路线中计算两个位置。我已经实现了谷歌地点 API 以根据名称或地址获取纬度/经度,但我无法实现距离 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;
    }
Run Code Online (Sandbox Code Playgroud)

GeoApiContext 和 DistanceMatrix 不会在导入时出现。Tks 寻求帮助。

Ren*_*ade 5

回答我的问题...

    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
    }
}
Run Code Online (Sandbox Code Playgroud)

创建了一个 AsyncTask 以使用 especifics 参数从 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;
    }
}

}
Run Code Online (Sandbox Code Playgroud)

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

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();
}
}
Run Code Online (Sandbox Code Playgroud)

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