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

求Android与iOS设备全屏截图解决方案:多款Flutter插件失效

Flutter实现Android/iOS全屏截图的可行方案

针对你遇到的第三方插件无法实现移动端全屏截图的问题,最可靠的方式是通过Flutter原生通道(MethodChannel)自行实现原生平台的截图逻辑,以下是分平台的具体实现思路:

已尝试插件的问题复盘

  • screen_capturer:仅支持Mac、Web、桌面平台,完全不兼容移动端
  • screen_capturer/native_screenshot_ext:版本停滞两年,无法适配Android 13+/iOS 15+等新系统API
  • screenshot:仅能捕获Flutter渲染的组件,无法包含系统状态栏、导航栏等原生UI元素

Android端实现步骤

  1. 权限与系统API选择

    • Android 10及以下:需要申请WRITE_EXTERNAL_STORAGE权限用于保存截图;Android 11+无需此权限,改用MediaStore写入文件
    • 必须使用MediaProjection API:这是Android官方提供的系统级屏幕捕获方案,需要先引导用户授予屏幕录制权限
  2. 核心原生代码示例
    在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端实现步骤

  1. 权限与API选择

    • iOS 13+:必须通过UIScreenCapturePickerViewController请求用户授权屏幕录制权限
    • 兼容方案:用ReplayKit框架捕获屏幕(支持iOS 9+),iOS 15+也可使用更高效的ScreenCaptureKit
  2. 核心原生代码示例
    在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 14:07:08