Услуга недоступна при вызове geoCoder.getFromLocation ()

Я знаю, что иногда серверная служба google может быть недоступна.

Следовательно, решение может быть замкнуто до тех пор, пока я не получу данные.

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) { } } 

Но я не могу получить местоположение вообще:

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 

И, конечно, я добавил все необходимые разрешения:

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

Я пытаюсь это на Samsung Galaxy Note GT-N7000 (версия 4.0.4)

У меня отсутствуют какие-либо настройки? Связанные с устройством или приложением? Или это обычно происходит? Если так, то лучшее решение для решения этого?

Спасибо

Solutions Collecting From Web of "Услуга недоступна при вызове geoCoder.getFromLocation ()"

Фактическая причина, по которой Geocoder не работает, заключается в том, что NetworkLocator был убит в действии. Вероятно, из-за меньшей памяти или, возможно, вы использовали диспетчер задач, чтобы убить все службы?

Я не уверен, но это предположение. Я видел это раньше. В прошлом году я написал механизм повторного подключения для загрузки NetworkLocator.apk и привязки к GeocoderService . Я думаю, что это изменение не слилось с JellyBean, так что эта проблема сохраняется.

Это можно решить только при перезагрузке. ( NetworkLocationService загружается при загрузке)

Изменить: вы не увидите эту проблему в JBP или KK, эта служба перемещается в приложение playstore.

Обходной путь с использованием прямого доступа к картам google:

  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; } 

API будет вызывать исключение «Служебная недоступность», если такая услуга недоступна на устройстве. Используйте метод isPresent() чтобы проверить наличие службы.

См. Также: http://developer.android.com/reference/android/location/Geocoder.html

Лучшее решение этой проблемы – использовать то же, что и класс Google Geocoder, если исходный Geocoder не работает

 List<Address> addresses = null; Geocoder geocoder = new Geocoder(this); addresses = geocoder.getFromLocation(...); if (addresses == null || addresses.isEmpty()) addresses = MyGeocoder.getFromLocation(...); import android.location.Address; import android.util.Log; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.params.AllClientPNames; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.util.EntityUtils; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Locale; public class MyGeocoder { public static List<Address> getFromLocation(double lat, double lng, int maxResult) { String address = String.format(Locale.ENGLISH, "http://maps.googleapis.com/maps/api/geocode/json?latlng=%1$f,%2$f&sensor=false&language=" + Locale.getDefault().getCountry(), lat, lng); HttpGet httpGet = new HttpGet(address); HttpClient client = new DefaultHttpClient(); client.getParams().setParameter(AllClientPNames.USER_AGENT, "Mozilla/5.0 (Java) Gecko/20081007 java-geocoder"); client.getParams().setIntParameter(AllClientPNames.CONNECTION_TIMEOUT, 5 * 1000); client.getParams().setIntParameter(AllClientPNames.SO_TIMEOUT, 25 * 1000); HttpResponse response; List<Address> retList = null; try { response = client.execute(httpGet); HttpEntity entity = response.getEntity(); String json = EntityUtils.toString(entity, "UTF-8"); JSONObject jsonObject = new JSONObject(json); retList = new ArrayList<Address>(); if ("OK".equalsIgnoreCase(jsonObject.getString("status"))) { JSONArray results = jsonObject.getJSONArray("results"); if (results.length() > 0) { for (int i = 0; i < results.length() && i < maxResult; i++) { JSONObject result = results.getJSONObject(i); //Log.e(MyGeocoder.class.getName(), result.toString()); Address addr = new Address(Locale.getDefault()); // addr.setAddressLine(0, result.getString("formatted_address")); JSONArray components = result.getJSONArray("address_components"); String streetNumber = ""; String route = ""; for (int a = 0; a < components.length(); a++) { JSONObject component = components.getJSONObject(a); JSONArray types = component.getJSONArray("types"); for (int j = 0; j < types.length(); j++) { String type = types.getString(j); if (type.equals("locality")) { addr.setLocality(component.getString("long_name")); } else if (type.equals("street_number")) { streetNumber = component.getString("long_name"); } else if (type.equals("route")) { route = component.getString("long_name"); } } } addr.setAddressLine(0, route + " " + streetNumber); addr.setLatitude(result.getJSONObject("geometry").getJSONObject("location").getDouble("lat")); addr.setLongitude(result.getJSONObject("geometry").getJSONObject("location").getDouble("lng")); retList.add(addr); } } } } catch (ClientProtocolException e) { Log.e(MyGeocoder.class.getName(), "Error calling Google geocode webservice.", e); } catch (IOException e) { Log.e(MyGeocoder.class.getName(), "Error calling Google geocode webservice.", e); } catch (JSONException e) { Log.e(MyGeocoder.class.getName(), "Error parsing Google geocode webservice response.", e); } return retList; } } 

Перезагрузите устройство, и оно устранит проблему.

Используйте этот трюк.

Просто отредактируйте project.properties

 # Project target target=Google Inc.:Google APIs:16 

Причина в том, что класс Geocoder присутствует в основной платформе Android, но зависит от кода, предоставленного API Google для правильной работы. Даже если ваш AVD включает API Google, ваш проект по-прежнему должен быть создан против этой конкретной цели сборки.

Сервис недоступен – Geocoder Android, когда я получаю эту ошибку в некоторых приготовленных ромах, я написал эту библиотеку, надеюсь, может быть полезен. https://github.com/dnocode/gapis

Я использую код, который работает (прямой доступ к Google Maps), «слитый» с кодом Geocoder, как показано ниже (обратите особое внимание на «try catch»):

 ... //address is String if (address != null) { new GeocoderTask().execute(address); } ... // An AsyncTask class for accessing the GeoCoding Web Service private class GeocoderTask extends AsyncTask<String, Void, List<Address>> { private LatLng latLng; private MarkerOptions markerOptions; @Override protected List<Address> doInBackground(String... locationName) { // Creating an instance of Geocoder class Geocoder geocoder = new Geocoder(getBaseContext()); List<Address> addresses = null; try { // Getting a maximum of 3 Address that matches the input text addresses = geocoder.getFromLocationName(locationName[0], 3); } catch (IOException e) { e.printStackTrace(); try { addresses = getLocationFromString(locationName[0]); } catch (UnsupportedEncodingException e1) { e1.printStackTrace(); } catch (JSONException e1) { e1.printStackTrace(); } } return addresses; } @Override protected void onPostExecute(List<Address> addresses) { if (addresses == null || addresses.size() == 0) { Toast.makeText(getBaseContext(), "No Location found", Toast.LENGTH_SHORT).show(); return; } // Clears all the existing markers on the map googleMap.clear(); // Adding Markers on Google Map for each matching address for (int i = 0; i < addresses.size(); i++) { Address address = (Address) addresses.get(i); // Creating an instance of GeoPoint, to display in Google Map latLng = new LatLng(address.getLatitude(), address.getLongitude()); String addressText = String.format( "%s, %s", address.getMaxAddressLineIndex() > 0 ? address .getAddressLine(0) : "", address .getCountryName()); markerOptions = new MarkerOptions(); markerOptions.position(latLng); markerOptions.title(addressText); googleMap.addMarker(markerOptions); // Locate the first location if (i == 0) { CameraUpdate center = CameraUpdateFactory.newLatLng(latLng); CameraUpdate zoom = CameraUpdateFactory.zoomTo(13); googleMap.moveCamera(center); googleMap.animateCamera(zoom); } } } } 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; } в ... //address is String if (address != null) { new GeocoderTask().execute(address); } ... // An AsyncTask class for accessing the GeoCoding Web Service private class GeocoderTask extends AsyncTask<String, Void, List<Address>> { private LatLng latLng; private MarkerOptions markerOptions; @Override protected List<Address> doInBackground(String... locationName) { // Creating an instance of Geocoder class Geocoder geocoder = new Geocoder(getBaseContext()); List<Address> addresses = null; try { // Getting a maximum of 3 Address that matches the input text addresses = geocoder.getFromLocationName(locationName[0], 3); } catch (IOException e) { e.printStackTrace(); try { addresses = getLocationFromString(locationName[0]); } catch (UnsupportedEncodingException e1) { e1.printStackTrace(); } catch (JSONException e1) { e1.printStackTrace(); } } return addresses; } @Override protected void onPostExecute(List<Address> addresses) { if (addresses == null || addresses.size() == 0) { Toast.makeText(getBaseContext(), "No Location found", Toast.LENGTH_SHORT).show(); return; } // Clears all the existing markers on the map googleMap.clear(); // Adding Markers on Google Map for each matching address for (int i = 0; i < addresses.size(); i++) { Address address = (Address) addresses.get(i); // Creating an instance of GeoPoint, to display in Google Map latLng = new LatLng(address.getLatitude(), address.getLongitude()); String addressText = String.format( "%s, %s", address.getMaxAddressLineIndex() > 0 ? address .getAddressLine(0) : "", address .getCountryName()); markerOptions = new MarkerOptions(); markerOptions.position(latLng); markerOptions.title(addressText); googleMap.addMarker(markerOptions); // Locate the first location if (i == 0) { CameraUpdate center = CameraUpdateFactory.newLatLng(latLng); CameraUpdate zoom = CameraUpdateFactory.zoomTo(13); googleMap.moveCamera(center); googleMap.animateCamera(zoom); } } } } 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; } 

Это отлично работает для меня, потому что, когда Geocoder не работает, я использую прямой доступ к Google Maps.

Ура!

У меня была такая же ошибка геокодера, но не с примененной выше. Он не будет запускать одно из моих Android-устройств. Затем я вспомнил, что я случайно убил какое-то бегство. Решение заключалось в том, чтобы вынуть батарею на несколько секунд и переустановить ее. И он работал без изменения кода :))

Некоторые устройства не имеют поддержки для Geocoder, поэтому вам нужно создать собственный геокодер.

В основном вам нужно создать асинхронную задачу для запроса google для адреса и обработать ответ json.

Используя aquery, я делаю что-то вроде этого:

 public void asyncJson(String address){ address = address.replace(" ", "+"); String url = "http://maps.googleapis.com/maps/api/geocode/json?address="+ address +"&sensor=true"; aq.ajax(url, JSONObject.class, new AjaxCallback<JSONObject>() { @Override public void callback(String url, JSONObject json, AjaxStatus status) { if(json != null){ //here you work with the response json JSONArray results = json.getJSONArray("results"); Toast.makeText(context, results.getJSONObject(1).getString("formatted_address")); }else{ //ajax error, show error code Toast.makeText(aq.getContext(), "Error:" + status.getCode(), Toast.LENGTH_LONG).show(); } } }); } 

Для следующей строки

 Geocoder gCoder = new Geocoder(context, Locale.getDefault()); 

Используйте Context своей деятельности и не используйте getApplicationContext()

Устройство перезагрузки решит проблему

У меня была такая же ошибка, добавьте ниже разрешения для ее устранения.

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