如何解决“代码应明确检查权限是否可用”错误

问题描述

我有一个简单的片段,旨在获取用户当前位置。

我得到的错误很明显,我们需要检查用户是否向我们授予了位置权限:

呼叫需要许可,但可能会被用户拒绝:代码应 明确检查权限是否可用(带有 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()
    }