调用geoCoder.getFromLocation()时服务不可用

我知道有时谷歌后端服务可能无法使用。

因此,一个解决scheme可能会循环,直到我得到的数据。

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" /> 

我正在尝试三星Galaxy Note GT-N7000(4.0.4版本)

我是否缺less任何设置? 与设备或应用程序有关? 或者这通常发生? 如果是的话,任何更好的解决scheme,以解决

谢谢

Geocoder不工作的真正原因是因为NetworkLocator在行动中丧生。 可能由于内存不足,或者你使用任务pipe理器来终止所有服务?

我不确定,但这是一个猜测。 我以前见过这个。 去年我写了一个重新连接机制来加载NetworkLocator.apk并绑定到GeocoderService 。 我觉得这个改变还没有融入到软糖,所以这个问题依然存在。

它只能通过重启来解决。 ( 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将抛出“服务不可用exception”。 使用方法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 

原因在于地理编码器类出现在核心Android框架中,但依赖于由Google API提供的代码才能正常运行。 即使您的AVD包含Google API,您的项目仍需要针对特定​​的构build目标进行构build。

服务不可用 – 地理编码Android当我得到这个错误在一些煮熟的ROM我写这个库,我希望可以是有用的。 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; } 

这对我来说非常好,因为当地理编码器不工作时,我使用直接访问Google地图。

干杯!

我有相同的geocoder错误,但没有上述应用。 它不会运行我的Android设备之一。 然后我想起我已经意外地杀了一些跑步服务。 解决办法是取出电池几秒钟,然后重新安装。 它没有改变代码:))

有些设备没有Geocoder的支持,所以你需要做的是创build你自己的地理编码器。

基本上你需要创build一个asynchronous的任务来请求谷歌的地址和治疗的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()

我也有这个错误的麻烦。 当我最近将我的设备更新为棉花糖时,就发生了这种情况。

如果我重新启动,它会工作一次,但然后将失败,并在此后不工作。

我像其他人一样创build了一个AsyncTask,它只返回json响应第一个结果的地址。

要使用下面的代码,使用你的api键来调用它,并且使用Location对象作为input来执行AsyncTask。 您可以使用以下导入位置。 import android.location.Location; 您将不得不通过LocationManager获取当前位置,请求更新。

  new ReverseGeoCodeTask(GOOGLE_API_KEY).execute(location); 

确保你用你自己的API来replaceAPI密钥,并确保你在谷歌云控制台中启用它。 这就是你pipe理你的特定项目的所有谷歌apis的地方。

将此类作为内部类复制到需要反向地理编码地址的活动中。

 /** * Reverse geocode request - takes a Location in as parameters, * and does a network request in the background to get the first address in * json response. The address is returned in the onPostExecute so you * can update the UI with it */ private class ReverseGeoCodeTask extends AsyncTask<Location, Void, String>{ private final static String GEOCODE_API_ENDPOINT_BASE = "https://maps.googleapis.com/maps/api/geocode/json?latlng="; private final static String JSON_PROPERTY_RESULTS = "results"; private final static String JSON_PROPERTY_FORMATTED_ADDRESS = "formatted_address"; private final static String JSON_PROPERTY_REQUEST_STATUS = "status"; private final static String STATUS_OK = "OK"; private String apiKey; public ReverseGeoCodeTask(final String apiKey){ this.apiKey = apiKey; } @Override protected String doInBackground(Location... params) { if(apiKey == null){ throw new IllegalStateException("Pass in a geocode api key in the ReverseGeoCoder constructor"); } Location location = params[0]; String googleGeocodeEndpoint = GEOCODE_API_ENDPOINT_BASE + location.getLatitude() + "," + location.getLongitude() + "&key=" + apiKey; Log.d(TAG, "Requesting gecoding endpoint : " + googleGeocodeEndpoint); try { URL url = new URL(googleGeocodeEndpoint); HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); InputStream in = new BufferedInputStream(urlConnection.getInputStream()); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); StringBuilder result = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { result.append(line); } JSONObject json = new JSONObject(result.toString()); String requestStatus = json.getString(JSON_PROPERTY_REQUEST_STATUS); if(requestStatus.equals(STATUS_OK)){ JSONArray results = json.getJSONArray(JSON_PROPERTY_RESULTS); if(results.length() > 0){ JSONObject result1 = results.getJSONObject(0); String address = result1.getString(JSON_PROPERTY_FORMATTED_ADDRESS); Log.d(TAG, "First result's address : " + address ); return address; } else{ Log.d(TAG, "There were no results."); } } else{ Log.w(TAG, "Geocode request status not " + STATUS_OK + ", it was " + requestStatus ); Log.w(TAG, "Did you enable the geocode in the google cloud api console? Is it the right api key?"); } }catch ( IOException | JSONException e){ e.printStackTrace(); } return null; } @Override protected void onPostExecute(String address) { super.onPostExecute(address); if(address != null){ // update the UI here with the address, if its not null originEditText.setText(address); } else{ Log.d(TAG, "Did not find an address, UI not being updated"); } } } 

我有同样的错误,添加下面的权限来解决它。

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