如何防止设备旋转时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
相关产品推荐
相关产品推荐

