java.io.IOException:grpc失败了

问题描述 投票:30回答:12

当我使用call 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插件是最新的。

提前致谢!

编辑:

问题似乎现在已经解决,这是我的solution.

java android google-maps google-geocoder
12个回答
11
投票

可能你只是在genymotion和android studio模拟器中遇到这个问题。我面临与genymotion和android工作室模拟器相同的问题,然后我在Android真实设备中检查它。这对我有用。你在真实的设备上检查过吗?


0
投票

如果将Geocoder作为应用程序的单例引入而不是每次都创建它,它对我有用。确保从工作线程调用Geocoder.getFromLocationName()。

例如:

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

class SomeClass {

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

0
投票

虽然这个问题已经很晚了,但这是Kotlin用户的答案。

我在使用Geocoder的java.io.IOException: grpc failed功能时偶然发现了这个getFromLocation错误。我一直在使用Google Pixel 2作为我的测试设备(运行Android 9)。

有三件事需要确定:

  1. 正如许多人(以及Android文档here)所述,任何与Geocoder相关的内容都需要在应用程序的主线程之外完成。为了支持我的声明,以下是Android文档的引用:“该方法是同步的,可能需要很长时间才能完成其工作,因此您不应该从应用程序的主用户界面(UI)线程中调用它。 “

现在,最好使用IntentService来完成这项任务,就像官方文档给出的一个例子一样。然而,this person用Java中的AsyncTask尝试了它并且它运行得很好(注意他们使用geocoder的任务要少得多)。因此,我强烈建议使用Anko's doAsync方法并在其中实现有关Geocoder的任何代码。

  1. 如果可能,请使用物理设备而不是仿真器。 Android Studio上的模拟器给了我很多麻烦,并没有给我提供真正调试问题所需的错误信息。
  2. 在您的物理设备上重新安装您的应用程序并多次使项目无效/重新启动您的项目。

还要确保您具有良好的网络连接,并且已在您的设备上启用。


0
投票

AOA!将设备Gps的精度模式转换为(仅gps)其他选项的瞬间,然后尝试......

为mesettings are like this , i am postie you can also find them on emulators 工作


7
投票

我多次在Android 4.4.2设备上遇到此问题。对我来说,解决方案就是重启手机。没有代码更新没有Android工作室卸载。


3
投票

今天(2017-09-16)我的Android Studio(2.3.3)获得了针对第44版的Google Play服务更新。此后问题得到解决。没有代码或设置从我这边改变。


3
投票

就像谷歌写的那样,你不应该在UI线程上调用这个方法

https://developer.android.com/training/location/display-address#java

我通过在新的Thread中运行此操作来修复此问题,然后如果我需要更新一些UI视图,我将在runOnUiThread上执行此操作


1
投票

我终于通过使用以下配置为版本25 SDK,构建工具和API模拟器来实现此功能。

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

还使用Google API版本11.0.2。


1
投票

这也发生在安装了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
    }
  }
};

1
投票

我认为这取决于设备的位置。因为谷歌地图有时在某些地区不能正常工作。我来自伊朗,我在真实的设备和模拟器上也有这个问题。过了一会儿这个问题,我使用了一个vpn应用程序,它在真实的设备和模拟器上工作。因为vpn应用程序改变了我的IP地址。


0
投票

更新:

这个问题现在似乎已经解决了。我不确定问题是否在我的最后,所以如果你在这篇文章之前遇到这个问题,请重新运行你的应用程序,看它现在是否有效。

如果它仍然不起作用,那么我自己做的事情“可能”使其成功:

  1. 我卸载并删除了与Android Studio相关的所有文件。 (不是项目文件)。
  2. 然后我重新安装了Android Studio,并重新打开了项目。
  3. 在运行应用程序时(我使用的是Android Studio内置的模拟器),我使用了不同的虚拟设备和设备API。这次我使用API​​ 23,x86_64在Pixel上运行它。

0
投票

在我的情况下,我刚刚打开(允许许可)位置来自应用程序权限设置。

© www.soinside.com 2019 - 2024. All rights reserved.