You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法向requestPermissions()传入变量?Android权限请求报错排查

解决requestCode未解析引用的问题

你的问题核心原因很明确:你把requestLocationPermission()定义成了类外部的私有函数,它不属于RequiresLocation类的成员,自然无法访问类内部定义的requestCode变量。另外你的代码还有几处语法和Kotlin规范的小问题,我帮你一一修正:

修正后的完整代码

import android.content.pm.PackageManager
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.support.v4.app.ActivityCompat
import android.support.v4.content.ContextCompat
import android.widget.Toast
import kotlinx.android.synthetic.main.activity_requires_location.*

class RequiresLocation : AppCompatActivity() {
    private val requestCode: Int = 1

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_requires_location)

        turnOnLocationButton.setOnClickListener {
            if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
                Toast.makeText(this, "Permission has already been granted", Toast.LENGTH_SHORT).show()
            } else {
                requestLocationPermission()
            }
        }
    }

    // 把函数移到类内部,作为成员函数
    private fun requestLocationPermission() {
        ActivityCompat.requestPermissions(
            this, // Kotlin里直接用this指代当前Activity实例,不需要RequiresLocation.class
            arrayOf(android.Manifest.permission.ACCESS_FINE_LOCATION),
            requestCode // 现在可以正常访问类内部的变量了
        )
    }

    // 补充权限请求结果的处理(官方教程里也应该包含这部分)
    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        if (requestCode == this.requestCode) {
            if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Toast.makeText(this, "Location permission granted", Toast.LENGTH_SHORT).show()
            } else {
                Toast.makeText(this, "Location permission denied", Toast.LENGTH_SHORT).show()
            }
        }
    }
}

关键修改点说明

  • 函数归属调整:将requestLocationPermission()从类外部移到RequiresLocation类内部,这样它就能访问类里的requestCode成员变量了。
  • 语法修正:你原来的函数定义private fun requestLocationPermission(): {多了一个多余的冒号,去掉后才符合Kotlin的函数语法规范。
  • 实例引用修正:Kotlin中不需要用类名.class来获取实例,直接用this就能指代当前Activity对象,传给requestPermissions的第一个参数。
  • 补充结果处理:按照官方最佳实践,我补充了onRequestPermissionsResult的重写,用来处理用户允许或拒绝权限后的逻辑。

内容的提问来源于stack exchange,提问作者Zorgan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:03:25