代码之家  ›  专栏  ›  技术社区  ›  Siqve

java.io。IOException:grpc失败

  •  64
  • Siqve  · 技术社区  · 7 年前

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

    提前感谢!

    编辑:

    solution.

    27 回复  |  直到 7 年前
        1
  •  23
  •   vvkatwss vvkatwss    5 年前

        2
  •  21
  •   Daniele    6 年前

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

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

    Thread ,然后如果我需要更新一些UI视图,我会在 runOnUiThread

        3
  •  17
  •   Arti Patel    7 年前

    可能你只是在genymotion和android studio emulator中遇到了这个问题。我在genymotion和android studio emulator上也遇到了同样的问题,然后我在android real device上进行了检查。它对我很好。你在真实设备上检查过了吗?

        4
  •  17
  •   xjcl    4 年前

        5
  •  14
  •   Aamir Rafiq    7 年前

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

        6
  •  6
  •   Lubos Prague    6 年前

    它只发生在我打开飞行模式时(不总是-意味着可能在某些时候缓存了一些东西)。我没有探究地理编码器的本质,但我认为它需要某种连接才能获得信息(这也解释了为什么在模拟器上经常发生这种情况)。 对我来说,解决方案是检查网络连接状态,只有在 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
        }
      }
    };
    
        7
  •  6
  •   Johan Franzén    5 年前

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

        8
  •  4
  •   Muhammad Hassaan    5 年前

    有时,当纬度和经度包含小数点后3位以上时,地理编码器失败,或者可以说,地理编码器无法解码每个纬度和经纬度。您需要将纬度和经度限制为小数点后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();
    
        9
  •  3
  •   Tobus    7 年前

    谷歌服务 。问题随后得到解决。我这边没有代码或设置更改。

        10
  •  3
  •   codeabiswas    5 年前

    虽然这个问题已经很晚了,但这里有一个答案 科特林 用户。

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

    有三件事需要确保:

    1. here ),任何与 Geocoder 需要完成 从应用程序的主线程。 为了支持我的说法,这里引用了Android文档:

    现在,最好使用 IntentService this person 用Java中的AsyncTask进行了尝试,效果很好(注意,他们的任务 geocoder 强度要小得多)。因此,我强烈建议使用 Anko's doAsync 方法并实现任何关于 地理编码器

    1. 如果可能,请使用物理设备而不是模拟器。Android Studio上的模拟器给了我很多麻烦,没有给我真正调试问题所需的错误信息。

        11
  •  2
  •   Ali Khazaei    5 年前

    我认为这取决于设备的位置。因为谷歌地图有时在某些领域不能正常工作。我来自伊朗,在真实设备和模拟器上也遇到了这个问题。解决这个问题一段时间后,我使用了一个vpn应用程序,它在真实的设备和模拟器上工作。因为vpn应用程序更改了我的ip地址。

        12
  •  2
  •   Erfan    4 年前

    在做了一些研究之后,找出了解决这个问题的方法,在我的例子中,所有的方法都像是将代码放入新的 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'
    
        13
  •  1
  •   SagunKho    7 年前

    我最终通过使用25版SDK、构建工具和API模拟器的以下配置实现了这一点。

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

        14
  •  1
  •   Ch Tpx    5 年前
        15
  •  1
  •   Asad Mukhtar    5 年前

    我在使用地理编码器获取地址列表时遇到了这个问题。getFromLocation()方法,问题是从纬度、经度获取地址列表需要时间,或者在一些速度较慢的设备上需要更多时间,而且有时它会导致java io异常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);
    

    public void getLocation(AsyncGeocoder geocoder, Double lat, Double lng, AsyncGeocoder.Callback callback) {
            getCompositeDisposable().add(geocoder.reverseGeocode(lat, lng, callback));
        }
    
        16
  •  1
  •   HartWoom    5 年前

    这个问题已经被报道过了,你可以找到其他关于它的帖子。 Here 是对谷歌问题的评论,与geocoder崩溃的一些不同方式。我建议您用try-and-catch围绕您的代码部分,这样您的应用程序就不会停止。

        17
  •  1
  •   Armin Haghighi    5 年前

    使用代理

        18
  •  1
  •   Abhishek A Udupa    5 年前

    根据我的经验,我可以说这个错误是由 Geocoder getFromLocation() 方法因此,不要执行以下操作:

    • IOExeption 将被抛出。同样,任何依赖于此方法结果的操作都将崩溃。处理这个案子。
        19
  •  0
  •   Cool    6 年前

    在我的例子中,我刚刚打开(权限授予)应用程序权限设置的位置。

        20
  •  0
  •   Nikolay Nikiforchuk    6 年前

    class Application {
        private val geoCoder = Geocoder(context, Locale.getDefault())
        ...
    }
    
    class SomeClass {
    
        @WorkerThread
        fun doSmth(){
           application.geoCoder.getFromLocationName("London", 10)
           ...
        }
    }
    
        21
  •  0
  •   jos_fzr    4 年前

    我也遇到过同样的问题,不知道问题出在哪里。至少……直到最近,我才开始注意到,当我配置代理时,这个问题出现在一个真实的设备上。当我在MAC上使用charles时,这没有问题,但当我开始在Linux上使用MITM时,这个问题每次都会出现,无一例外。可能需要另外配置MITM。但底线是,如果你关掉代理,你应该没事。

    所以,也许要调查一下。

        22
  •  0
  •   Mindaugas Kolesnikovas    4 年前

    我似乎已经解决了这个问题,打开手机顶部的工具栏,在wifi和网络之间切换,我猜所有虚拟设备上的操作内存都设置为2GB RAM,查找位置只是使用了太多,因此,我看到帧中出现跳转,位置无法搜索。因此,如果它正在消除这个错误,只需从Wifi切换到网络并向后切换。

        23
  •  0
  •   Ogbonnaya Okike    4 年前

    在我的情况下,我删除了AVD并重新安装,一切都很好。

        24
  •  0
  •   Dharman Aman Gojariya    4 年前

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

    重新测试了应用程序,瞧,我的getFromLocation()方法正在工作,所以在位置服务区域一定有一些粘性。。。。

        25
  •  0
  •   Suraj Rao Raas Masood    3 年前
    List<Address> addresses  = geocoder.getFromLocation(lat,lon, 1);
    

        26
  •  0
  •   Rizwan Mohamed Kareem    2 年前

    当搜索词为空时,我也出现了同样的错误。一旦我确定它不是空的,错误就消失了。 getFromLocationName 方法

        27
  •  -8
  •   Siqve    7 年前

    更新:

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