【问题标题】:Geocoder.getFromLocation grpc failed on Android real deviceGeocoder.getFromLocation grpc 在 Android 真实设备上失败
【发布时间】:2018-04-30 02:22:36
【问题描述】:

我需要从纬度和经度中获取城市和州。地理编码器执行此功能以获取城市和州。但我只在 Android 真实设备 上收到错误java.io.IOException: grpc failed。它在模拟器中运行良好。

new Geocoder(context).getFromLocation(latLng.latitude, latLng.longitude, 1).get(0);

我也一直在使用 Asynctask 调用此函数,这在另一篇帖子 Geocoder grpc failed in stack overflow 中提出,但对我没有任何作用。

我也重启了设备,但还是失败了。

这里需要帮助。提前致谢。

注意:我在 Google Pixel XL、Samsung S6 edge、Samsung S4 上进行了测试。

【问题讨论】:

标签: android google-maps latitude-longitude android-location google-geocoder


【解决方案1】:

看起来这是一个持续存在的问题,已在 Google 问题跟踪器中报告,适用于真实设备和模拟器。可以参考以下bug:

https://issuetracker.google.com/issues/64418751

https://issuetracker.google.com/issues/64247769

很遗憾,Google 尚未解决这些问题。

作为一种解决方法,您可以考虑使用 Geocoding API Web 服务。请注意,您可以在 Github 上找到用于 Web 服务的 Java 客户端库:

https://github.com/googlemaps/google-maps-services-java

将 Java 客户端库用于 Web 服务,您可以实现反向地理编码查找,这不会给您在使用原生 Android 地理编码器时遇到的错误。

客户端库的 Javadoc 位于

https://googlemaps.github.io/google-maps-services-java/v0.2.5/javadoc/

我希望这会有所帮助!

【讨论】:

  • 使用地理编码器即服务有效!更多信息请看这里:developer.android.com/training/location/display-address#java
  • 一年半之后,这两个错误的状态都是“新”。感谢谷歌。
  • 大声笑.. 只需将该调用放在后台线程或协程中即可
  • @ReejeshPK 您的链接不再指向正确的页面(没有地理编码器、显示地址或任何类似的概念。您能分享您的解决方案吗?
  • @Rule,只需在后台服务或异步任务中运行您的地理编码器,我猜不建议这样做,它会给出 90% 的结果,所以如果您没有得到结果,请选择API:developers.google.com/maps/documentation/geocoding/start
【解决方案2】:

检查您的互联网连接。 正在发生的事情是在搜索和结果呈现之间的某个时刻,连接要么变慢要么根本不工作。所以默认错误是没有找到GRCP。您的代码需要处理此类错误并防止地图崩溃

【讨论】:

  • 怎么做?
  • 尝试 { var connection = await internet.CheckConnection(); var Searchbar = (SearchBar)sender; /* 这将防止 GRCP Java 失败 */ if (!connection.IsSuccess) { await dialogService.ShowMessage("No address found", "请确保您没有离线。");返回; }catch(ex){ 获取异常 .... }
【解决方案3】:

对于我来说,无论是真实设备还是模拟设备。解决了我清理项目后重启应用

【讨论】:

    【解决方案4】:

    对我来说,这是设备时间。我正在做一些测试,我不得不更改设备时间。设备时间必须设置正确,否则会报此错误。

    【讨论】:

      【解决方案5】:

      这是 Android 中报告的错误,请查看@xomena 答案以获取链接。

      或者,您可以使用网络服务。将此添加到 gradle 依赖项:

      api 'com.google.maps:google-maps-services:0.10.2'
      

      获取地址的示例代码:

              val geoApiCtx = GeoApiContext.Builder()
                  .apiKey(Util.readGoogleApiKey(ctx))
                  .build()
      
              val addresses = GeocodingApi.reverseGeocode(geoApiCtx, loc).await()
      

      【讨论】:

        【解决方案6】:

        当我使用模拟器运行时,我遇到了同样的问题。 用真机运行后问题解决了。

        【讨论】:

          【解决方案7】:

          建议通过IntentService 调用通过地理编码器获取地址。但如果您处于快速开发模式并且不想费心设置服务,您可以使用 try/catch 块

          Kotlin 中的示例:

          try{
           val addressList = geocoder.getFromLocationName(locationName, 3)
           
           //...
          
          }catch(e: IOException) {
          
           when{
            e.message == "grpc failed" -> {/* display a Toast or Snackbar instead*/ }
            else -> throw e
           }
          
          }
          
          

          【讨论】:

            【解决方案8】:

            我所做的是,我将精度更改为仅 GPS,在这种情况下,应用程序没有计算我的位置。我再次将精度更改为高精度,应用程序开始工作,完全没有崩溃。您可以通过 Android 手机上的位置设置更改 GPS 精度。

            【讨论】:

              【解决方案9】:

              使用模拟器。我必须更新设备上的 Google Play 服务,然后它才能工作!

              【讨论】:

                猜你喜欢
                • 2011-12-18
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2018-04-11
                • 2020-04-23
                • 1970-01-01
                • 2013-09-16
                • 1970-01-01
                相关资源
                最近更新 更多