Geocoder.getFromLocation grpc 在 Android 真实设备上失败

Geocoder.getFromLocation grpc failed on Android real device

我需要从纬度和经度获取城市和州。 Geocoder 执行此功能以获取城市和州。但是我仅在 Android 真实设备 上的下行中收到错误 java.io.IOException: grpc failed。它在 模拟器 .

中运行良好
new Geocoder(context).getFromLocation(latLng.latitude, latLng.longitude, 1).get(0);

此外,我一直在使用 Asynctask 调用此函数,这是另一个 post Geocoder grpc failed 在堆栈溢出中建议的,但对我没有任何作用。

我也重启了设备,但仍然失败。

此处需要帮助。提前致谢。

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

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

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

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

很遗憾,Google还没有解决这些问题。

作为解决方法,您可以考虑使用地理编码 API 网络服务。请注意,您可以在 Github:

上找到用于 Web 服务的 Java 客户端库

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

使用 Web 服务的 Java 客户端库,您可以实施反向地理编码查找,这不会给您带来您在使用本机 Android 地理编码器时遇到的错误。

客户端库的Java文档位于

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

希望对您有所帮助!

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

我在真实设备和模拟设备上都遇到过。解决了我在清理项目后重新启动应用程序的问题

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

建议通过地理编码器调用以通过 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
 }

}

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

这是 Android 中报告的错误,请查看 @xomena 对 link 的回答。

或者,您可以使用网络服务。将此添加到 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()

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

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