2010-12-02 12 views
26

Androidがどのように動作するかを知りたがってから、私は最初のアプリケーションを作成することにしました:ユーザーが提供するアドレスから簡単なEditTextウィジェットを使ってGMapを表示する単純なアプリケーション。
私はそれを行うためにGeocoderを使用します。 logcatで少しバグ追跡後ジオコーダでRPCエラーが発生する

は、ここに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に既知のバグがあり、RPC Failed 1の代わりにService Unavailable Exceptionが返されたことに気がつきました。

一方、自分のデバイス(HTC Desire 2.1)で直接アプリケーションを実行しようとしたところ、同じ動作(つまり、動作していない、中心の米国マップ)に気付きました。ここで

は、Androidマニフェストのユーザー権限来る:私のジオコーディング機能、そのGoogleのAPIに細かい作業7.希望ザッツ

<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

あなたは原因を見つけることができましたか?私はまったく同じ問題を抱えています! –

+10

GoogleマップのAPIキーを正しく設定しましたか? Googleマップを使用せずにジオコーディングを使用することはできません。キーについてはこちらhttp://code.google.com/intl/de-DE/android/maps-api-signup.html – Stefan

+0

ジオコーディングサービスが存在することを確認しましたか?例えばgeocoder.isPresent()はtrueを返しますか? – Kyle

答えて

1

をその有用

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

私はあなたには2つの理由があると思います。

  1. はテストしていないが、シミュレータで実行しているときジオコーダはまだ利用できません。 geocoder.isPresent()がtrueを返しても回避策はちょうどReverseGeocoder.javaのコメント21にgetFromLocationName(..)のためIssue 8816 - androidを読み、それが取り付けられています

  2. はステファンと同様に、ウェブであり、言った:そこにデバイス上で起動すると、APIキーが必要とされています。あなたのmapviewのlayout.xmlに追加する必要があります。私のためのMapViewを作成し、テストするための

ベストな方法は、通常のようにそれを実装し、「サービス利用可能ではない」.equals(exception.getMessage())場合、回避策を記録して試してみました。

1

Geocoderクラスはバグです。それは時々wierd働く。 私は場所を取得するために使用することをお勧めします。代わりに、位置情報サービスを使用するためのローカル検索APIおよびロケーションマネージャ。

関連する問題