web-dev-qa-db-ja.com

java.io.IOException:grpc failed

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プラグインは最新です。

前もって感謝します!

編集:

問題は現在修正されているようです、ここに私の 解決策

31
Siqve

更新:

問題は現在解決されているようです。問題が私の側にあったかどうかはわかりません。したがって、この投稿の前にこの問題が発生した場合は、アプリを再実行して、動作するかどうかを確認してください。

それでもうまくいかない場合は、ここで私が自分自身で「可能性のある」ことを行ったことがあります。

  1. Android St​​udioに関連するすべてのファイルをアンインストールして削除しました。 (NOTプロジェクトファイル)。
  2. その後、Android St​​udioを再インストールし、プロジェクトを再度開きました。
  3. アプリを実行するとき(Android St​​udioの組み込みエミュレータを使用しています)、別の仮想デバイスとデバイスAPIを使用しました。今回は、API 23、x86_64を使用してPixelで実行しました。
0
Siqve

GenymotionおよびAndroidスタジオエミュレーターのみでこの問題が発生している可能性があります。 genymotionとAndroidスタジオエミュレーターで同じ問題に直面した後、Android実デバイスで確認しました。それは私のためにうまく機能しています。実際のデバイスで確認しましたか?

11
Arti patel

Android 4.4.2デバイスでこの問題に何度か直面しています。私にとっての解決策は、ハンドセットを再起動することです。コードの更新なしAndroid studioのアンインストールなし。

7
Aamir Rafiq

Googleが書いているように、UIスレッドでこのメソッドを呼び出さないでください

https://developer.Android.com/training/location/display-address#Java

この操作を新しいThreadで実行することでこの問題を修正し、UIビューを更新する必要がある場合は、runOnUiThreadで実行します

3
Daniele

今日(2017-09-16)Android St​​udio(2.3.3)がGoogle Play開発者サービスリビジョン44に更新しました。この問題はその後修正されました。私の側からのコードやセットアップの変更はありません。

3
Tobus

これは、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
    }
  }
};
2
Lubos Prague

問題にはかなり遅れていますが、ここではKotlinユーザーに対する回答があります。

GeocoderのgetFromLocation関数を使用しているときに、このJava.io.IOException: grpc failedエラーに遭遇しました。テストデバイスとしてGoogle Pixel 2を使用しています(Android 9を実行)。

確認する3つのことがあります。

  1. 多くの人(およびAndroidのドキュメント ここ )で指摘されているように、Geocoderに関連することはすべて行う必要がありますapartアプリのメインスレッドから。私の主張をサポートするために、ここにAndroidドキュメントからの引用があります: "このメソッドは同期的であり、作業に時間がかかることがあります。アプリのメインのユーザーインターフェイス(UI)スレッド。」

公式ドキュメントで例を示しているように、このタスクにはIntentServiceを使用するのが最善です。ただし、 this person はJavaのAsyncTaskで試してみましたが、問題なく動作しました(geocoderを使用したタスクはそれほど集中的ではなかったことに注意してください)。したがって、 Anko'sdoAsyncメソッドを使用し、その中にGeocoderに関するコードを実装することを強くお勧めします。

  1. 可能であれば、エミュレータの代わりに物理デバイスを使用してください。 Android St​​udioのエミュレーターは多くのトラブルを引き起こし、実際に問題をデバッグするために必要なエラー情報を提供していませんでした。

  2. 物理デバイスにアプリを再インストールし、キャッシュを無効化/プロジェクトを数回再起動します。

また、ネットワーク接続が良好であり、デバイスで有効になっていることを確認してください。

1
codeabiswas

これはデバイスの場所に依存すると思います。これは、Googleマップが一部の地域で適切に機能しない場合があるためです。私はイラン出身で、実際のデバイスとエミュレーターでもこの問題がありました。しばらくしてこの問題に取り組み、vpnアプリケーションを使用し、実際のデバイスとエミュレーターで動作しました。 VPNアプリケーションがIPアドレスを変更したためです。

1
Ali Khazaei

バージョン25 SDK、ビルドツール、およびAPIエミュレーターの次の構成を使用して、ようやく機能するようになりました。

Android {
    compileSdkVersion 25
    buildToolsVersion "25.0.3"
    defaultConfig {
        applicationId "com.example..."
        minSdkVersion 15
        targetSdkVersion 25

また、Google APIバージョン11.0.2を使用します。

1
SagunKho

私の場合、アプリからのアクセス許可の設定をオンにしました(許可が与えられました)。

0
Chulo

AOA!デバイスのGPSの精度モードを(gpsのみ)他のオプションのインスタントに変更して、試行してください......

私のために働いた 設定はこのようなもので、エミュレーターでも見つけることができます

0
Ch Tpx

2019年8月の時点で、プロキシを使用して自分のHTTPトラフィックをスヌーピングしているときに、時々このエラーが発生します。オフにして問題は解決しました。

0
Johan Franzén

Geocoderを毎回作成するのではなく、アプリケーションのシングルトンとして導入すればうまくいきます。必ずワーカースレッドからGeocoder.getFromLocationName()を呼び出してください。

例えば:

class Application {
    private val geoCoder = Geocoder(context, Locale.getDefault())
    ...
}

class SomeClass {

    @WorkerThread
    fun doSmth(){
       application.geoCoder.getFromLocationName("London", 10)
       ...
    }
}
0

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));
    }
0
Asad Mukhtar

この問題は既に報告されており、他のスタックポストでそれについて話しているのを見つけることができます。 ここ は、ジオコーダーがクラッシュするさまざまな方法のいくつかに関するGoogleの問題に関するコメントです。アプリケーションが停止しないように、コードの一部をtry and catchで囲むことをお勧めします。

0
HartWoom