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个回答

25
当我的真实设备没有网络连接时,我可以复现这个问题(java.io.IOException: grpc 失败)。

我可以确认这一点。当我切换到飞行模式时,我注意到了它。 - Daniel
1
根据Android文档,这是预期的:如果网络不可用或发生任何其他I/O问题,则会抛出IOException异常 - HelloWorld
我也遇到了同样的事情。 - Vindhya Sharma

21

1
是的,那很有道理...谢谢!我投了赞成票。 - superUser
3
我认为真正的问题一定是出在别处,因为我使用“Geocoder”时也遇到了同样的grpc问题,但将操作移至新线程并没有解决任何问题,只是导致我延迟10秒钟后收到相同的错误。 - ahmadPH

18
这个问题在我的设备上出现了(即使我是在后台线程中发起请求),但只出现在 Android Studio 模拟器上。一个奇怪的解决方法是打开然后关闭飞行模式!

这对我也有效。然而,我担心用户是否需要知道它才能在他们的设备上使我的应用程序工作。 - Jean Patricio
也为我工作 - Gundu Bandgar

17

也许你只在Genymotion和Android Studio模拟器中遇到了这个问题。我曾经在Genymotion和Android Studio模拟器中遇到过同样的问题,然后我检查了一下在真实的安卓设备上是否存在该问题。对我而言,它可以正常工作。你有在真实设备上检查过吗?


我实际上并没有使用Genymotion,而是使用Android Studio内置的模拟器。抱歉在帖子中没有澄清这一点。 - Siqve
1
我在Android模拟器中也遇到了错误,但在真实设备上它运行良好。 - Ankit Dubey
我在三星Galaxy A51设备上得到了这个。 - Sachin

14

我在Android 4.4.2设备上多次遇到这个问题。对我来说,解决方案很简单,只需重新启动手机即可。无需更新代码,也不需要卸载Android Studio。


1
我曾使用内存加速器来释放RAM。我认为它杀死了服务。在我重新启动设备后,它正常工作了。 - Irshu
1
我在我的真实设备(三星Galaxy Tab 3 8.0)上遇到了同样的问题,它运行着Android 4.4.2。解决方法就是重新启动平板电脑。 - yuralife
1
重启模拟器的解决方案对我有效。谢谢Aamir Rafiq。 - Parthan_akon

6
截至2019年8月,当我使用代理检查自己的http流量时,有时会收到这个提示。关闭它后问题消失。

6
这也在我安装了Oreo的三星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
    }
  }
};

NetworkUtil 可以在以下链接中找到:https://dev59.com/ql8e5IYBdhLWcg3wfajw#25678314 - Aliton Oliveira

4
虽然有些晚,但这里提供给使用 Kotlin 的用户一个答案。在使用 Geocoder 的 getFromLocation 函数时,我遇到了 java.io.IOException: grpc failed 错误。我的测试设备是 Google Pixel 2(运行 Android 9)。需要确保以下三点:
1.正如许多人所指出的(以及在 Android 文档 here 中),与 Geocoder 相关的任何内容都需要在应用程序的主线程之外完成。为支持我的说法,这里引用 Android 文档中的一句话:“该方法是同步的,可能需要很长时间才能完成其工作,因此您不应从应用程序的主用户界面 (UI) 线程调用它。”
现在,最好使用IntentService来完成此任务,正如官方文档所示的那样。然而,这个人尝试使用Java中的AsyncTask,并且工作得非常好(请注意,他们使用geocoder的任务要少得多)。因此,我强烈建议使用AnkodoAsync方法,并在其中实现任何与Geocoder相关的代码。
  1. 如果可能的话,请使用物理设备而不是模拟器。 Android Studio上的模拟器给我带来了很多麻烦,并且没有给我需要真正调试问题的错误信息。

  2. 在物理设备上重新安装应用程序并多次无效缓存/重启项目。

还请确保您有良好的网络连接,并在设备上启用它。


4

有时候当纬度和经度超过三位小数时,Geocoder会失败,或者说Geocoder不能解码每一个纬度和经度。你需要将纬度和经度限制在三位小数以内。完整代码:

        DecimalFormat df = new DecimalFormat();
        df.setMaximumFractionDigits(3);

        double lat = Double.parseDouble(df.format(currentUserLocation.latitude));
        double lon = 
        Double.parseDouble(df.format(currentUserLocation.longitude));
        Geocoder geocoder = new Geocoder(myContext, Locale.getDefault());

        List<Address> addresses  = geocoder.getFromLocation(lat,lon, 1);

        String cityName = addresses.get(0).getLocality();

将小数位数限制为3可以为我解决这个错误 await Geocoding.GetPlacemarksAsync(Math.Round(lat, 3), Math.Round(lon, 3)) - Drytin

3
今天(2017-09-16),我的Android Studio(2.3.3)更新了Google Play服务44版。问题在此后被解决,我并没有进行任何代码或设置方面的更改。

1
就像 Android Studio 的任何其他更新一样:如果有可用的更新,您将收到通知,或者您可以在 Android Studio 菜单中手动选择“检查更新...”。 - Tobus

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