Ответ 1
Пожалуйста, посетите мой пост Нельзя отметить пока показ текущего местоположения в 'mapview'. Я думаю, что с некоторой предварительной модификацией вы сможете делать все, на что хотите.
Через несколько дней, чтобы узнать, как работает Android, я решил создать свое первое приложение: простое приложение, которое отображает GMap с адреса, предоставленного пользователем, с простым виджем EditText
.
Я использую Geocoder
для этого.
После небольшого bugtracking с logcat, вот исключение, возвращаемое adb:
E/LocationMasfClient( 53): forwardGeocode(): RPC failed with status 1
W/System.err( 262): java.io.IOException: RPC failed with status 1
W/System.err( 262): at android.location.Geocoder.getFromLocationName(Geocoder.java:166)
W/System.err( 262): at fr.meetopia.tinymap.MapViewActivity.testGeoCoder(MapViewActivity.java:104)
W/System.err( 262): at fr.meetopia.tinymap.MapViewActivity.onCreate(MapViewActivity.java:38)
W/System.err( 262): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
W/System.err( 262): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
W/System.err( 262): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
W/System.err( 262): at android.app.ActivityThread.access$2200(ActivityThread.java:119)
W/System.err( 262): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
Теперь вот код, обозначенный трассировкой стека:
Geocoder geoCoder = new Geocoder(this);
MapView mapView = (MapView) findViewById(R.id.mapview);
MapController mc = mapView.getController();
GeoPoint p;
try {
List<Address> addresses = geoCoder.getFromLocationName("paris france", 50);
if (addresses.size() > 0) {
p = new GeoPoint(
(int) (addresses.get(0).getLatitude() * 1E6),
(int) (addresses.get(0).getLongitude() * 1E6));
mc.animateTo(p);
mapView.invalidate();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Очевидно, что этот код является частью экземпляра MapActivity
.
Я провел несколько тестов с различными версиями Google APIS (8, 7, 4) и различными версиями
SDK (2.2, 2.1, 1.6), но не повезло. Я только заметил, что Google API 8 содержит известную ошибку и возвращает Service Unavailable Exception
вместо RPC Failed 1
.
С другой стороны, я попытался запустить приложение прямо на своем устройстве (HTC Desire 2.1), и я заметил то же поведение (то есть: никакого поведения, карты с США в его центре).
Здесь идет пользовательское разрешение Android Manifest:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
Пожалуйста, посетите мой пост Нельзя отметить пока показ текущего местоположения в 'mapview'. Я думаю, что с некоторой предварительной модификацией вы сможете делать все, на что хотите.
Думаю, для вас есть две причины.
Не тестировалось, но Geocoder по-прежнему будет недоступен при работе в симуляторе. Даже если geocoder.isPresent() возвращает true. В Интернете есть обходное решение, просто прочитайте Issue 8816 - android для getFromLocationName (..) в комментарии 21 и он прикреплен ReverseGeocoder.java
Как сказал Стефан: При запуске на устройстве там нужен api-ключ. Должен быть добавлен в layout.xml вашего mapview.
Лучший способ создать и протестировать mapview для меня состоял в том, чтобы реализовать его как обычный и log и попробовать обходной путь, если "Service not Available".equals(exception.getMessage()).
Это моя функция геокодирования, она отлично работает в google API 7. Надеюсь, что это полезно
public GeoPoint geoCoding(String name){
Geocoder geoCoder = new Geocoder(context, Locale.getDefault() );
GeoPoint p = null;
try {
List<Address> addresses = geoCoder.getFromLocationName(
name, 5);
if (addresses.size() > 0) {
p = new GeoPoint(
(int) (addresses.get(0).getLatitude() * 1E6),
(int) (addresses.get(0).getLongitude() * 1E6));
}
} catch (IOException e) {
e.printStackTrace();
}
return p;
}
Класс Geocoder неисправен. Он временами работает странно. Я рекомендую не использовать для получения местоположения. Вместо этого локальный поиск API и менеджер местоположений для использования служб определения местоположения.