2010-12-02 72 views
26

經過幾天瞭解Android的工作原理,我決定構建我的第一個應用程序:一個簡單的應用程序,用戶可以通過簡單的EditText小部件從用戶提供的地址顯示GMap。
我使用Geocoder來做到這一點。RPC錯誤與地理編碼器

與logcat的一個小bug跟蹤後,這裏是由亞行返回的異常:

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(); 
    } 

顯然,這個代碼是一個0123例子的一部分。

我用不同版本的Google APIS(8,7,4)和不同版本的 SDK平臺(2.2,2.1,1.6)做了一些測試,但沒有運氣。我只注意到Google API 8包含一個已知的bug,並且返回了Service Unavailable Exception而不是RPC Failed 1。另一方面,我試圖直接在我的設備上運行我的應用程序(HTC Desire 2.1),並且我注意到了相同的行爲(也就是說:沒有任何行爲,它的中心爲美國地圖)。

這裏談到的Android清單的用戶權限:

<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" /> 
+2

你能找到這個原因嗎?我現在正在遇到一模一樣的問題! – 2011-10-03 17:08:00

回答

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; 
     } 
2

我認爲,你有兩個原因。

  1. 未測試,但Geocoder在模擬器中運行時仍然不可用。即使geocoder.isPresent()返回true。有變通方法在網絡,剛讀Issue 8816 - android爲getFromLocationName(..)在評論21和它的附屬ReverseGeocoder.java

  2. 像斯特凡說:當設備推出有需要的API密鑰。必須添加到您的mapview的layout.xml中。創建和測試我一個MapView

最佳方式是實現它像正常和日誌,並嘗試解決辦法,如果「服務不可用」 .equals(exception.getMessage())。

1

Geocoder類是越野車。它有時候會變得很奇怪。 我建議不要用於獲取位置。改爲使用位置服務的本地搜索API和位置管理器。