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

自定义ActivityResultContract申请位置权限时createIntent未调用问题

问题排查与修复方案

你的代码存在两个关键问题导致createIntent方法未被调用,具体分析和修复如下:

1. 泛型声明与方法签名不匹配

你定义的LocationPermission继承自ActivityResultContract<Void?, LocationPermissionResult>,泛型第一个参数Void?表示该Contract的输入类型为无参数,但你重写的createIntent方法第二个参数却是Array<String>,这与父类的方法签名冲突,系统无法正确识别并调用该方法。

2. Activity注册代码存在语法错误

注册回调时的lambda表达式写法错误:{ result - 缺少了箭头符号,正确应为{ result ->。


修正后的完整代码

自定义LocationPermission Contract类

class LocationPermission : ActivityResultContract<Void?, LocationPermissionResult>() {
    override fun createIntent(context: Context, input: Void?): Intent {
        val requestPermissions = arrayOf(
            Manifest.permission.ACCESS_FINE_LOCATION,
            Manifest.permission.ACCESS_COARSE_LOCATION
        )

        return Intent(ActivityResultContracts.RequestMultiplePermissions.ACTION_REQUEST_PERMISSIONS)
            .putExtra(ActivityResultContracts.RequestMultiplePermissions.EXTRA_PERMISSIONS, requestPermissions)
    }

    // 必须实现parseResult方法,将系统返回的结果转换为自定义的LocationPermissionResult
    override fun parseResult(resultCode: Int, intent: Intent?): LocationPermissionResult {
        val permissions = intent?.getStringArrayExtra(ActivityResultContracts.RequestMultiplePermissions.EXTRA_PERMISSIONS) ?: emptyArray()
        val grantResults = intent?.getIntArrayExtra(ActivityResultContracts.RequestMultiplePermissions.EXTRA_GRANT_RESULTS) ?: emptyArray()
        
        val permissionMap = permissions.zip(grantResults).associate { (perm, result) ->
            perm to (result == PackageManager.PERMISSION_GRANTED)
        }

        return LocationPermissionResult(
            isFineGranted = permissionMap[Manifest.permission.ACCESS_FINE_LOCATION] ?: false,
            isCoarseGranted = permissionMap[Manifest.permission.ACCESS_COARSE_LOCATION] ?: false
        )
    }
}

// 自定义权限结果数据类
data class LocationPermissionResult(
    val isFineGranted: Boolean,
    val isCoarseGranted: Boolean
)

Activity中调用代码

private val reportLocationIntent = registerForActivityResult(LocationPermission()) { result ->
    // 处理自定义权限结果
    when {
        result.isFineGranted && result.isCoarseGranted -> {
            // 精确定位和粗略定位权限均已授予
        }
        result.isCoarseGranted -> {
            // 仅粗略定位权限授予
        }
        else -> {
            // 权限全部被拒绝
        }
    }
}

// 触发权限申请
reportLocationIntent.launch()
// 或显式传入null(因为输入类型是Void?)
// reportLocationIntent.launch(null)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 22:05:19