Java.io.IOException: GRPC 失败。

66

当我使用getFromLocationName方法时,会抛出一个IOException并显示"grpc failed"的描述信息。

运行的代码:

@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 插件已更新至最新版本。


我现在也遇到了同样的错误。 - Ronak Joshi
调用getFromLocationName会立即失败还是在一段时间后失败?每次调用它都会失败还是有时候可以工作? - AndrewR
@AndrewR 直接失败了,每一次都是这样。 - Siqve
@RonakJoshi 对我来说似乎又可以工作了,这是我的解决方案。 - Siqve
我向谷歌提交了一个错误报告,因为我经常看到相同的跟踪信息,而实际的错误描述并没有给出任何关于发生了什么的提示:https://issuetracker.google.com/issues/63973182 - saberrider
请检查您的互联网连接。我不小心关闭了互联网,然后运行我的应用程序,出现了这个错误。 - Anil Chahal
28个回答

2
我认为这取决于设备的位置,因为Google地图在某些地区有时无法正常工作。我来自伊朗,在真实设备和模拟器上也遇到了这个问题。在遇到这个问题一段时间后,我使用了一个VPN应用程序,在真实设备和模拟器上都可以使用了,因为VPN应用程序更改了我的IP地址。"最初的回答"

2

经过一些研究,我找到了解决方法。在我的情况下,所有的方法,比如将代码放在新的Thread中或使用GeocodingApi都不起作用,我只是确保

play-services-base

并且

play-services-location

有与以下版本相同的版本:

implementation 'com.google.android.gms:play-services-base:17.1.0'

implementation 'com.google.android.gms:play-services-location:17.1.0'

1

从我的经验来看,我可以说这个错误是由GeocodergetFromLocation()方法引起的。所以不要做以下事情:

  • 不要在主线程上调用此方法。这会冻结UI,如果有任何依赖于此方法结果的内容将崩溃。处理这种情况。
  • 当没有网络连接时,同样会抛出IOExeption。同样,任何依赖于此方法结果的内容都会崩溃。处理这种情况。

1
在Wifi连接正常的情况下,3g或4g连接失败。
使用代理。

1
这个问题已经有人报告过了,你可以在其他堆栈帖子中找到相关讨论。这里是一条关于Google地理编码器崩溃的评论,其中提到了一些不同的解决方法。我建议你用try和catch包围你的代码部分,这样你的应用程序就不会停止。

1

我不知道该说什么,我把我的准确度改成了仅GPS,但在这种情况下,应用程序无法计算我的位置。我又将准确度改回高精度,应用程序开始工作,没有崩溃。 - Abdul Rahman Shamair

1

我最终通过以下配置使版本25的SDK、构建工具和API模拟器正常工作。

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

同时使用谷歌API版本11.0.2。


1
使用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);

视图模型方法
public void getLocation(AsyncGeocoder geocoder, Double lat, Double lng, AsyncGeocoder.Callback callback) {
        getCompositeDisposable().add(geocoder.reverseGeocode(lat, lng, callback));
    }

0

我曾经遇到了同样的问题,不知道问题出在哪里......直到最近,当我配置代理时,在真实设备上开始注意到了这个问题。当我在MAC上使用charles时没有问题,但当我开始在Linux上使用MITM时,每次都会出现这个问题,没有例外。可能需要额外配置MITM。但最重要的是,如果关闭代理,则应该没问题。

所以也许要研究一下这个问题。


0
在我的情况下,问题似乎是由于我在快速连续调用地理编码器太多次。通过执行抖动来修复了请求。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接