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

如何防止设备旋转时Flutter插件与引擎断开连接?

解决Flutter录屏插件旋转中断问题

核心原因

Android设备旋转时,系统默认会销毁并重建Activity,导致Flutter插件触发onDetachedFromEngine断开与引擎的连接,同时依赖Activity的录制进程也会被中断。

具体解决方案

1. 精准控制屏幕方向锁定时机

不要在onAttachedToActivity里直接锁定方向,而是在启动录制的方法中动态锁定,录制结束后再解锁,避免影响正常的屏幕旋转需求:

@Override
public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
    switch (call.method) {
        case "startRecording":
            // 启动录制时锁定方向
            if (activity != null) {
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
            }
            // 执行录制逻辑
            startScreenRecording();
            result.success(true);
            break;
        case "stopRecording":
            // 停止录制后解锁方向
            if (activity != null) {
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
            }
            // 停止录制逻辑
            stopScreenRecording();
            result.success(recordedFilePath);
            break;
        // 其他方法...
    }
}

2. 将录制逻辑迁移到后台Service

把录屏核心逻辑放到Android的Service中运行,Service不受Activity生命周期影响,即使Activity因旋转重建,录制进程也能持续:

  • 创建ScreenRecordService,在其中实现MediaProjection的录制逻辑
  • 启动录制时通过startForegroundService启动Service(Android 8.0+需前台Service,避免被系统杀死)
  • 插件通过MethodChannel和Service通信,控制录制的开始/停止

3. 优化插件生命周期绑定

避免在onDetachedFromEngine中销毁所有关键资源,确保录制相关的引用(比如Service连接、MediaProjection实例)在Activity重建后能重新关联:

@Override
public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
    // 仅清空MethodCallHandler,保留录制相关全局引用
    methodChannel.setMethodCallHandler(null);
    System.out.println("detaching engine");
}

@Override
public void onReattachedToEngineForConfigChanges(@NonNull FlutterPluginBinding binding) {
    // 配置变更(如旋转)后重新绑定MethodChannel
    methodChannel = new MethodChannel(binding.getBinaryMessenger(), CHANNEL_NAME);
    methodChannel.setMethodCallHandler(this);
}

额外注意

  • 确保申请对应权限:android.permission.RECORD_AUDIO、android.permission.WRITE_EXTERNAL_STORAGE(Android 13+对应android.permission.READ_MEDIA_VIDEO)、android.permission.FOREGROUND_SERVICE_MEDIA_PROJECTION
  • 处理MediaProjection的生命周期,避免内存泄漏

内容的提问来源于stack exchange,提问作者jdevp2

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 10:42:12