自定义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
相关产品推荐
相关产品推荐

