问题描述
我得到的错误很明显,我们需要检查用户是否向我们授予了位置权限:
呼叫需要许可,但可能会被用户拒绝:代码应 明确检查权限是否可用(带有 checkPermission)或显式处理潜在的SecurityException
但是我已经进行了权限检查,基本上,如果没有用户授予我们权限就无法进行提取,那么为什么我需要检查两次?
我的流程是这样的:
global.d.ts
内部 if (activityListener.checkPermissions()) {
showMapAndFetchLocation()
}
方法
showMapAndFetchLocation
最后,在initLocationProvider()
val mapFragment =
childFragmentManager.findFragmentById(R.id.map) as SupportMapFragment?
mapFragment?.getMapAsync(callback)
方法内部
initLocationProvider
如您所见,我正在检查第一个if (isLocationEnabled()) {
fusedLocationClient //**Error**
.lastLocation //**Error**
.addOnCompleteListener { task: Task<Location> ->
val location = task.result
location?.let {
Log.d(TAG,"getUserLastLocation: LAT ${it.latitude}")
Log.d(TAG,"getUserLastLocation: LNG ${it.longitude}")
}
?: requestNewLocationData()
}
}
,然后才启动获取过程。
我真的需要检查两次还是做错了什么?
解决方法
按照@Pawel的建议,我需要添加try / catch块并捕获SecurityException异常。
现在方法如下:
try {
fusedLocationClient
.lastLocation
.addOnCompleteListener { task: Task<Location> ->
val location = task.result
location?.let {
Log.d(TAG,"getUserLastLocation: LAT ${it.latitude}")
Log.d(TAG,"getUserLastLocation: LNG ${it.longitude}")
setLngLat(it.latitude,it.longitude)
initMap()
}
?: requestNewLocationData()
}
} catch (e: SecurityException) {
activityListener.isLocationPermissionGranted()
}