Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Service not available while calling geoCoder.getFromLocation()

I know sometimes google back-end service might not be available.

Hence a solution might be to loop until i get the data.

private class getLocationDetails extends AsyncTask<String, Void, String> {      @Override     protected String doInBackground(String... params) {          Log.d("looping", "" + count + "");         count++;         double lat = Double.parseDouble(params[0]);         double lng = Double.parseDouble(params[1]);         List<Address> addresses = null;         try {              Geocoder gCoder = new Geocoder(ImageAndLocationActivity.this,                     Locale.getDefault());             addresses = gCoder.getFromLocation(lat, lng, 1);             Address addr = addresses.get(0);             user_country = addr.getCountryName();             user_city = addr.getLocality();             user_district = addr.getSubAdminArea();              if (user_city == null) {                  user_city = user_district;             }         } catch (Exception e) {              Log.e("Exception in getLocationDetails - ", e.getMessage());             return null;         }          return "";     }      @Override     protected void onPostExecute(String result) {          if (result != null) {              Log.d("user_city = ", "" + user_city);         } else {              new getLocationDetails().execute(CurrentLat + "", CurrentLng                     + "");         }     }      @Override     protected void onPreExecute() {      }      @Override     protected void onProgressUpdate(Void... values) {      } } 

But i am not able to get the location at all:

LogCat:

02-27 16:29:49.568: D/looping(10966): 110355 02-27 16:29:49.568: E/Exception in getLocationDetails -(10966): Service not Available 02-27 16:29:49.573: D/looping(10966): 110356 02-27 16:29:49.573: E/Exception in getLocationDetails -(10966): Service not Available 02-27 16:29:49.573: D/looping(10966): 110357 02-27 16:29:49.573: E/Exception in getLocationDetails -(10966): Service not Available 

and ofcourse i have added all the needed permissions:

<uses-permission android:name="android.permission.INTERNET" /> 

I am trying this on Samsung Galaxy Note GT-N7000 (4.0.4 version)

Am i missing any settings? related to device or application ? Or this usually happens? If so any better solution to resolve this??

Thank You

like image 741
Archie.bpgc Avatar asked Feb 27 '13 11:02

Archie.bpgc


2 Answers

The actual reason why Geocoder was not working is because the NetworkLocator was killed in action. Probably due to less memory or maybe you used the Task Manager to kill all services?

I'm not sure but this is a guess. I've seen this before. Last year I wrote a reconnect mechanism to load the NetworkLocator.apk and bind to the GeocoderService. I think this change has not merged into JellyBean so this problem persists.

It can be only solved by reboot. (The NetworkLocationService is loaded at boot)

Edit: You won't see this problem in JBP or KK, this service is moved into the playstore app .

like image 153
Reno Avatar answered Sep 21 '22 19:09

Reno


Workaround using direct access to google maps:

    public static LatLng getLocationFromString(String address)         throws JSONException {      HttpGet httpGet = new HttpGet(             "http://maps.google.com/maps/api/geocode/json?address="                     + URLEncoder.encode(address, "UTF-8") + "&ka&sensor=false");     HttpClient client = new DefaultHttpClient();     HttpResponse response;     StringBuilder stringBuilder = new StringBuilder();      try {         response = client.execute(httpGet);         HttpEntity entity = response.getEntity();         InputStream stream = entity.getContent();         int b;         while ((b = stream.read()) != -1) {             stringBuilder.append((char) b);         }     } catch (ClientProtocolException e) {     } catch (IOException e) {     }      JSONObject jsonObject = new JSONObject(stringBuilder.toString());      double lng = ((JSONArray) jsonObject.get("results")).getJSONObject(0)             .getJSONObject("geometry").getJSONObject("location")             .getDouble("lng");      double lat = ((JSONArray) jsonObject.get("results")).getJSONObject(0)             .getJSONObject("geometry").getJSONObject("location")             .getDouble("lat");      return new LatLng(lat, lng); }      public static List<Address> getStringFromLocation(double lat, double lng)         throws ClientProtocolException, IOException, JSONException {      String address = String             .format(Locale.ENGLISH,                                 "http://maps.googleapis.com/maps/api/geocode/json?latlng=%1$f,%2$f&sensor=true&language="                             + Locale.getDefault().getCountry(), lat, lng);     HttpGet httpGet = new HttpGet(address);     HttpClient client = new DefaultHttpClient();     HttpResponse response;     StringBuilder stringBuilder = new StringBuilder();      List<Address> retList = null;      response = client.execute(httpGet);     HttpEntity entity = response.getEntity();     InputStream stream = entity.getContent();     int b;     while ((b = stream.read()) != -1) {         stringBuilder.append((char) b);     }      JSONObject jsonObject = new JSONObject(stringBuilder.toString());      retList = new ArrayList<Address>();      if ("OK".equalsIgnoreCase(jsonObject.getString("status"))) {         JSONArray results = jsonObject.getJSONArray("results");         for (int i = 0; i < results.length(); i++) {             JSONObject result = results.getJSONObject(i);             String indiStr = result.getString("formatted_address");             Address addr = new Address(Locale.getDefault());             addr.setAddressLine(0, indiStr);             retList.add(addr);         }     }      return retList; } 
like image 36
Mugen Avatar answered Sep 21 '22 19:09

Mugen