求Android与iOS设备全屏截图解决方案:多款Flutter插件失效
Flutter实现Android/iOS全屏截图的可行方案
针对你遇到的第三方插件无法实现移动端全屏截图的问题,最可靠的方式是通过Flutter原生通道(MethodChannel)自行实现原生平台的截图逻辑,以下是分平台的具体实现思路:
已尝试插件的问题复盘
screen_capturer:仅支持Mac、Web、桌面平台,完全不兼容移动端screen_capturer/native_screenshot_ext:版本停滞两年,无法适配Android 13+/iOS 15+等新系统APIscreenshot:仅能捕获Flutter渲染的组件,无法包含系统状态栏、导航栏等原生UI元素
Android端实现步骤
权限与系统API选择
- Android 10及以下:需要申请
WRITE_EXTERNAL_STORAGE权限用于保存截图;Android 11+无需此权限,改用MediaStore写入文件 - 必须使用
MediaProjectionAPI:这是Android官方提供的系统级屏幕捕获方案,需要先引导用户授予屏幕录制权限
- Android 10及以下:需要申请
核心原生代码示例
在MainActivity.kt中实现截图逻辑:private val REQUEST_CODE_SCREEN_CAPTURE = 1001 // 初始化MediaProjectionManager val projectionManager = getSystemService(MEDIA_PROJECTION_SERVICE) as MediaProjectionManager // 触发权限请求(Flutter端调用时触发) fun requestScreenCapture() { startActivityForResult(projectionManager.createScreenCaptureIntent(), REQUEST_CODE_SCREEN_CAPTURE) } // 授权成功后创建VirtualDisplay捕获屏幕 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (requestCode == REQUEST_CODE_SCREEN_CAPTURE && resultCode == RESULT_OK) { val mediaProjection = projectionManager.getMediaProjection(resultCode, data!!) val displayMetrics = resources.displayMetrics val imageReader = ImageReader.newInstance( displayMetrics.widthPixels, displayMetrics.heightPixels, PixelFormat.RGBA_8888, 1 ) val virtualDisplay = mediaProjection.createVirtualDisplay( "ScreenCapture", displayMetrics.widthPixels, displayMetrics.heightPixels, displayMetrics.densityDpi, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, imageReader.surface, null, null ) // 从imageReader获取截图Bitmap,后续处理保存逻辑 } }
iOS端实现步骤
权限与API选择
- iOS 13+:必须通过
UIScreenCapturePickerViewController请求用户授权屏幕录制权限 - 兼容方案:用
ReplayKit框架捕获屏幕(支持iOS 9+),iOS 15+也可使用更高效的ScreenCaptureKit
- iOS 13+:必须通过
核心原生代码示例
在AppDelegate.swift中实现截图逻辑:import ReplayKit func startFullScreenCapture() { guard RPScreenRecorder.shared().isAvailable else { // 设备不支持屏幕录制 return } // 请求权限并开始录制 RPScreenRecorder.shared().startRecording(handler: { error in if let error = error { // 处理权限拒绝或其他错误 return } // 延迟1秒确保捕获到完整画面,停止录制并获取截图 DispatchQueue.main.asyncAfter(deadline: .now() + 1) { RPScreenRecorder.shared().stopRecording { previewVC, error in if let previewVC = previewVC { // 从预览控制器中提取截图帧,转成UIImage保存 } } } }) }
Flutter端调用逻辑
通过MethodChannel连接原生代码,触发截图请求:
final MethodChannel _screenCaptureChannel = MethodChannel('com.example/screen_capture'); Future<void> captureFullScreen() async { try { await _screenCaptureChannel.invokeMethod('startCapture'); // 处理截图成功后的回调逻辑 } on PlatformException catch (e) { // 处理权限拒绝、设备不兼容等错误 } }
内容的提问来源于stack exchange,提问作者Adnan Ashraf
相关产品推荐
相关产品推荐

