Geocoder.getFromLocation throws IOException on Android emulator
android
Solution
This is a know issue with the Emulator. It works fine on an actual device
On 2.2 API 8 you'll receive the following stacktrace
java.io.IOException: Service not Available
at android.location.Geocoder.getFromLocation(Geocoder.java:117)
See here for more info (and a possible workaround) see the following URL :
http://code.google.com/p/android/issues/detail?id=8816
If you're having issues using the GeoCoder on lower APIs you should check the stacktrace. From time to time I'm having the following :
java.io.IOException: Unable to parse response from server
at android.location.Geocoder.getFromLocation(Geocoder.java:124)
This can be anything from a server-side issue at Google, or an issue on the client (internet connection).
If the GeoCoder returns an empty list, you need to check if you have a proper GeoCoder implementation available on the device (emulator or real phone).
This can be done using the isPresent() method on the Geocoder object.
http://developer.android.com/reference/android/location/Geocoder.html
Also, when running on an emulator, make sure your AVD image is setup with the Google APIs.
Problem
Using Android emulator 2.2 api 8 I keep getting IOException ``` 03-05 19:42:11.073: DEBUG/SntpClient(58): request time failed: java.net.SocketException: Address family not supported by protocol 03-05 19:42:15.505: WARN/System.err(1823): java.io.IOException: Service not Available ``` Thats my code: ``` private LocationManager manager = null; LocationListener locationListener = null; double latitude = 0; double longtitude = 0; List<Address> myList = null; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // httpTranslateGet(); try { manager = (LocationManager) this .getSystemService(Context.LOCATION_SERVICE); initLocationListener(); manager.requestLocationUpdates(manager.GPS_PROVIDER, 0, 0, locationListener); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } private void initLocationListener() { locationListener = new LocationListener() { @Override public void onLocationChanged(android.location.Location location) { if (location != null) { latitude = location.getLatitude(); longtitude = location.getLongitude(); try { Geocoder geocoder = new Geocoder(WeatherCastDemo.this, Locale.getDefault()); List<Address> addresses = geocoder.getFromLocation(location.getLatitude(), location.getLongitude(), 1); myList = geocoder.getFromLocation( location.getLatitude(), location.getLongitude(), 10); StringBuilder sb = new StringBuilder(); if (myList.size() > 0) { Address address = myList.get(0); for (int i = 0; i < address .getMaxAddressLineIndex(); i++) sb.append(address.getAddressLine(i)).append( "\n"); sb.append(address.getLocality()).append("\n"); sb.append(address.getPostalCode()).append("\n"); sb.append(address.getCountryName()); } } catch (IOException e) { e.printStackTrace(); } } } @Override public void onProviderDisabled(String arg0) { // TODO Auto-generated method stub } @Override public void onProviderEnabled(String provider) { // TODO Auto-generated method stub } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } }; } ``` anyone has any idea? I have managed to do it with Emulator 2.1 api 7, but then the reverse geocoding always give an empty result. anyone could confirm my code? thanks. thanks, ray.