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

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,提问作者محمدشریف رحیمی

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 20:52:06