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 Listelements = 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 ListdestinationAddresses = 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") CallgetDistanceInfo( @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 MapmapQuery = 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