geocoder.getFromLocationName возвращает только ноль
Я схожу с ума в течение последних двух дней с IllegalArgumentException
Я получаю сообщение об ошибке в коде Android при попытке получить координаты из адреса или даже наоборот, получить адрес из долготы и широты. Это код, но я не вижу ошибки. Это стандартный фрагмент кода, который легко найти в поиске Google.
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 требует бэкэнд-сервис, который не включен в базовую платформу Android.
Ооо, я сейчас в замешательстве. Что мне нужно вызывать, импортировать, добавлять, использовать в коде.... чтобы это работало? Я использую Google API 2.2, уровень API 8. Если кто-то нашел решение для этого или указатель на документацию, что-то, чего я не обнаружил, сообщите нам.
4 ответа
У меня была похожая проблема, и я обнаружил, что опрос геокодера до получения результата работал. Вот как я это сделал, пока отлично работает.
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());
}
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
}
Была такая же проблема. Объединение в пул не сработало, поэтому я использовал это для определения местоположения: геокодирование
Используйте этот класс, чтобы получить 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);
Запустите свой код на Android 2.0, он будет работать. У меня была такая же проблема с кодом мая. Не работает в 2.2, не знаю почему