RPC错误与地理编码器

经过几天的学习Android的工作,我决定build立我的第一个应用程序:一个简单的应用程序,用简单的EditText小部件从用户提供的地址显示GMap。
我使用Geocoder来做到这一点。

在用logcat进行一些bug跟踪之后,这里是adb返回的exception:

 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)进行了一些testing,但没有运气。 我刚刚注意到,Google API 8包含一个已知的bug,并返回了一个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" /> 

Solutions Collecting From Web of "RPC错误与地理编码器"

请访问我的post无法在'mapview'中显示当前位置时进行标记我认为,通过一些事先的修改,您可以做任何你想做的事情。

我想,这有两个原因。

  1. 没有testing,但在模拟器中运行时Geocoder仍然不可用。 即使geocoder.isPresent()返回true。 有在networking中的解决方法,只是阅读问题8816 – Android的getFromLocationName(..)在评论21,它附有ReverseGeocoder.java

  2. 像Stefan说的那样:当在设备上启动时,需要api-key。 必须添加到你的mapview的layout.xml中。

为我创build和testingmapview的最佳方法是像普通和日志一样实现它,并尝试解决方法,如果“服务不可用”.equals(exception.getMessage())。

这是我的地理编码function,它在谷歌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类是越野车。 它有时奇怪的工作。 我build议不要用于获取位置。 而不是使用位置服务的本地searchAPI和位置pipe理器。