web-dev-qa-db-ja.com

Android Geocoderが「サービスを利用できません」という例外をスローするのはなぜですか?

アプリは Geocoder オブジェクトを使用します。私の在庫のFroyo Nexus Oneでは問題なく動作します。しかし、まったく同じアプリを別のデバイス(Froyoを実行するAdvent Vega 10 "タブレット)で実行すると、次の例外が発生します:Service not Available 。私が使用しているメソッドはgetFromLocationName()で、Android 1.6 Google APIに対してビルドしています。

この例外がエミュレーターでスローされる問題を認識していますが、これは異なると思います。 Froyoを実行しているデバイスでスローされ、他のデバイスではスローされないのはなぜですか?

アプリは位置情報アプリであり、タブレットにはGPSまたはモバイルネットワークがないため、Wi-Fi接続で位置情報が提供されないシナリオでは、ユーザーが手動で位置情報を指定する必要があるため、Geocoderオブジェクトを使用できません悪い知らせです。

ユーザーが地図上の場所を選択する方法を追加することもできますが、それは理想的ではありません。おそらく、Google Maps APIを直接使用することもできますが、簡単な解決策があればいいので、最初に問題の性質を理解したいと思っています。

うまくいけば、将来のリリースでAndroidには、Geocoder以外のデバイスのOSレベルの「デフォルトの場所」が含まれるので、位置認識アプリはGoogle TVなどのデバイスでそのまま使用できます。

31
Ollie C

私の理論が正しいことを確認するようにGoogleのReto Meierに依頼したところ、彼は言った「正解です。ジオコーダーは、Google APIアドオンの一部であり、AOSPの一部ではありません。」

そのため、Playストア、GMailアプリなどが付属していないデバイスにも、Geocoderバックエンドがありません。

27
Ollie C

この問題の別の可能な回避策 があるようですが、これは残念ながら重複した質問としてマークされているため、見逃される可能性があります。基本的に、デバイスを再起動すると問題が解決します。私はそれを「解決策」ではなく「回避策」と呼んだことに注意してください。 :(

12
d60402

代替案を検索する人にとって、うまくいけば、別の投稿での私の答えが役に立つでしょう。ジオコーディングでエラーが検出された場合、 Google Geocoding API を使用できます。

その他のコード=> jsonを使用して現在の場所を取得

2
Megamind

一部のデバイスにはジオコーダーのサポートがないため、独自のジオコーダーを作成する必要があります。

基本的に、アドレスをgoogleに要求してjson応答を処理する非同期タスクを作成する必要があります。

Aqueryを使用して、私はこのようなことをします:

public void asyncJson(String address){
        address = address.replace(" ", "+");

        String url = "http://maps.googleapis.com/maps/api/geocode/json?address="+ address +"&sensor=true";

        aq.ajax(url, JSONObject.class, new AjaxCallback<JSONObject>() {

                @Override
                public void callback(String url, JSONObject json, AjaxStatus status) {                        

                        if(json != null){

                                 //here you work with the response json
                                 JSONArray results = json.getJSONArray("results");                               
                                Toast.makeText(context, results.getJSONObject(1).getString("formatted_address"));

                        }else{                                
                                //ajax error, show error code
                                Toast.makeText(aq.getContext(), "Error:" + status.getCode(), Toast.LENGTH_LONG).show();
                        }
                }
        });        
}
1
Bruno Pinto

数時間を無駄にした後、私は最も簡単な解決策を得ました。

デバイスを再起動したところ、機能し始めました。

問題は、OSレベルのキャッシュの問題によるものです。それもあなたのために働くことを願っています。

1
Neo

同じ問題がありました。以下の機能を利用しました。

注意:

アクティビティのcontextを使用し、次の関数にはgetApplicationContext()を使用しないでください

public static Address getLocalityFrmGeoCoder(Context context, Location mLocation) {
        try {
            if(mLocation!=null){
            Geocoder gCoder = new Geocoder(context, Locale.getDefault());
            List<Address> address = gCoder.getFromLocation(mLocation.getLatitude(), mLocation.getLongitude(), 1);
            if (address.size() > 0) {
                return address.get(0);
            }
            }

        } catch (Exception e) {
            Log.d("GEOCODER", "GEOCODER EXCEPTION");
            e.printStackTrace();

        }
    return null;
}
0
jafarbtech