地理编码器的RPC错误

时间:2010-12-02 16:03:36

标签: java android android-emulator

经过几天了解Android的工作方式,我决定构建我的第一个应用程序:一个简单的应用程序,它使用一个简单的EditText小部件从用户提供的地址显示GMap。 我使用Geocoder来做到这一点。

使用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)和不同版本的Google进行了一些测试 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" />

4 个答案:

答案 0 :(得分:3)

请访问我的帖子 Can't mark while showing the current location in 'mapview' 我认为通过一些先前的修改,你可以做任何你想做的事情。

答案 1 :(得分:2)

我想,你有两个理由。

  1. 没有测试,但在模拟器中运行时Geocoder仍然不可用。即使geocoder.isPresent()返回true也是如此。网络上有解决方法,只需在评论21中阅读Issue 8816 - android获取getFromLocationName(..)并附上ReverseGeocoder.java

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

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

答案 2 :(得分:1)

这就是我的地理编码功能,它在谷歌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;
       }

答案 3 :(得分:1)

Geocoder课程有问题。它有时很奇怪。 我建议不要用于获取位置。而是使用本地搜索API和位置管理器来使用位置服务。

相关问题