Retrofit 2, Jackson parser and google map distancematrix api
The Android code in this post uses Retrofit 2 for consuming the google map distancematrix api and parses the response by Jackson parser.
Calls the google map api such as this
http://maps.googleapis.com/maps/api/distancematrix/json?destinations=Atlanta,GA|New+York,NY&origins=Orlando,FL&units=imperial
Turns the response such as this into java object.
{"destination_addresses":["Washington, DC, USA","New York, NY, USA","Los Angeles, CA, USA"],"origin_addresses":["Miami, FL, USA"],"rows":[{"elements":[{"distance":{"text":"1,053 mi","value":1693921},"duration":{"text":"14 hours 56 mins","value":53781},"status":"OK"},{"distance":{"text":"1,277 mi","value":2054642},"duration":{"text":"18 hours 24 mins","value":66219},"status":"OK"},{"distance":{"text":"2,733 mi","value":4397976},"duration":{"text":"1 day 14 hours","value":138230},"status":"OK"}]}],"status":"OK"}
The Code
gradle dependencies
compile 'com.fasterxml.jackson.core:jackson-databind:2.8.5' compile 'com.fasterxml.jackson.core:jackson-core:2.8.5' compile 'com.fasterxml.jackson.core:jackson-annotations:2.8.5' compile 'com.squareup.retrofit2:retrofit:2.2.0' compile 'com.squareup.retrofit2:converter-jackson:2.2.0' compile 'com.squareup.okhttp3:logging-interceptor:3.6.0'
manifest.xml uses-permission
Models
Distance.java
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Distance {
@JsonProperty("text")
private String text;
@JsonProperty("value")
private Integer value;
@JsonProperty("text")
public String getText() {
return text;
}
@JsonProperty("value")
public Integer getValue() {
return value;
}
}
Duration.java
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Duration {
@JsonProperty("text")
private String text;
@JsonProperty("value")
private Integer value;
@JsonProperty("text")
public String getText() {
return text;
}
@JsonProperty("value")
public Integer getValue() {
return value;
}
}
Element.java
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Element {
@JsonProperty("distance")
private Distance distance;
@JsonProperty("duration")
private Duration duration;
@JsonProperty("status")
private String status;
@JsonProperty("distance")
public Distance getDistance() {
return distance;
}
@JsonProperty("duration")
public Duration getDuration() {
return duration;
}
@JsonProperty("status")
public String getStatus() {
return status;
}
}
Row.java
import java.util.List;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Row {
@JsonProperty("elements")
private List elements = null;
@JsonProperty("elements")
public List getElements() {
return elements;
}
}
DistanceResponse.java
import java.util.List;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
@JsonInclude(JsonInclude.Include.NON_NULL)
public class DistanceResponse {
@JsonProperty("destination_addresses")
private List destinationAddresses = null;
@JsonProperty("origin_addresses")
private List originAddresses = null;
@JsonProperty("rows")
private List rows = null;
@JsonProperty("status")
private String status;
@JsonProperty("destination_addresses")
public List getDestinationAddresses() {
return destinationAddresses;
}
@JsonProperty("origin_addresses")
public List getOriginAddresses() {
return originAddresses;
}
@JsonProperty("rows")
public List getRows() {
return rows;
}
@JsonProperty("status")
public String getStatus() {
return status;
}
}
The core code that does the job
DistanceApiClient.java
import java.util.Map;
import retrofit2.Call;
import retrofit2.Retrofit;
import retrofit2.converter.jackson.JacksonConverterFactory;
import retrofit2.http.GET;
import retrofit2.http.Query;
import retrofit2.http.QueryMap;
import retrofit2.http.Url;
// http://maps.googleapis.com/maps/api/distancematrix/json?destinations=Atlanta,GA|New+York,NY&origins=Orlando,FL&units=imperial
public interface DistanceApiClient {
@GET("maps/api/distancematrix/json")
Call getDistanceInfo(
@QueryMap Map parameters
);
}
RestUtil.java
import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.converter.jackson.JacksonConverterFactory;
public class RestUtil {
private static RestUtil self;
private String API_BASE_URL = "http://maps.googleapis.com/";
private Retrofit retrofit;
private RestUtil() {
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient httpClient = new OkHttpClient.Builder().addInterceptor(interceptor).build();
Retrofit.Builder builder =
new Retrofit.Builder()
.baseUrl(API_BASE_URL)
.addConverterFactory(JacksonConverterFactory.create());
retrofit = builder.client(httpClient).build();
}
public static RestUtil getInstance() {
if (self == null) {
synchronized(RestUtil.class) {
if (self == null) {
self = new RestUtil();
}
}
}
return self;
}
public Retrofit getRetrofit() {
return retrofit;
}
}
activity_main.xml
MainActivity.java
public class MainActivity extends AppCompatActivity {
private TextView tvTravelInfo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvTravelInfo = (TextView) findViewById(R.id.tv_travel_info);
Log.d("MainActivity", "current coordinate: " + getCurrentCoordinate());
getDistanceInfo();
}
private Location getCurrentLocation() {
int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION);
if (permissionCheck != PackageManager.PERMISSION_GRANTED) return null;
LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
return location;
}
private String getCurrentCoordinate() {
Location location = getCurrentLocation();
if (location == null) return "";
return location.getLatitude() + "," + location.getLongitude();
}
private void getDistanceInfo() {
// http://maps.googleapis.com/maps/api/distancematrix/json?destinations=Atlanta,GA|New+York,NY&origins=Orlando,FL&units=imperial
Map mapQuery = new HashMap<>();
mapQuery.put("units", "imperial");
mapQuery.put("origins", getCurrentCoordinate());
mapQuery.put("destinations", "Atlanta,GA|New+York,NY");
DistanceApiClient client = RestUtil.getInstance().getRetrofit().create(DistanceApiClient.class);
Call call = client.getDistanceInfo(mapQuery);
call.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {
if (response.body() != null &&
response.body().getRows() != null &&
response.body().getRows().size() > 0 &&
response.body().getRows().get(0) != null &&
response.body().getRows().get(0).getElements() != null &&
response.body().getRows().get(0).getElements().size() > 0 &&
response.body().getRows().get(0).getElements().get(0) != null &&
response.body().getRows().get(0).getElements().get(0).getDistance() != null &&
response.body().getRows().get(0).getElements().get(0).getDuration() != null) {
Element element = response.body().getRows().get(0).getElements().get(0);
showTravelDistance(element.getDistance().getText() + "\n" + element.getDuration().getText());
}
}
@Override
public void onFailure(Call call, Throwable t) {
}
});
}
private void showTravelDistance(String travelInfo) {
tvTravelInfo.setText(travelInfo);
}
}
Search within Codexpedia
Custom Search
Search the entire web
Custom Search
Related Posts