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
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 .
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; }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With