Android grpc 失败异常

Posted

技术标签:

【中文标题】Android grpc 失败异常【英文标题】:Android grpc failed execption 【发布时间】:2019-04-06 15:47:17 【问题描述】:

尝试使用地理编码器从 latlong 获取位置时出现此错误。

错误

由 java.io.IOException 引起:grpc failed 在 android.location.Geocoder.getFromLocation(Geocoder.java:136) 在 com.example.myApp.test.Fragments.DashboardFragment$sendLocationData$1.onSuccess(DashboardFragment.kt:676) 在 com.example.myApp.test.Fragments.DashboardFragment$sendLocationData$1.onSuccess(DashboardFragment.kt:81) 在 com.google.android.gms.tasks.zzj.run(未知来源) 在 android.os.Handler.handleCallback(Handler.java:751) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6776) 在 java.lang.reflect.Method.invoke(Method.java) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1496) 在 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 地址获取错误:List = geocoder?.getFromLocation(location.latitude, location.longitude, 1)!! Geocoder.getFromLocation grpc failed on Android real device的可能重复 【参考方案1】:

这是一个向 Google 报告的已知错误,但遗憾的是尚未解决。此错误发生在真实设备和模拟器上。您可以在此处查看有关此问题的主题:

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

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

在您的情况下尝试解决此错误的解决方法是尝试使用 Geocoding API Web 服务: 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

【讨论】:

【参考方案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));
    

【讨论】:

以上是关于Android grpc 失败异常的主要内容,如果未能解决你的问题,请参考以下文章

从 android 客户端到 python 服务器的“不可用”gRPC 失败

FAILURE:构建失败并出现异常,Android资源编译失败

Android Studio 构建失败并出现异常任务“:app:dexDebug”执行失败

构建失败并出现异常 [Android SDK 平台 25]

React Native android构建失败无异常

android studio:失败:构建失败并出现异常