无法向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
相关产品推荐
相关产品推荐

