Derrick Peh
Derrick Peh

Reputation: 309

Unable to get distance from Google Distance Matrix API

I have a method which makes use of google distance API to calculate the distance between 2 postal code. I am somehow unable to get the distance and am catching the error in my try catch. Is anyone able to figure out what is wrong with the code? Tested the values by putting the URL in the browser and it is able to display results. I believe obj.getJSONArray is giving me size of 0 which is where the error lies.

 protected Double doInBackground(String pincode_1, String pincode_2) {
   this.pincode_1 = pincode_1;
    this.pincode_2 = pincode_2;

    try {
        String key = "my api key inserted here";
        String s = String.format("https://maps.googleapis.com/maps/api/distancematrix/json?units=metric&origins=%s&destinations=%s&key=%s", pincode_1, pincode_2, key);
        URL url = new URL(s);
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
        urlConnection.setRequestMethod("GET");
        urlConnection.connect();
        int statusCode = urlConnection.getResponseCode();
        if (statusCode == HttpURLConnection.HTTP_OK) {
            Scanner sc = new Scanner(urlConnection.getInputStream());
            StringBuilder sb = new StringBuilder();
            while (sc.hasNext())
                sb.append(sc.next());
            String json = sb.toString();
            JSONObject obj = new JSONObject(json);
            double distance = obj.getJSONArray("rows").getJSONObject(0).getJSONArray("elements").getJSONObject(0).getJSONObject("distance").getDouble("value");
            urlConnection.disconnect();
            sc.close();
            return distance;
        }
    } catch (Exception e) {
           Log.e("DistanceError", "Error " +Log.getStackTraceString(e));
        return null;
    }
    return null;
}

Error Message

11-01 14:55:35.528 16725-16725/com.example.utsav.edufind E/DistanceError: Error android.os.NetworkOnMainThreadException
                                                                          at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1303)
                                                                          at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:86)
                                                                          at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:74)
                                                                          at java.net.InetAddress.getAllByName(InetAddress.java:752)
                                                                          at com.android.okhttp.internal.Network$1.resolveInetAddresses(Network.java:29)
                                                                          at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:187)
                                                                          at com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:156)
                                                                          at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:98)
                                                                          at com.android.okhttp.internal.http.HttpEngine.createNextConnection(HttpEngine.java:345)
                                                                          at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:328)
                                                                          at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:246)
                                                                          at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:457)
                                                                          at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:126)
                                                                          at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.connect(DelegatingHttpsURLConnection.java:89)
                                                                          at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java)
                                                                          at controller.DistanceCalculator.doInBackground(DistanceCalculator.java:39)
                                                                          at controller.SearchController.search(SearchController.java:98)
                                                                          at boundary.SearchResultsUI.initializeData(SearchResultsUI.java:222)
                                                                          at boundary.SearchResultsUI.onCreate(SearchResultsUI.java:119)
                                                                          at android.app.Activity.performCreate(Activity.java:6679)
                                                                          at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
                                                                          at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2618)
                                                                          at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)
                                                                          at android.app.ActivityThread.-wrap12(ActivityThread.java)
                                                                          at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)
                                                                          at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                          at android.os.Looper.loop(Looper.java:154)
                                                                          at android.app.ActivityThread.main(ActivityThread.java:6119)
                                                                          at java.lang.reflect.Method.invoke(Native Method)
                                                                          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                                                                          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

Update After i added the 2 lines of codes i have this message error

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy);

  11-01 15:06:38.620 22216-22216/com.example.utsav.edufind E/DistanceError: Error org.json.JSONException: Index 0 out of range [0..0)
                                                                              at org.json.JSONArray.get(JSONArray.java:293)
                                                                              at org.json.JSONArray.getJSONObject(JSONArray.java:521)
                                                                              at controller.DistanceCalculator.doInBackground(DistanceCalculator.java:48)
                                                                              at controller.SearchController.search(SearchController.java:98)
                                                                              at boundary.SearchResultsUI.initializeData(SearchResultsUI.java:225)
                                                                              at boundary.SearchResultsUI.onCreate(SearchResultsUI.java:122)
                                                                              at android.app.Activity.performCreate(Activity.java:6679)
                                                                              at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
                                                                              at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2618)
                                                                              at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)
                                                                              at android.app.ActivityThread.-wrap12(ActivityThread.java)
                                                                              at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)
                                                                              at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                              at android.os.Looper.loop(Looper.java:154)
                                                                              at android.app.ActivityThread.main(ActivityThread.java:6119)
                                                                              at java.lang.reflect.Method.invoke(Native Method)
                                                                              at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                                                                              at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

Upvotes: 0

Views: 502

Answers (1)

Daniel
Daniel

Reputation: 56

You need to create a class that extends AsyncTask, something like:

private class GetDistance extends AsyncTask<String, Void, String> {
    @Override
    protected String doInBackground(String pincode_1, String pincode_2) {
    this.pincode_1 = pincode_1;
    this.pincode_2 = pincode_2;

    try {
    String key = "my api key inserted here";
    String s = String.format("https://maps.googleapis.com/maps/api/distancematrix/json?units=metric&origins=%s&destinations=%s&key=%s", pincode_1, pincode_2, key);
    URL url = new URL(s);
    HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
    urlConnection.setRequestMethod("GET");
    urlConnection.connect();
    int statusCode = urlConnection.getResponseCode();
    if (statusCode == HttpURLConnection.HTTP_OK) {
        Scanner sc = new Scanner(urlConnection.getInputStream());
        StringBuilder sb = new StringBuilder();
        while (sc.hasNext())
            sb.append(sc.next());
        String json = sb.toString();
        JSONObject obj = new JSONObject(json);
        double distance = obj.getJSONArray("rows").getJSONObject(0).getJSONArray("elements").getJSONObject(0).getJSONObject("distance").getDouble("value");
          urlConnection.disconnect();
          sc.close();
          return distance;
         }
        } catch (Exception e) {
        Log.e("DistanceError", "Error " +Log.getStackTraceString(e));
        return null;
       }
      return null;
      }
      @Override
        protected void onPostExecute(String result) {
        //do what you want with the distance on the main thread
       }
  }
}

Once you've moved your method into this class you can instantiate it and call execute. This should at the very least take care of your NetworkOnMainThreadException.

Upvotes: 1

Related Questions