您的问题标题比您的要求更加通用,因此我会以一种我认为有益于查看此问题的人并希望以不同的方式满足您的要求来回答。
如果您还没有在地图上显示方向,并且已经完成了显示地图上的方向的操作(这可能类似于OP正在进行的操作),则使用Intent
更容易且更标准。
这将启动一个地图路径规划活动(通过单独的应用程序 - 启动的应用程序取决于用户的兼容应用程序,默认情况下是Google Maps),该活动通过道路绘制从起点地址(String originAddress
)到目的地地址(String destinationAddress
)的方向:
String uriPath = "https://www.google.com/maps/dir/";
String uriParams =
"?api=1" +
"&origin=" + originAddress.replace(" ", "+")
.replace(",", "") +
"&destination=" + destinationAddress.replace(" ", "+")
.replace(",", "") +
"&travelmode=driving";
Uri queryURI = Uri.parse(uriPath + uriParams);
Intent intent = new Intent(Intent.ACTION_VIEW, queryURI);
startActivity(activity, intent, null);
(其中activity
只是当前活动的Activity
,可以通过当前编程上下文中适当的方式获取。)
以下代码从LatLng
对象获取一个地址String
(然后必须对URI查询String
进行处理,如上所述):
private void getAddressFromLocation(
final StringBuilder address, final LatLng latlng) {
String uriPath =
"https://maps.googleapis.com/maps/api/geocode/json";
String uriParams =
"?latlng=" + String.format("%f,%f",
latlng.latitude, latlng.longitude) +
"&key=" + GOOGLE_MAPS_WEB_API_KEY;
String uriString = uriPath + uriParams;
RequestFuture<JSONObject> future = RequestFuture.newFuture();
JSONObject response = null;
Map<String, String> jsonParams = new HashMap<String, String>();
JsonObjectRequest request =
new JsonObjectRequest(Request.Method.POST,
uriString,
new JSONObject(jsonParams),
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
if (response != null) {
String resultString =
response.getJSONArray("results")
.getJSONObject(0)
.getString("formatted_address");
address.append(resultString);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e(LOG_TAG, "Error occurred ", error);
}
});
VolleyRequestQueue.getInstance(activity)
.addToRequestQueue(request);
}
这个请求是异步的,但
它可以变成同步的。你需要在传递给
address
的实际参数上调用
toString()
以获得
originAddress
。