4

я должен получить адрес по координатам, но он не работает и выдает "Couldnt получить адрес":сервис Google Геокодер Unavaliable (Координаты для решения)

public String GetAddress(String lat, String lon) 
     { 
      Geocoder geocoder = new Geocoder(this, Locale.ENGLISH); 
      String ret = ""; 
      try { 
       List<Address> addresses = geocoder.getFromLocation(Double.parseDouble(lat), Double.parseDouble(lon), 1); 
       if(addresses != null) { 
        Address returnedAddress = addresses.get(0); 
        StringBuilder strReturnedAddress = new StringBuilder(""); 
        for(int i=0; i<returnedAddress.getMaxAddressLineIndex(); i++) { 
         strReturnedAddress.append(returnedAddress.getAddressLine(i)).append("\n"); 
        } 
        ret = strReturnedAddress.toString(); 
        ret=ret.substring(0, ret.length() - 1); 
       } 
       else{ 
        ret = "Unknown Address"; 
       } 
      } 
      catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
       ret = "Couldn't get Address"; 
      } 
      return ret; 
     } 

LogCat:

09-27 23:47:49.837: W/System.err(1862): java.io.IOException: Service not Available 
09-27 23:47:49.847: W/System.err(1862):  at android.location.Geocoder.getFromLocation(Geocoder.java:136) 
09-27 23:47:49.847: W/System.err(1862):  at com.example.free.Add.GetAddress(Add.java:634) 
09-27 23:47:49.857: W/System.err(1862):  at com.example.free.Add$LoadAddress.doInBackground(Add.java:608) 
09-27 23:47:49.857: W/System.err(1862):  at com.example.free.Add$LoadAddress.doInBackground(Add.java:1) 
09-27 23:47:49.857: W/System.err(1862):  at android.os.AsyncTask$2.call(AsyncTask.java:287) 
09-27 23:47:49.857: W/System.err(1862):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
09-27 23:47:49.857: W/System.err(1862):  at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
09-27 23:47:49.857: W/System.err(1862):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
09-27 23:47:49.857: W/System.err(1862):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
09-27 23:47:49.857: W/System.err(1862):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
09-27 23:47:49.857: W/System.err(1862):  at java.lang.Thread.run(Thread.java:856) 
+0

http://stackoverflow.com/questions/7109240/service-not-available-geocoder-android – nhgrif

+0

извините. его wierd проблема. – NirPes

+0

Вы ссылаетесь на [это] (http://stackoverflow.com/questions/4761052/why-is-android-geocoder-throwing-a-service-not-available-exception) ссылку? – nhgrif

ответ

13

Общий ответ на эту проблему заключается в том, что вам необходимо перезагрузить устройство.

Возможно, вы не можете сообщить своим пользователям о перезагрузке устройства, чтобы ваше приложение функционировало, поэтому мое решение заключалось в использовании резервного HTTP-сообщения, вот AsyncTask, который я использую в своем коде.

Вам придется изменить его для своей ситуации, так как я ищу адрес с позиции, а не наоборот.

private class GetAddressPositionTask extends 
     AsyncTask<String, Integer, LatLng> { 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 

    @Override 
    protected LatLng doInBackground(String... plookupString) { 

     String lookupString = plookupString[0]; 
     final String lookupStringUriencoded = Uri.encode(lookupString); 
     LatLng position = null; 

     // best effort zoom 
     try { 
      if (geocoder != null) { 
       List<Address> addresses = geocoder.getFromLocationName(
         lookupString, 1); 
       if (addresses != null && !addresses.isEmpty()) { 
        Address first_address = addresses.get(0); 
        position = new LatLng(first_address.getLatitude(), 
          first_address.getLongitude()); 
       } 
      } else { 
       Log.e(TAG, "geocoder was null, is the module loaded? " 
         + isLoaded); 
      } 

     } catch (IOException e) { 
      Log.e(TAG, "geocoder failed, moving on to HTTP"); 
     } 
     // try HTTP lookup to the maps API 
     if (position == null) { 
      HttpGet httpGet = new HttpGet(
        "http://maps.google.com/maps/api/geocode/json?address=" 
          + lookupStringUriencoded + "&sensor=true"); 
      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(); 
      try { 
       // Log.d("MAPSAPI", stringBuilder.toString()); 

       jsonObject = new JSONObject(stringBuilder.toString()); 
       if (jsonObject.getString("status").equals("OK")) { 
        jsonObject = jsonObject.getJSONArray("results") 
          .getJSONObject(0); 
        jsonObject = jsonObject.getJSONObject("geometry"); 
        jsonObject = jsonObject.getJSONObject("location"); 
        String lat = jsonObject.getString("lat"); 
        String lng = jsonObject.getString("lng"); 

        // Log.d("MAPSAPI", "latlng " + lat + ", " 
        // + lng); 

        position = new LatLng(Double.valueOf(lat), 
          Double.valueOf(lng)); 
       } 

      } catch (JSONException e) { 
       Log.e(TAG, e.getMessage(), e); 
      } 

     } 
     return position; 
    } 

    @Override 
    protected void onPostExecute(LatLng result) { 
     Log.i("GEOCODE", result.toString()); 
     super.onPostExecute(result); 
    } 

}; 
+0

Что такое lookupStringUriencoded слышать? –

+1

Это просто строка поиска, закодированная uri (пробелы заменены на% 20 и т. Д.). Я использую его в ответе HTTP для параметра запроса. – cYrixmorten

+0

Возможно, не стоит сначала пытаться вызвать API, учитывая, что он известен как чешуйчатый. Просто используйте HTTP. Вы не хотите, чтобы пользователь висел вокруг таймаута подключения до того, как ваше приложение совершит HTTP-вызов. – ComeIn

Смежные вопросы