Reputation: 4408
I want to show turn by turn directions between two locations. I tried
uri = "http://maps.google.com/maps?saddr="
+ "lat1" + ","
+ "lon1" + "&daddr="
+ "lat2" + "," + "long2";
Intent intent = new Intent(android.content.Intent.ACTION_VIEW,
Uri.parse(uri));
It gives the route. But i dont want to open a browser and show. Instead is there a way to get the route so that it can be displayed in my own layout. For ex in text views.
Upvotes: 0
Views: 4539
Reputation: 7532
These code i wrote in my graduation project so they're not optimized.
MapService class: I parser data response from google map.
public class MapService {
public static final String TAG = "[MapService]";
public static final String GET_DIRECTION_URL = "http://maps.google.com/maps/api/directions/json?" + "origin=%f,%f" + "&destination=%f,%f" + "&sensor=true&language=en&units=metric";
public static DirectionResult getDirectionResult(double latitude1, double longtitude1, double latitude2, double longtitude2) {
String url = String.format(GET_DIRECTION_URL, latitude1, longtitude1, latitude2, longtitude2);
Log.d("URL", url);
// parse direction
DirectionParser directionParser = new DirectionParser() {
@Override
public void onSuccess(JSONObject json) throws JSONException {
// process response status
String status = json.getString("status");
if (!status.equals("OK")) {
String error = null;
if (status.equals("NOT_FOUND") || status.equals("ZERO_RESULTS")) {
error = Global.application.getString(R.string.errCantGetDirection);
} else {
error = Global.application.getString(R.string.errGetDirection);
}
result.instructions = new String[] { error };
result.hasError = true;
return;
}
/*
* routes[] legs[] steps[] html_instructions
*/
JSONArray arrRoutes = json.getJSONArray("routes");
// no routes found
if (arrRoutes.length() == 0) {
result.instructions = new String[] { Global.application.getString(R.string.errCantGetDirection) };
result.hasError = true;
return;
}
JSONArray arrLegs = arrRoutes.getJSONObject(0).getJSONArray("legs");
JSONObject firstLeg = arrLegs.getJSONObject(0);
JSONArray arrSteps = firstLeg.getJSONArray("steps");
int len = arrSteps.length();
result.instructions = new String[len];
result.points = new LinkedList<GeoPoint>();
JSONObject leg = null;
// get instructions
for (int i = 0; i < len; ++i) {
leg = arrSteps.getJSONObject(i);
// location = leg.getJSONObject("start_location");
String encoded = leg.getJSONObject("polyline").getString("points");
result.points.addAll(decodePoly(encoded));
result.instructions[i] = Html.fromHtml(leg.getString("html_instructions")).toString();
Log.d("html_instructions", "" + Html.fromHtml(leg.getString("html_instructions")));
// result.points[i] = new GeoPoint(
// (int) (location.getDouble("lat") * 1E6),
// (int) (location.getDouble("lng") * 1E6));
}
// location = leg.getJSONObject("end_location");
// result.points[len] = new GeoPoint(
// (int) (location.getDouble("lat") * 1E6),
// (int) (location.getDouble("lng") * 1E6));
// distance and duration info
JSONObject distance = firstLeg.getJSONObject("distance");
if (distance != null) {
result.distance = distance.getString("text");
}
JSONObject duration = firstLeg.getJSONObject("duration");
if (duration != null) {
result.duration = duration.getString("text");
}
}
@Override
public void onFailure(String message) {
String error = "Error";
result.instructions = new String[] { error };
result.hasError = true;
}
};
// return direction result
RestClient.getData(url, directionParser);
return directionParser.result;
}
private static List<GeoPoint> decodePoly(String encoded) {
List<GeoPoint> poly = new ArrayList<GeoPoint>();
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;
GeoPoint p = new GeoPoint((int) (((double) lat / 1E5) * 1E6), (int) (((double) lng / 1E5) * 1E6));
poly.add(p);
}
return poly;
}
}
Direction parser and direction result
public class DirectionParser extends JSONParser {
public DirectionResult result = new DirectionResult();
protected int jsonType = JSONParser.GOOGLE_DIRECTION_JSON;
public DirectionParser() {
jsonType = JSONParser.GOOGLE_DIRECTION_JSON;
}
@Override
public void onFailure(String message) {
}
@Override
public void onSuccess(JSONObject json) throws JSONException {
}
}
public class DirectionResult {
public String[] instructions;
public List<GeoPoint> points;
public String duration;
public String distance;
public boolean hasError = false;
}
What you want is the instruction of DirectionResult. You can simple create an array adapter with string array
instructions = directionResult.instructions;// DirectionResult you got from MapService.
ArrayAdapter<String> adapter1 = new ArrayAdapter<String>(DirectionListActivity.this, android.R.layout.simple_list_item_1, instructions);
listDirection.setAdapter(adapter1);
Update: Another parser i found Google-Maps-Directions-API-Java-Parser
Upvotes: 2
Reputation: 11006
Check out GreatMaps. They have logic for retrieving routes. Its C# based, just use their logic and write the equivalent in Java.
http://greatmaps.codeplex.com/
Upvotes: 0