2010-12-31 4 views
4

Я выхожу из ума в течение последних двух дней с ошибкой IllegalArgumentException, которую я получаю в коде Android при попытке получить координаты из адреса или даже наоборот, получить адрес из долготы и широту. Это код, но я не вижу ошибки. Это стандартный фрагмент кода, который легко найти в поиске Google.geocoder.getFromLocationName возвращает только null

public GeoPoint determineLatLngFromAddress(Context appContext, String strAddress) { 
    Geocoder geocoder = new Geocoder(appContext, Locale.getDefault()); 
    GeoPoint g = null; 
    try { 
     System.out.println("str addres: " + strAddress); 
     List<Address> addresses = geocoder.getFromLocationName(strAddress, 5); 
     if (addresses.size() > 0) { 
      g = new GeoPoint(
       (int) (addresses.get(0).getLatitude() * 1E6), 
       (int) (addresses.get(0).getLongitude() * 1E6) 
      ); 
     } 
    } catch (Exception e) { 
     throw new IllegalArgumentException("locationName == null"); 
    } 
    return g; 
} 

Эти разрешения от manifest.xml файла:

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

У меня есть ключ API Google объявил также: <uses-library android:name="com.google.android.maps" />

Из фрагмента кода выше, geocoder не является null, также нет address или appContext, и я натыкаюсь здесь: geocoder.getFromLocationName(strAddress, 5);

я сделал много поиска Google и не нашел ничего, что работало, и наиболее важная информация, я нашел это:

Класса Geocoder требует обслуживаний серверных, не включенные в андроиде рамок основных.

Sooo, теперь я запутался. Что мне нужно вызывать, импортировать, добавлять, использовать в коде .... чтобы сделать эту работу? Я использую API Google API 2.2, уровень API 8. Если кто-то нашел решение для этого или указатель на документацию, то, что я не обнаружил, сообщите нам.

ответ

0

Запустите свой код на Android 2.0, он будет работать. У меня была такая же проблема с кодом. Его не работает в 2.2, не знаю почему

+0

Я попробую его с Android2.0, спасибо. Надеюсь, он сработает, если да, сообщит вам об этом. С новым годом! – test

+0

С Новым годом ты тоже! – Sandy

11

У меня была аналогичная проблема, и я обнаружил, что опрос Geocoder до тех пор, пока я не получил результат. Вот как я это сделал, до сих пор отлично работает.

try { 
    List<Address> geoResults = geocoder.getFromLocationName("<address goes here>", 1); 
    while (geoResults.size()==0) { 
     geoResults = geocoder.getFromLocationName("<address goes here>", 1); 
    } 
    if (geoResults.size()>0) { 
     Address addr = geoResults.get(0); 
     myLocation.setLatitude(addr.getLatitude()); 
     myLocation.setLongitude(addr.getLongitude()); 
    } 
} catch (Exception e) { 
    System.out.print(e.getMessage()); 
} 
+0

@ chris..dint работа для меня –

+0

Вы можете предоставить более подробную информацию? – chris

+1

Я смог его исправить. У меня была сила, закрывающая Android-карты App..once, я перезапустил эмулятор. он отлично работал –

2
public LatLng determineLatLngFromAddress(Context appContext, String strAddress) { 
     LatLng latLng = null; 
     Geocoder geocoder = new Geocoder(appContext, Locale.getDefault()); 
     List<Address> geoResults = null; 

     try { 
      geoResults = geocoder.getFromLocationName(strAddress, 1); 
      while (geoResults.size()==0) { 
       geoResults = geocoder.getFromLocationName(strAddress, 1); 
      } 
      if (geoResults.size()>0) { 
       Address addr = geoResults.get(0); 
       latLng = new LatLng(addr.getLatitude(),addr.getLongitude()); 
      } 
     } catch (Exception e) { 
      System.out.print(e.getMessage()); 
     } 

    return latLng; //LatLng value of address 
    } 
+0

Впервые, если это не дает результата, тогда он даст результат для попыток. –

2

была такая же проблема. Аккумулирование не работал, так что я использовал это, чтобы получить место: Geocoding Responses

Используйте этот класс, чтобы получить JSONObject местоположения:

public class GetLocationDownloadTask extends AsyncTask<String, Void, String> { 

    @Override 
    protected String doInBackground(String... strings) { 


     String result = ""; 
     URL url; 
     HttpURLConnection urlConnection; 
     try { 
      url = new URL(strings[0]); 
      urlConnection = (HttpURLConnection) url.openConnection(); 
      InputStream is = urlConnection.getInputStream(); 
      InputStreamReader inputStreamReader = new InputStreamReader(is); 

      int data = inputStreamReader.read(); 
      while(data != -1){ 
       char curr = (char) data; 
       result += curr; 
       data = inputStreamReader.read(); 
      } 
      return result; 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     return null; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 

     if(result != null) { 
      try { 
       JSONObject locationObject = new JSONObject(result); 
       JSONObject locationGeo = locationObject.getJSONArray("results").getJSONObject(0).getJSONObject("geometry").getJSONObject("location"); 


      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
     } 

    } 

Вы можете создать и запустить экземпляр класса, как это:

String link = "https://maps.googleapis.com/maps/api/geocode/json?address=" + addressString + "&key={YOUR_API_KEY}"; 

GetLocationDownloadTask getLocation = new GetLocationDownloadTask(); 

getLocation.execute(link); 
Смежные вопросы