Android Studio 不断显示缺少权限,即使我正在明确处理它。我如何解决它?

标签 android kotlin android-permissions

每次使用 Google Map API 时,我都会像下面这样添加与位置相关的内容,Android Studio 会不断显示错误:

private fun enableMyLocationOnMap() {
        googleMap.setPadding(0, ViewUtils.dpToPx(48f), 0, 0)
        googleMap.isMyLocationEnabled = true //<----ERROR
}

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

我正在明确处理权限:

    override fun onStart() {
        super.onStart()
        when {
            PermissionUtils.isAccessFineLocationGranted(this) -> {
                when {
                    PermissionUtils.isLocationEnable(this) -> {
                        setUpLocationListener()
                    }
                    else -> {
                        PermissionUtils.showGPSNotEnableDialog(this)
                    }
                }
            }
            else -> {
                PermissionUtils.requestAccessFineLocation(
                    this
                    , LOCATION_PERMISSION_REQUEST_CODE
                )
            }
        }
    }

    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        when (requestCode) {
            LOCATION_PERMISSION_REQUEST_CODE -> {
                if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    when {
                        PermissionUtils.isLocationEnable(this) -> {
                            setUpLocationListener()
                        }
                        else -> {
                            PermissionUtils.showGPSNotEnableDialog(this)
                        }
                    }
                } else {
                    Toast.makeText(this, "Location Permission not granted", Toast.LENGTH_LONG)
                        .show()
                }
            }
        }
    }

其中 PermissionUtils.kt :

object PermissionUtils {
    fun requestAccessFineLocation(activity: AppCompatActivity, requestId: Int) {
        ActivityCompat.requestPermissions(
            activity,
            arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),
            requestId
        )

    }

    fun isAccessFineLocationGranted(context: Context): Boolean {
        return ContextCompat.checkSelfPermission(
            context,
            Manifest.permission.ACCESS_FINE_LOCATION
        ) == PackageManager.PERMISSION_GRANTED
    }

    fun isLocationEnable(context: Context): Boolean {
        val locationManager: LocationManager = context.getSystemService(Context.LOCATION_SERVICE) as LocationManager
        return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)
                || locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)
    }

    fun showGPSNotEnableDialog(context: Context) {
        AlertDialog.Builder(context)
            .setTitle(context.getString(R.string.enable_gps))
            .setMessage(context.getString(R.string.required_for_this_app))
            .setCancelable(false)
            .setPositiveButton(context.getString(R.string.enable_now)) { _, _ ->
                context.startActivity(Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS))
            }
            .show()
    }
}

AndroidManifest.xml有:

<uses-permission android:name="android.permission.INTERNET" />

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

最佳答案

Android Studio 无法“看到”您在代码中的其他位置进行了检查。此外,理论上用户可以在您检查权限和使用权限之间撤销权限。

使用权限前需要直接进行检查。例如:

private fun enableMyLocationOnMap() {
    if (ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
        googleMap.setPadding(0, ViewUtils.dpToPx(48f), 0, 0)
        googleMap.isMyLocationEnabled = true //<----ERROR
    } else {
        // request permission flow
    }
}

关于Android Studio 不断显示缺少权限,即使我正在明确处理它。我如何解决它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63213971/

相关文章:

android - 如何通过其他平台共享图像

android - 将应用程序发布到 Playstore - 上传 .apk 时出错

maven - Kotlin Maven 插件中如果为空则跳过

android - 使用 Android 23+ 确定 list 中是否存在权限

android - 如何在自定义 View 中使用行宽修饰符?

scala - Kotlin:花括号围绕几个表达式(或语句)

android - system/etc/permissions 中的 privapp-permissions.xml 和 system/etc/default-permissions 中的 default-permissions.xml 有什么区别?

Android Border Less 按钮按下状态背景色

android - 垂直拆分布局 Android

android - Nexus 9 中的 64 位媒体服务器