質問
起動するとスクリーンショットを取る処理を実装しています。mediaProjectionManagerの使用許可ダイアログを出すところまでは順調、つまり permissionIntentLauncher.launch(intent) までは動いています。しかし、ダイアログのボタンを押してもregisterForActivityResultのコールバックが呼び出されません。これは何が原因か教えて頂きたいです。
試したこと
下記をもとに、registerForActivityResultをrequestScreenCapturePermission内ではなくMainActivityの初期化時に呼び出されるようにしました。
Register a request to start an activity for result, designated by the given contract. This creates a record in the registry associated with this caller, managing request code, as well as conversions to/from Intent under the hood. This must be called unconditionally, as part of initialization path, typically as a field initializer of an Activity or Fragment.
コード
Kotlin
1class MainActivity : AppCompatActivity() { 2 private lateinit var permissionCallbackWaiter: CallbackWaiter<ActivityResult> 3 private val permissionIntentLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult -> 4 permissionCallbackWaiter.resume(result) 5 } 6 7 override fun onCreate(savedInstanceState: Bundle?) { 8 super.onCreate(savedInstanceState) 9 10 runBlocking { 11 val screenshot = takeScreenshot() 12 } 13 } 14 15 private suspend fun takeScreenshot(): Image { 16 val capture = DeviceCapture(this) 17 val mediaProjection = createMediaProjection() 18 19 return suspendCoroutine { continuation -> 20 capture.run(mediaProjection) { result: Image -> 21 capture.stop() 22 continuation.resume(result) 23 } 24 } 25 } 26 27 private suspend fun requestScreenCapturePermission(intent: Intent): ActivityResult { 28 val activityResult = suspendCoroutine<ActivityResult> { continuation -> 29 permissionIntentLauncher.launch(intent) 30 permissionCallbackWaiter = CallbackWaiter(continuation) 31 } 32 33 if (activityResult.resultCode == RESULT_OK) { 34 return activityResult 35 } 36 37 throw Exception("Not authorized to capture") 38 } 39 40 private suspend fun createMediaProjection(): MediaProjection { 41 val mediaProjectionManager = getSystemService(MEDIA_PROJECTION_SERVICE) as MediaProjectionManager 42 val intent = mediaProjectionManager.createScreenCaptureIntent() 43 val permissionRequestResult = requestScreenCapturePermission(intent) 44 return mediaProjectionManager.getMediaProjection(permissionRequestResult.resultCode, intent) 45 } 46} 47 48// CallbackWaiter 49class CallbackWaiter<T> (private val continuation: Continuation<T>) { 50 fun resume(value: T) { 51 continuation.resume(value) 52 } 53}
補足
Android API 24

回答1件
あなたの回答
tips
プレビュー