Android(Java)中配置Google Maps Distance Matrix API及依赖添加方法
嘿,我来帮你解决这个问题!其实Google Distance Matrix API是一个RESTful Web服务,你不需要专门的Android专属依赖包,不过有两种常用的集成方式,我给你一步步拆解:
方法一:使用官方Google Maps Services Java客户端(简化调用)
这个官方客户端已经封装了API的调用逻辑,不用自己拼URL和解析复杂的JSON,用起来更省心。
- 首先在你的Module级别的app/build.gradle文件中添加依赖:
dependencies { // Google Maps Services Java客户端 implementation 'com.google.maps:google-maps-services:2.2.0' // 客户端需要SLF4J日志支持,添加Android版的日志依赖 implementation 'org.slf4j:slf4j-android:1.7.36' }
- 在代码中调用API(注意:必须在后台线程执行,不能在主线程,否则会触发NetworkOnMainThreadException):
// 初始化API上下文,传入你的密钥 GeoApiContext apiContext = new GeoApiContext.Builder() .apiKey("你的Google Distance Matrix API密钥") .build(); // 启动后台任务调用API(这里用ExecutorService举例,替代已废弃的AsyncTask) ExecutorService executor = Executors.newSingleThreadExecutor(); executor.execute(() -> { try { // 调用Distance Matrix API,传入起点和终点坐标 DistanceMatrix result = DistanceMatrixApi.getDistanceMatrix( apiContext, new String[]{"40.712776,-74.005974"}, // 起点坐标(纬度,经度) new String[]{"34.052235,-118.243683"} // 终点坐标 ).await(); // 解析返回结果 if (result.rows != null && result.rows.length > 0) { DistanceMatrixRow row = result.rows[0]; if (row.elements != null && row.elements.length > 0) { DistanceMatrixElement element = row.elements[0]; String readableDistance = element.distance.humanReadable; // 比如"3,945 km" long distanceInMeters = element.distance.inMeters; // 米为单位的距离值 // 回到主线程更新UI(如果需要的话) runOnUiThread(() -> { // 在这里把结果显示到你的UI组件上,比如TextView // distanceTextView.setText(readableDistance); }); } } } catch (Exception e) { e.printStackTrace(); // 处理错误:比如网络异常、密钥无效、API未启用等 } finally { // 记得关闭API上下文,释放资源 apiContext.shutdown(); executor.shutdown(); } });
方法二:用OkHttp手动发送HTTP请求(轻量灵活)
如果你不想引入额外的Google客户端库,用普通的HTTP请求库直接调用REST接口也是完全可行的,这种方式更轻量,适合需求简单的场景。
- 先在Module级别的app/build.gradle中添加OkHttp依赖:
dependencies { implementation 'com.squareup.okhttp3:okhttp:4.12.0' }
- 构建请求并发送(同样要在后台线程执行):
OkHttpClient okHttpClient = new OkHttpClient(); // 替换成你的起点、终点和API密钥 String origin = "40.712776,-74.005974"; String destination = "34.052235,-118.243683"; String apiKey = "你的Google Distance Matrix API密钥"; // 构建API请求URL String requestUrl = "https://maps.googleapis.com/maps/api/distancematrix/json" + "?origins=" + origin + "&destinations=" + destination + "&key=" + apiKey; Request request = new Request.Builder() .url(requestUrl) .build(); // 异步发送请求 okHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(@NonNull Call call, @NonNull IOException e) { e.printStackTrace(); // 请求失败的处理逻辑:比如提示用户网络问题 } @Override public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException { if (response.isSuccessful() && response.body() != null) { String jsonResponse = response.body().string(); // 手动解析JSON结果(用Android自带的JSONObject) try { JSONObject root = new JSONObject(jsonResponse); JSONArray rows = root.getJSONArray("rows"); JSONObject firstRow = rows.getJSONObject(0); JSONArray elements = firstRow.getJSONArray("elements"); JSONObject firstElement = elements.getJSONObject(0); JSONObject distanceObj = firstElement.getJSONObject("distance"); String readableDistance = distanceObj.getString("text"); long distanceInMeters = distanceObj.getLong("value"); // 回到主线程更新UI runOnUiThread(() -> { // 在这里更新你的UI }); } catch (JSONException e) { e.printStackTrace(); // JSON解析错误的处理 } } } });
几个重要的注意事项
- API密钥配置:确保你在Google Cloud Console中已经启用了Distance Matrix API,并且给密钥设置了合理的限制(比如绑定你的Android应用的SHA-1指纹和包名),防止密钥被滥用。
- 网络权限:别忘了在
AndroidManifest.xml中添加网络权限:
<uses-permission android:name="android.permission.INTERNET" />
- 主线程限制:所有网络请求必须在后台线程执行,Android不允许在主线程进行网络操作,否则会抛出异常。
内容的提问来源于stack exchange,提问作者Vizard
相关产品推荐
相关产品推荐

