Android屏幕录制:registerForActivityResult替代方案生命周期报错问题
解决registerForActivityResult抛出RESUMED状态异常问题
报错原因
registerForActivityResult 必须在LifecycleOwner(此处为你的Activity)进入STARTED状态之前完成注册,也就是要在onCreate()方法中初始化。你把注册代码放在了原startActivityForResult的位置(比如点击事件回调、RESUMED阶段后的逻辑里),此时Activity已经处于RESUMED状态,违反了生命周期绑定要求,所以抛出异常。
修正步骤
- 将
ActivityResultLauncher声明为Activity的成员变量,不要在方法内部临时定义 - 在
onCreate()方法中完成注册逻辑 - 在需要触发录屏权限的位置,调用launch方法启动Intent
修正后的代码示例
class MyActivity : AppCompatActivity() { private lateinit var mProjectionManager: MediaProjectionManager // 声明成员变量 private lateinit var startMediaProjection: ActivityResultLauncher<Intent> override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) mProjectionManager = getSystemService(MediaProjectionManager::class.java) // 在onCreate中完成注册 startMediaProjection = registerForActivityResult( ActivityResultContracts.StartActivityForResult() ) { result -> if (result.resultCode == RESULT_OK) { val mMediaProjection = mProjectionManager.getMediaProjection(result.resultCode, result.data!!) // 这里可以继续处理录屏逻辑 } } // 原startActivityForResult所在的触发逻辑(比如点击按钮) findViewById<Button>(R.id.btn_start_record).setOnClickListener { // 调用launch启动权限请求 startMediaProjection.launch(mProjectionManager.createScreenCaptureIntent()) } } }
关键说明
- 成员变量声明
private lateinit var startMediaProjection: ActivityResultLauncher<Intent>确保注册后的Launcher可以在整个Activity生命周期内复用 - 注册逻辑必须放在
onCreate()中,此时Activity处于CREATED状态,尚未进入STARTED/RESUMED,符合生命周期要求 - 触发权限请求的launch方法可以在任意生命周期阶段调用(比如点击事件、业务逻辑触发)
内容的提问来源于stack exchange,提问作者محمدشریف رحیمی
相关产品推荐
相关产品推荐

