Service not available in geoCoder

I can get longitude and latitude, but I get the address, I got an error.

public boolean onTouchEvent (MotionEvent event, MapView mapView)

{

if(event.getAction()==0) { GeoPoint p = mapView.getProjection().fromPixels( (int) event.getX(), (int) event.getY()); Geocoder geoCoder=new Geocoder(getBaseContext(),Locale.getDefault()); try { List<Address> address = geoCoder.getFromLocation( p.getLatitudeE6() / 1E6, p.getLongitudeE6() / 1E6, 1); String add=""; if(address.size()>0) { for (int i=0; i<address.get(0).getMaxAddressLineIndex();i++) add += address.get(0).getAddressLine(i) + "\n"; } Toast.makeText(getBaseContext(), add, Toast.LENGTH_SHORT).show(); } catch (IOException e) { e.printStackTrace(); } return true; } return false; 

}

My Logcat →

 02-14 12:27:35.717: WARN/System.err(452): java.io.IOException: Service not Available 02-14 12:27:35.727: WARN/System.err(452): at android.location.Geocoder.getFromLocation(Geocoder.java:117) 02-14 12:27:35.727: WARN/System.err(452): at com.parkhya.SecondGps.MainActivity$MapOverlay.onTouchEvent(MainActivity.java:47) 02-14 12:27:35.745: WARN/System.err(452): at com.google.android.maps.OverlayBundle.onTouchEvent(OverlayBundle.java:63) 02-14 12:27:35.745: WARN/System.err(452): at com.google.android.maps.MapView.onTouchEvent(MapView.java:643) 02-14 12:27:35.757: WARN/System.err(452): at android.view.View.dispatchTouchEvent(View.java:3766) 02-14 12:27:35.757: WARN/System.err(452): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:897) 02-14 12:27:35.757: WARN/System.err(452): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863) 02-14 12:27:35.767: WARN/System.err(452): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863) 02-14 12:27:35.767: WARN/System.err(452): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863) 02-14 12:27:35.777: WARN/System.err(452): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863) 02-14 12:27:35.777: WARN/System.err(452): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1671) 02-14 12:27:35.777: WARN/System.err(452): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107) 02-14 12:27:35.777: WARN/System.err(452): at android.app.Activity.dispatchTouchEvent(Activity.java:2086) 02-14 12:27:35.786: WARN/System.err(452): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1655) 02-14 12:27:35.786: WARN/System.err(452): at android.view.ViewRoot.handleMessage(ViewRoot.java:1785) 02-14 12:27:35.796: WARN/System.err(452): at android.os.Handler.dispatchMessage(Handler.java:99) 02-14 12:27:35.796: WARN/System.err(452): at android.os.Looper.loop(Looper.java:123) 02-14 12:27:35.796: WARN/System.err(452): at android.app.ActivityThread.main(ActivityThread.java:4627) 02-14 12:27:35.806: WARN/System.err(452): at java.lang.reflect.Method.invokeNative(Native Method) 02-14 12:27:35.816: WARN/System.err(452): at java.lang.reflect.Method.invoke(Method.java:521) 02-14 12:27:35.816: WARN/System.err(452): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 02-14 12:27:35.825: WARN/System.err(452): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 02-14 12:27:35.837: WARN/System.err(452): at dalvik.system.NativeStart.main(Native Method) 
+9
android gps
Feb 14 2018-12-12T00:
source share
3 answers

Here is my way to get the address, even if Geocoder failed ... but first let me explain my own experience with Geocoder:

For some unknown reason, Geocoder works great, it suddenly breaks! .

I noticed that after a while ( maybe days ), Geocoder starts throwing "Service is not available . "

EDIT -> As Christian mentioned, an exception is thrown, even isPresent () returns true. <- EDIT END

Really strange, since it worked fine until and the configuration change did not change:

  • same device
  • same version of android
  • same application
  • same manifest
  • WIFI works, device location function is enabled in settings

Of course, something has changed, but so far we do not know for sure. An error has been reported about this: Problem 38009: 4.1.1 Geocoding metadata exception: IOException: service is not available

Last post in this thread (ATTOW) "This may be intermittently played in android 4.0.x + target API x"

As a workaround, you can use Google Map

Here is my GeocoderHelper class that provides a Google Maps plan in case the geocoder crashes. In my case, I'm just interested in CityName, but you can basically get any data available on the Google map JSON output

Using:

new GeocoderHelper (). fetchCityName (context, location); Then do somthing in onPostExecute () of the sample code (send the broadcast, call the listener method, set the text to textView, whatever)

GeocoderHelper Class:

 package com.<your_package>.location; import java.util.List; import java.util.Locale; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.BasicResponseHandler; import org.json.JSONArray; import org.json.JSONObject; import android.content.Context; import android.location.Address; import android.location.Geocoder; import android.location.Location; import android.net.http.AndroidHttpClient; import android.os.AsyncTask; import android.util.Log; public class GeocoderHelper { private static final AndroidHttpClient ANDROID_HTTP_CLIENT = AndroidHttpClient.newInstance(GeocoderHelper.class.getName()); private boolean running = false; public void fetchCityName(final Context contex, final Location location) { if (running) return; new AsyncTask<Void, Void, String>() { protected void onPreExecute() { running = true; }; @Override protected String doInBackground(Void... params) { String cityName = null; if (Geocoder.isPresent()) { try { Geocoder geocoder = new Geocoder(contex, Locale.getDefault()); List<Address> addresses = geocoder.getFromLocation(location.getLatitude(), location.getLongitude(), 1); if (addresses.size() > 0) { cityName = addresses.get(0).getLocality(); } } catch (Exception ignored) { // after a while, Geocoder start to trhow "Service not availalbe" exception. really weird since it was working before (same device, same Android version etc.. } } if (cityName != null) // ie, Geocoder succeed { return cityName; } else // ie, Geocoder failed { return fetchCityNameUsingGoogleMap(); } } // Geocoder failed :-( // Our B Plan : Google Map private String fetchCityNameUsingGoogleMap() { String googleMapUrl = "http://maps.googleapis.com/maps/api/geocode/json?latlng=" + location.getLatitude() + "," + location.getLongitude() + "&sensor=false&language=fr"; try { JSONObject googleMapResponse = new JSONObject(ANDROID_HTTP_CLIENT.execute(new HttpGet(googleMapUrl), new BasicResponseHandler())); // many nested loops.. not great -> use expression instead // loop among all results JSONArray results = (JSONArray) googleMapResponse.get("results"); for (int i = 0; i < results.length(); i++) { // loop among all addresses within this result JSONObject result = results.getJSONObject(i); if (result.has("address_components")) { JSONArray addressComponents = result.getJSONArray("address_components"); // loop among all address component to find a 'locality' or 'sublocality' for (int j = 0; j < addressComponents.length(); j++) { JSONObject addressComponent = addressComponents.getJSONObject(j); if (result.has("types")) { JSONArray types = addressComponent.getJSONArray("types"); // search for locality and sublocality String cityName = null; for (int k = 0; k < types.length(); k++) { if ("locality".equals(types.getString(k)) && cityName == null) { if (addressComponent.has("long_name")) { cityName = addressComponent.getString("long_name"); } else if (addressComponent.has("short_name")) { cityName = addressComponent.getString("short_name"); } } if ("sublocality".equals(types.getString(k))) { if (addressComponent.has("long_name")) { cityName = addressComponent.getString("long_name"); } else if (addressComponent.has("short_name")) { cityName = addressComponent.getString("short_name"); } } } if (cityName != null) { return cityName; } } } } } } catch (Exception ignored) { ignored.printStackTrace(); } return null; } protected void onPostExecute(String cityName) { running = false; if (cityName != null) { // Do something with cityName Log.i("GeocoderHelper", cityName); } }; }.execute(); } } 

Hope this helps.

+30
Apr 6 '13 at 16:16
source share

The GeoCoder service may / may not be implemented because it is not part of the core Android infrastructure. Check out the documentation for GeoCoder here

You need to use the Google APIs and parse the address from the json response so that it works on all devices.

Class for processing geocoding and reverse geocoding. Geocoding is the process of converting a street address or other location description into a coordinate (latitude, longitude). Reverse geocoding is the process of converting a coordinate (latitude, longitude) to a (partial) address. The number of details in the reverse geocoded location description may differ, for example, one may contain the full street address of the nearest building, while the other may contain only the city name and zip code. The Geocoder class requires a backend service that is not part of the core Android infrastructure. Geocoder request methods will return an empty list if there is no backend service on the platform. Use the isPresent () method to determine if a Geocoder implementation exists.

+2
Feb 22 2018-12-12T00
source share

The problem is that NetworkLocationService is no longer working.

It is solved only at reboot. (NetworkLocationService loads at boot)

0
Mar 10 '14 at 12:28
source share



All Articles