Получение этой ошибки при попытке определить местоположение по широте и долготе с помощью геокодера.
Ошибка
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)
Код
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")
}
}
случайным образом происходит на физических устройствах ...
Проверяли ваши разрешения? Интернет и Местоположение предоставляются? Я видел, что у вас есть метод askForPermission (), но проверка активности onResult ограничивает запрос и запрашивает перед каждым вызовом проверку разрешения. Для меня это была такая же ошибка
получение ошибки от забавного sendLocationData () в строке val address: List <Address> = geocoder? .getFromLocation (location.latitude, location.longitude, 1) !!
Возможный дубликат Geocoder.getFromLocation grpc не удалось на реальном устройстве Android




Это известная ошибка, о которой было сообщено в Google, но, к сожалению, она еще не решена. Эта ошибка возникает на реальных устройствах и эмуляторах. Вы можете увидеть ветку об этой проблеме здесь:
https://issuetracker.google.com/issues/64418751
https://issuetracker.google.com/issues/64247769
Чтобы попытаться решить эту ошибку в вашем случае, попробуйте использовать веб-службу API геокодирования: https://github.com/googlemaps/google-maps-services-java
Или вы можете попробовать просто поймать исключение и обработать исключение следующим образом:
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
}
Я столкнулся с этой проблемой при получении списка адресов с помощью метода geocoder.getFromLocation (), проблема в том, что получение списка адресов по широте, долготе занимает время или на некоторых медленных устройствах требуется больше времени, а также иногда это дает мне java-io- ioexception-grpc-failed.
Я исправляю эту проблему с помощью 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));
}
Вы запускали его на эмуляторе или физическом устройстве?