4
votes

Getting this error when trying to get location from latlong using Geocoder.

Error

Caused by java.io.IOException: grpc failed at android.location.Geocoder.getFromLocation(Geocoder.java:136) at com.example.myApp.test.Fragments.DashboardFragment$sendLocationData$1.onSuccess(DashboardFragment.kt:676) at com.example.myApp.test.Fragments.DashboardFragment$sendLocationData$1.onSuccess(DashboardFragment.kt:81) at com.google.android.gms.tasks.zzj.run(Unknown Source) at android.os.Handler.handleCallback(Handler.java:751) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6776) at java.lang.reflect.Method.invoke(Method.java) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1496) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1386)

Code

    punch_button?.setOnClickListener {
    createLocationRequest()
}


protected fun createLocationRequest() {
    mLocationRequest = LocationRequest()
    mLocationRequest?.interval = 10
    mLocationRequest?.fastestInterval = 50
    mLocationRequest?.priority = LocationRequest.PRIORITY_HIGH_ACCURACY
    val builder = LocationSettingsRequest.Builder()
            .addLocationRequest(mLocationRequest!!)

    mLocationCallback = object : LocationCallback() {
        override fun onLocationResult(p0: LocationResult?) {
            super.onLocationResult(p0)
            mCurrentLocation = p0?.lastLocation
        }

    }

    val client = LocationServices.getSettingsClient(context)
    val task = client.checkLocationSettings(builder.build())



    task.addOnSuccessListener(OnSuccessListener<LocationSettingsResponse> {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            askForPermission();
        }
    })  }



    private fun askForPermission() {
    if (ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        if (ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.ACCESS_FINE_LOCATION)) {
            requestPermissions(arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), 123);
        } else {
            requestPermissions(arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), 123);
        }
    } else {
        sendLocationData()
    }
}


    @SuppressLint("MissingPermission")
fun sendLocationData() {
try{
    Log.e("lat", mCurrentLocation?.latitude.toString())
    //mCurrentLocation?.latitude !=null && mCurrentLocation?.latitude !=null
    mFusedLocationClient.requestLocationUpdates(mLocationRequest, mLocationCallback, null)

    mFusedLocationClient.lastLocation.addOnSuccessListener({ location ->
        if (location != null) {
            val address: List<Address> = geocoder?.getFromLocation(location.latitude, location.longitude, 1)!!
        }
    })

}catch(e:Exception){
  Log.e("tag","error")
}
}
2
Did you run it on Emulator or physical device?Sz-Nika Janos
randomly occurring on physical devices...develope_AK
Have checked your permissions? Internet and Location are granted? I have seen that you have a method askForPermission() but check activity onResult is restringing the request and ask before every call to verify the permission. For me that was getting the same errorSz-Nika Janos
getting the error from fun sendLocationData() on line val address: List<Address> = geocoder?.getFromLocation(location.latitude, location.longitude, 1)!!develope_AK

2 Answers

3
votes

This is a know bug reported to Google, but unfortunately not solved yet. This bug happens for real devices and emulators. You can see the thread about this issue here:

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

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

A workround to try solved this bug in your case is try to use Geocoding API web service: https://github.com/googlemaps/google-maps-services-java

Or you can try just catch the except and handle the exception like this:

try{
geocoder = new Geocoder(this, Locale.getDefault())
   // ... your code that throws the exception here
}catch(e: IOException){
   Log.e("Error", "grpc failed: " + e.message, e)
   // ... retry again your code that throws the exeception
}
2
votes

I faced this issue while getting Addresses List using geocoder.getFromLocation() method, the problem is that getting addresses list from latitude,longitude takes time or on some slow devices it takes more time and, also sometimes it give me the java-io-ioexception-grpc-failed.

I fix this problem using 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);
}
}

Calling Position

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

ViewModel Method

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