アプリは 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などのデバイスでそのまま使用できます。
私の理論が正しいことを確認するようにGoogleのReto Meierに依頼したところ、彼は言った「正解です。ジオコーダーは、Google APIアドオンの一部であり、AOSPの一部ではありません。」
そのため、Playストア、GMailアプリなどが付属していないデバイスにも、Geocoderバックエンドがありません。
この問題の別の可能な回避策 があるようですが、これは残念ながら重複した質問としてマークされているため、見逃される可能性があります。基本的に、デバイスを再起動すると問題が解決します。私はそれを「解決策」ではなく「回避策」と呼んだことに注意してください。 :(
代替案を検索する人にとって、うまくいけば、別の投稿での私の答えが役に立つでしょう。ジオコーディングでエラーが検出された場合、 Google Geocoding API を使用できます。
その他のコード=> jsonを使用して現在の場所を取得
一部のデバイスにはジオコーダーのサポートがないため、独自のジオコーダーを作成する必要があります。
基本的に、アドレスを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();
}
}
});
}
数時間を無駄にした後、私は最も簡単な解決策を得ました。
デバイスを再起動したところ、機能し始めました。
問題は、OSレベルのキャッシュの問題によるものです。それもあなたのために働くことを願っています。
同じ問題がありました。以下の機能を利用しました。
アクティビティの
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;
}