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

时间:2017-11-16 13:53:39

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

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

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

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

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

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

注意:我测试了Google Pixel XL,三星S6边缘,三星S4。

10 个答案:

答案 0 :(得分:9)

看起来这是Google问题跟踪器中针对真实设备和模拟器报告的持续问题。您可以参考以下错误:

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

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

不幸的是,谷歌还没有解决这些问题。

作为一种解决方法,您可以考虑使用Geocoding API网络服务。请注意,您可以在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/

我希望这有帮助!

答案 1 :(得分:6)

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

答案 2 :(得分:2)

当我在模拟器上运行时,我遇到了同样的问题。 在使用实际设备运行后,该问题已解决。

答案 3 :(得分:1)

建议通过IntentService进行通过地址解析器获取地址的调用。...但是,如果您处于快速开发模式,并且不想打扰设置服务,您可以使用try / catch块

科特林的例子:

try{
 val addressList = geocoder.getFromLocationName(locationName, 3)

 //...

}catch(e: IOException) {

 when{
  e.message == "grpc failed" -> {/* display a Toast or Snackbar instead*/ }
  else -> throw e
 }

}

答案 4 :(得分:0)

对我来说,无论是真实的设备还是模拟的设备。解决了清理项目后重新启动应用程序的问题

答案 5 :(得分:0)

launch {
    val latlng = geocode(
        Geocoder(activity, Locale.getDefault()),
        drop.text.toString()
    )
    Log.i(TAG,latlng.toString())
}
fun geocode(geoCoder: Geocoder, locationName: String) : LatLng ?{
   val addList = geoCoder.getFromLocationName(locationName, 1)
   if(addList.isNotEmpty()){
      return LatLng(addList[0].latitude,addList[0].longitude)
   }
   return null
}

我只是将呼叫放在后台线程中。由于在内部调用

时它是grpc调用
  

getFromLocationName

方法

GRPC是全局远程过程调用,使用HTTP 2.0。因此,当您拥有GRPC时,这是一个网络呼叫。因此,将其放在后台会对我有所帮助。

以上代码段位于Kotlin中,并使用协程,但您可以在Jave中使用线程或处理程序或后台线程拥有的所有其他功能来做同样的事情

我遇到了同样的错误,因此可能认为从这篇文章中读取它们是未解决的问题后将无法使用。但是后来意识到我正在从Main线程调用此方法,这就是问题所在。

希望有帮助

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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

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

答案 9 :(得分:0)

使用仿真器。我必须在设备上更新Google Play服务,然后它才能正常工作!