java.io.IOException:grpc失败

时间:2017-07-10 12:37:42

标签: java android google-maps google-geocoder

当我使用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.

26 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:6)

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

答案 2 :(得分:3)

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

答案 3 :(得分:3)

就像Google所写的那样,您不应在UI线程上调用此方法

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

我通过在新的Thread中运行此操作来解决此问题,然后如果需要更新某些UI视图,请在runOnUiThread上进行

答案 4 :(得分:2)

我在使用geocoder.getFromLocation()方法获取地址列表时遇到了这个问题,问题是从纬度,经度获取地址列表会花费时间,或者在一些慢速的设备上会花费更多的时间,有时它还会给我java -io-ioexception-grpc失败。

我使用Rx Java解决了这个问题。

public class AsyncGeocoder {

private final Geocoder geocoder;

public AsyncGeocoder(Context context) {
    geocoder = new Geocoder(context);
}

public Disposable reverseGeocode(double lat, double lng, Callback callback) {
    return Observable.fromCallable(() -> {
        try {
            return geocoder.getFromLocation(lat, lng, 1);
        } catch (Exception e) {
            AppLogger.d("throwable,", new Gson().toJson(e));
            e.printStackTrace();
        }
        return false;
    }).subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(result -> {
                //Use result for something
                AppLogger.d("throwable,", new Gson().toJson(result));

                callback.success((Address) ((ArrayList) result).get(0));
            }, throwable -> AppLogger.d("throwable,", new Gson().toJson(throwable)));
}

public interface Callback {
    void success(Address address);

    void failure(Throwable e);
}
}

呼叫位置

mViewModel.getLocation(asyncGeocoder, getLat(), getLng(), this);

ViewModel方法

public void getLocation(AsyncGeocoder geocoder, Double lat, Double lng, AsyncGeocoder.Callback callback) {
        getCompositeDisposable().add(geocoder.reverseGeocode(lat, lng, callback));
    }

答案 5 :(得分:1)

我认为这取决于设备的位置。因为Google地图有时在某些区域无法正常工作。我来自伊朗,在真实设备和仿真器上也遇到了这个问题。一段时间后,我使用了一个vpn应用程序,它可以在实际设备和仿真器上运行。因为VPN应用程序更改了我的IP地址。

答案 6 :(得分:1)

根据我的经验,我可以说此错误是由Geocoder的{​​{1}}方法引发的。因此,请不要执行以下操作:

  • 请勿在主线程上调用此方法。这将冻结UI,如果依赖于此方法结果的任何内容崩溃。处理这种情况。
  • 当没有互联网连接时,将再次抛出getFromLocation()。同样,任何依赖于此方法结果的操作都会崩溃。处理这种情况。

答案 7 :(得分:1)

在Wifi连接中工作正常,但在3g或4g中连接失败。

使用代理

答案 8 :(得分:1)

截至2019年8月,当我通过代理窥探自己的http流量时,我仍然会不时收到此消息。关闭它,问题就消失了。

答案 9 :(得分:1)

经过一些研究找出了解决方法之后,就我而言,将代码放入新的Thread或使用GeocodingApi等所有方式都行不通,我只是确定

play-services-base

play-services-location

具有与以下相同的版本:

implementation 'com.google.android.gms:play-services-base:17.1.0'

implementation 'com.google.android.gms:play-services-location:17.1.0'

答案 10 :(得分: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
    }
  }
};

答案 11 :(得分:1)

我终于通过对25版SDK,Build Tools和API模拟器使用以下配置来实现这一目的。

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

还使用Google API版本11.0.2。

答案 12 :(得分:0)

已经报告了此问题,您可以找到其他谈论此问题的文章。 Here是对Google问题的评论,其中包含地址解析器崩溃的几种不同方式。我建议您使用try and catch来包围代码的一部分,以使您的应用程序不会停止。

答案 13 :(得分:0)

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

答案 14 :(得分:0)

我似乎通过打开电话的顶部工具栏并仅在wifi和网络之间切换来解决此问题,我想所有虚拟设备上的操作内存都设置为2GB RAM,因此查找位置使用过多,我看到跳帧和位置无法搜索。因此,如果要消除此错误,只需从Wifi切换到Network并向后切换即可。

答案 15 :(得分:0)

就我而言,我删除了AVD并重新安装它,一切正常。

答案 16 :(得分:0)

这对我有用。

SomeTimes Geocoder在纬度和经度包含超过3个小数位时失败,或者可以说Geocoder无法解码每个纬度和经度。您需要将纬度和经度限制为小数点后3位。


    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();

来源:https://github.com/xamarin/Essentials/issues/759#issuecomment-621270050

答案 17 :(得分:0)

我遇到了相同的问题,但不知道问题出在哪里。完全...直到最近,我才开始注意到配置代理后该问题出现在实际设备上。当我在MAC上使用charles时,没有任何问题,但是当我在Linux上开始使用MITM时,这个问题每次都会无休止地弹出。可能需要另外配置MITM。但最重要的是,如果您关闭代理,就可以了。

所以也许可以看看。

答案 18 :(得分:0)

嗨,我在返回旧项目/测试手机后遇到“grpc 失败”错误。

我的代码正在调用 getFromLocation() 方法并且失败了。阅读和玩了几个小时,我想我会检查谷歌地图是否有效,它在空白地图上显示了我的位置,wifi 已关闭,所以我打开了 WIFI,地图工作正常。

重新测试的应用程序,瞧,我的 getFromLocation() 方法正在运行,所以在定位服务区域一定有一些粘滞的东西......

答案 19 :(得分:0)

当我的真实设备上没有Internet连接时,我可以重现此问题(java.io.IOException:grpc失败)。

答案 20 :(得分:0)

SomeTimes Geocoder在纬度和经度包含超过3个小数位时失败,或者可以说Geocoder无法解码每个纬度和经度。您需要将纬度和经度限制为最多3个小数位。完整的代码

        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();

答案 21 :(得分:0)

AOA!将准确度设备Gps的模式设置为(仅gps)即时选择其他选项,然后尝试...

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

答案 22 :(得分: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. 在物理设备上重新安装您的应用程序,并多次使缓存无效/重新启动项目。

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

答案 23 :(得分:0)

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

例如:

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

class SomeClass {

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

答案 24 :(得分:0)

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

答案 25 :(得分:-1)

<强>更新

现在问题似乎已经解决了。我不确定问题是否在我的最后,所以如果您在此帖之前遇到此问题,请重新运行您的应用并查看它是否现在正常运行。

如果它仍然不起作用,这就是我自己做的“可能”使它起作用的东西:

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