如何修复“代码应明确检查权限是不是可用”错误

Posted

技术标签:

【中文标题】如何修复“代码应明确检查权限是不是可用”错误【英文标题】:How to fix " code should explicitly check to see if permission is available " error如何修复“代码应明确检查权限是否可用”错误 【发布时间】:2020-12-09 16:43:37 【问题描述】:

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

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

调用需要权限,可能会被用户拒绝:代码应该 明确检查权限是否可用(使用 checkPermission) 或显式处理潜在的 SecurityException

但是我已经做了权限检查,基本上没有用户授权就无法获取,为什么还要检查两次呢?

我的流程是这样的:

 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()
        
 

如您所见,我正在检查第一个 if (activityListener.checkPermissions()),然后才触发获取过程。

我真的需要检查两次还是我做错了什么?

【问题讨论】:

只需添加一个try/catch(SecurityException) 块,如果您在函数内调用checkPermission,则lint 检查不会实现。 【参考方案1】:

按照@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()
    

【讨论】:

以上是关于如何修复“代码应明确检查权限是不是可用”错误的主要内容,如果未能解决你的问题,请参考以下文章

如何修复 Ubuntu 中检测到系统程序错误的问题

如何修复 C++ 中的“分段错误”错误

如何修复 WordPress 中的 HTTP 错误

分段错误错误(信号名称:SIGSEGV)的原因是啥,我将如何找到/修复它?

如何修复“找不到名称'ClipboardItem'”错误?

如何轻松修复 Checkstyle 错误?