GetFromLocationName呼び出しを使用すると、「grpc failed」という説明のIOExceptionが表示されます。
実行されたコード
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
try {
Geocoder geocoder = new Geocoder(getApplicationContext(), Locale.getDefault());
List<Address> listAdresses = geocoder.getFromLocationName("London", 10);
Log.i("PlaceInfo", listAdresses.get(0).toString());
} catch (IOException e) {
e.printStackTrace();
}
}
コンソール出力のエラー:
07-10 12:01:38.781 13712-13712/co.siqve.maplocationdemo W/System.err: Java.io.IOException: grpc failed
07-10 12:01:38.781 13712-13712/co.siqve.maplocationdemo W/System.err: at Android.location.Geocoder.getFromLocationName(Geocoder.Java:178)
07-10 12:01:38.781 13712-13712/co.siqve.maplocationdemo W/System.err: at co.siqve.maplocationdemo.MapsActivity.onMapReady(MapsActivity.Java:70)
07-10 12:01:38.781 13712-13712/co.siqve.maplocationdemo W/System.err: at com.google.Android.gms.maps.zzaj.zza(Unknown Source)
07-10 12:01:38.781 13712-13712/co.siqve.maplocationdemo W/System.err: at com.google.Android.gms.maps.internal.zzaq.onTransact(Unknown Source)
07-10 12:01:38.781 13712-13712/co.siqve.maplocationdemo W/System.err: at Android.os.Binder.transact(Binder.Java:499)
07-10 12:01:38.781 13712-13712/co.siqve.maplocationdemo W/System.err: at com.google.Android.gms.maps.internal.aq.a(:com.google.Android.gms.DynamiteModulesB:5)
07-10 12:01:38.781 13712-13712/co.siqve.maplocationdemo W/System.err: at com.google.maps.api.Android.lib6.impl.bb.run(:com.google.Android.gms.DynamiteModulesB:5)
07-10 12:01:38.781 13712-13712/co.siqve.maplocationdemo W/System.err: at Android.os.Handler.handleCallback(Handler.Java:751)
07-10 12:01:38.781 13712-13712/co.siqve.maplocationdemo W/System.err: at Android.os.Handler.dispatchMessage(Handler.Java:95)
07-10 12:01:38.781 13712-13712/co.siqve.maplocationdemo W/System.err: at Android.os.Looper.loop(Looper.Java:154)
07-10 12:01:38.781 13712-13712/co.siqve.maplocationdemo W/System.err: at Android.app.ActivityThread.main(ActivityThread.Java:6119)
07-10 12:01:38.782 13712-13712/co.siqve.maplocationdemo W/System.err: at Java.lang.reflect.Method.invoke(Native Method)
07-10 12:01:38.782 13712-13712/co.siqve.maplocationdemo W/System.err: at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:886)
07-10 12:01:38.782 13712-13712/co.siqve.maplocationdemo W/System.err: at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:776)
Android SDKバージョン(APIレベル):25
Android Studioプラグインは最新です。
前もって感謝します!
編集:
問題は現在修正されているようです、ここに私の 解決策
更新:
問題は現在解決されているようです。問題が私の側にあったかどうかはわかりません。したがって、この投稿の前にこの問題が発生した場合は、アプリを再実行して、動作するかどうかを確認してください。
それでもうまくいかない場合は、ここで私が自分自身で「可能性のある」ことを行ったことがあります。
GenymotionおよびAndroidスタジオエミュレーターのみでこの問題が発生している可能性があります。 genymotionとAndroidスタジオエミュレーターで同じ問題に直面した後、Android実デバイスで確認しました。それは私のためにうまく機能しています。実際のデバイスで確認しましたか?
Android 4.4.2デバイスでこの問題に何度か直面しています。私にとっての解決策は、ハンドセットを再起動することです。コードの更新なしAndroid studioのアンインストールなし。
Googleが書いているように、UIスレッドでこのメソッドを呼び出さないでください
https://developer.Android.com/training/location/display-address#Java
この操作を新しいThread
で実行することでこの問題を修正し、UIビューを更新する必要がある場合は、runOnUiThread
で実行します
今日(2017-09-16)Android Studio(2.3.3)がGoogle Play開発者サービスをリビジョン44に更新しました。この問題はその後修正されました。私の側からのコードやセットアップの変更はありません。
これは、OreoがインストールされたSamsung S7 Edge電話でも発生していました。飛行機モードをオンにしたときにのみ起こりました(常にではありません-ある時点で何かがキャッシュされた可能性があることを意味します)。私はGeocoderの内部を調査しませんでしたが、情報を取得するために何らかの接続が必要だと思います(これは、これがエミュレータで頻繁に発生する理由も説明します)。私にとっての解決策は、ネットワーク接続状態を確認し、status != NETWORK_STATUS_NOT_CONNECTED
のときにのみこれを呼び出すことでした。
このために、ネットワーク上のステータス変更をリッスンするブロードキャストレシーバーを実装できます。
受信機を登録する
IntentFilter networkFilter = new IntentFilter();
networkFilter.addAction("Android.net.conn.CONNECTIVITY_CHANGE");
getActivity().registerReceiver(NetworkChangeReceiver, networkFilter);
ブロードキャストを処理するためのブロードキャストレシーバーのセットアップ
private BroadcastReceiver NetworkChangeReceiver = new BroadcastReceiver() {
@Override
public void onReceive(final Context context, final Intent intent) {
int status = NetworkUtil.getConnectivityStatusString(context);
if (status == NetworkUtil.NETWORK_STATUS_NOT_CONNECTED) {
} else {
// do your stuff with geocoder here
}
}
};
問題にはかなり遅れていますが、ここではKotlinユーザーに対する回答があります。
GeocoderのgetFromLocation
関数を使用しているときに、このJava.io.IOException: grpc failed
エラーに遭遇しました。テストデバイスとしてGoogle Pixel 2を使用しています(Android 9を実行)。
確認する3つのことがあります。
Geocoder
に関連することはすべて行う必要がありますapartアプリのメインスレッドから。私の主張をサポートするために、ここにAndroidドキュメントからの引用があります: "このメソッドは同期的であり、作業に時間がかかることがあります。アプリのメインのユーザーインターフェイス(UI)スレッド。」公式ドキュメントで例を示しているように、このタスクにはIntentService
を使用するのが最善です。ただし、 this person はJavaのAsyncTaskで試してみましたが、問題なく動作しました(geocoder
を使用したタスクはそれほど集中的ではなかったことに注意してください)。したがって、 Anko'sdoAsync
メソッドを使用し、その中にGeocoder
に関するコードを実装することを強くお勧めします。
可能であれば、エミュレータの代わりに物理デバイスを使用してください。 Android Studioのエミュレーターは多くのトラブルを引き起こし、実際に問題をデバッグするために必要なエラー情報を提供していませんでした。
物理デバイスにアプリを再インストールし、キャッシュを無効化/プロジェクトを数回再起動します。
また、ネットワーク接続が良好であり、デバイスで有効になっていることを確認してください。
これはデバイスの場所に依存すると思います。これは、Googleマップが一部の地域で適切に機能しない場合があるためです。私はイラン出身で、実際のデバイスとエミュレーターでもこの問題がありました。しばらくしてこの問題に取り組み、vpnアプリケーションを使用し、実際のデバイスとエミュレーターで動作しました。 VPNアプリケーションがIPアドレスを変更したためです。
バージョン25 SDK、ビルドツール、およびAPIエミュレーターの次の構成を使用して、ようやく機能するようになりました。
Android {
compileSdkVersion 25
buildToolsVersion "25.0.3"
defaultConfig {
applicationId "com.example..."
minSdkVersion 15
targetSdkVersion 25
また、Google APIバージョン11.0.2を使用します。
私の場合、アプリからのアクセス許可の設定をオンにしました(許可が与えられました)。
AOA!デバイスのGPSの精度モードを(gpsのみ)他のオプションのインスタントに変更して、試行してください......
私のために働いた 設定はこのようなもので、エミュレーターでも見つけることができます
2019年8月の時点で、プロキシを使用して自分のHTTPトラフィックをスヌーピングしているときに、時々このエラーが発生します。オフにして問題は解決しました。
Geocoderを毎回作成するのではなく、アプリケーションのシングルトンとして導入すればうまくいきます。必ずワーカースレッドからGeocoder.getFromLocationName()を呼び出してください。
例えば:
class Application {
private val geoCoder = Geocoder(context, Locale.getDefault())
...
}
class SomeClass {
@WorkerThread
fun doSmth(){
application.geoCoder.getFromLocationName("London", 10)
...
}
}
Geocoder.getFromLocation()メソッドを使用して住所リストを取得しているときにこの問題に直面しました。問題は、緯度、経度から住所リストを取得するのに時間がかかるか、低速のデバイスでは時間がかかることです。また、Java-io- ioexception-grpc-failed。
Rx Javaを使用してこの問題を修正します。
public class AsyncGeocoder {
private final Geocoder geocoder;
public AsyncGeocoder(Context context) {
geocoder = new Geocoder(context);
}
public Disposable reverseGeocode(double lat, double lng, Callback callback) {
return Observable.fromCallable(() -> {
try {
return geocoder.getFromLocation(lat, lng, 1);
} catch (Exception e) {
AppLogger.d("throwable,", new Gson().toJson(e));
e.printStackTrace();
}
return false;
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(result -> {
//Use result for something
AppLogger.d("throwable,", new Gson().toJson(result));
callback.success((Address) ((ArrayList) result).get(0));
}, throwable -> AppLogger.d("throwable,", new Gson().toJson(throwable)));
}
public interface Callback {
void success(Address address);
void failure(Throwable e);
}
}
呼び出し位置
mViewModel.getLocation(asyncGeocoder, getLat(), getLng(), this);
ViewModelメソッド
public void getLocation(AsyncGeocoder geocoder, Double lat, Double lng, AsyncGeocoder.Callback callback) {
getCompositeDisposable().add(geocoder.reverseGeocode(lat, lng, callback));
}
この問題は既に報告されており、他のスタックポストでそれについて話しているのを見つけることができます。 ここ は、ジオコーダーがクラッシュするさまざまな方法のいくつかに関するGoogleの問題に関するコメントです。アプリケーションが停止しないように、コードの一部をtry and catchで囲むことをお勧めします。