首页 > 解决方案 > 我面临 java.io.IOException: grpc failed 错误

问题描述

在我的应用程序中,我想向用户显示地址。我正在使用 Fused Location Provider API 来查找用户的当前位置,但我遇到了一些错误。我认为问题是线程。我想使用协程,但作为 kotlin 的新手,我不知道如何实现这一点。更好的理解,请看下面的代码

主要片段.kt

class MainFragment : Fragment() {

private lateinit var lat: String
private lateinit var lon: String

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    // Inflate the layout for this fragment
    val view: View = inflater.inflate(R.layout.fragment_main, container, false)
    return view
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    if (activity?.let {
            ContextCompat.checkSelfPermission(
                it, android.Manifest.permission.ACCESS_FINE_LOCATION
            )
        } != PackageManager.PERMISSION_GRANTED
    ) {
        ActivityCompat.requestPermissions(
            context as Activity,
            arrayOf(android.Manifest.permission.ACCESS_FINE_LOCATION),
            Constants.REQUEST_PERMISSION_REQUEST_CODE
        )
    } else {
        getCurrentLocation()
    }
}

override fun onRequestPermissionsResult(
    requestCode: Int,
    permissions: Array<out String>,
    grantResults: IntArray
) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults)
    if (requestCode == Constants.REQUEST_PERMISSION_REQUEST_CODE && grantResults.isNotEmpty()) {
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            getCurrentLocation()
        } else {
            Toast.makeText(context, "Permission Denied!", Toast.LENGTH_SHORT).show()
        }
    }
}

private fun getCurrentLocation() {
    var locationRequest = LocationRequest()
    locationRequest.interval = 10000
    locationRequest.fastestInterval = 5000
    locationRequest.priority = LocationRequest.PRIORITY_HIGH_ACCURACY

    //now getting address from latitude and longitude
    val geocoder = Geocoder(context, Locale.getDefault())
    var addresses: List<Address>

    if (context?.let {
            ActivityCompat.checkSelfPermission(
                it,
                Manifest.permission.ACCESS_FINE_LOCATION
            )
        } != PackageManager.PERMISSION_GRANTED && context?.let {
            ActivityCompat.checkSelfPermission(
                it,
                Manifest.permission.ACCESS_COARSE_LOCATION
            )
        } != PackageManager.PERMISSION_GRANTED
    ) {
        return
    }
    LocationServices.getFusedLocationProviderClient(context)
        .requestLocationUpdates(locationRequest, object : LocationCallback() {
            override fun onLocationResult(locationResult: LocationResult?) {
                super.onLocationResult(locationResult)
                LocationServices.getFusedLocationProviderClient(context)
                    .removeLocationUpdates(this)
                if (locationResult != null && locationResult.locations.size > 0) {
                    var locIndex = locationResult.locations.size - 1

                    lat = locationResult.locations.get(locIndex).latitude.toString()
                    lon = locationResult.locations.get(locIndex).longitude.toString()

                    addresses = geocoder.getFromLocation(lat.toDouble(), lon.toDouble(), 1)
                    var address: String = addresses[0].getAddressLine(0)
                    locationText.text = address
                }
            }
        }, Looper.getMainLooper())

}
}

错误 在此处输入图像描述

我该如何解决?谢谢

标签: androidmultithreadingkotlinkotlin-coroutinesfusedlocationproviderapi

解决方案


推荐阅读