在我看来,这样做的问题是您必须保证在您自己的活动的OnCreate()完成之前调用registerForActivityResult()。OnCreate()显然不是一个挂起的函数,所以我不能将registerForActivityResult()和ActivityResultLauncher.launch()包装在suspendCoroutine{}中以等待回调,因为我不能从OnCreate启动suspendCoroutine并等待它完成,然后让OnCreate完成...
...which我确实认为我可以使用runBlocking{},但我发现在OnCreate中调用runBlocking会导致应用程序永远挂起,而不会运行runBlocking{}块中的代码。
所以我的问题是,runBlocking{}是否是正确的答案,但我使用它是错误的,或者是否有其他方法可以在协程中使用registerForActivityResult(),或者根本不可能。
发布于 2021-06-23 20:23:02
你可以做这样的事情。请参考下面的实现。
class RequestPermission(activity: ComponentActivity) {
private var requestPermissionContinuation: CancellableContinuation<Boolean>? = null
@SuppressLint("MissingPermission")
private val requestFineLocationPermissionLauncher =
activity.registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->
requestPermissionContinuation?.resumeWith(Result.success(isGranted))
}
suspend operator fun invoke(permission: String) = suspendCancellableCoroutine<Boolean> { continuation ->
requestPermissionContinuation = continuation
requestFineLocationPermissionLauncher.launch(permission)
continuation.invokeOnCancellation {
requestPermissionContinuation = null
}
}
}确保在活动的onStart之前初始化这个类。在activity的onStart之前调用registerForActivityResult接口。请参考下面的示例
class SampleActivity : AppCompatActivity() {
val requestPermission: RequestPermission = RequestPermission(this)
override fun onResume() {
super.onResume()
lifecycleScope.launch {
val isGranted = requestPermission(Manifest.permission.ACCESS_FINE_LOCATION)
//Do your actions here
}
}
}https://stackoverflow.com/questions/65277180
复制相似问题