无法使用原生代码在 V2 Flutter 中截屏,它在 V1 Flutter 中运行良好

Posted

技术标签:

【中文标题】无法使用原生代码在 V2 Flutter 中截屏,它在 V1 Flutter 中运行良好【英文标题】:Unable to take screenshot in V2 Flutter using native code, it was working well in V1 Flutter 【发布时间】:2020-09-13 05:41:35 【问题描述】:

我们正在构建一个 SDK,它会在应用集成后对其进行截图。我们能够为 Native android、Native ios、Cordova、IONIC、React Native、Xamarin 平台截屏。但是无法在 V2 Flutter 中拍摄快照。代码在 V1 Flutter 之前运行良好。但是,当在 V2 Flutter 上执行相同的本机代码时,会返回应用程序的黑色屏幕截图。

这里的问题是,V1 的 FlutterView 使用名为 registrar.view() 的方法对第三方插件公开可用,在 V2 中,此视图现在不会暴露给任何插件! https://api.flutter.dev/javadoc/io/flutter/plugin/common/PluginRegistry.Registrar.html 使用 V1 的 FlutterView,我们能够使用 PixelCopy 捕获视图的屏幕截图,但我们无法获取 V2 的 FlutterView,我们也没有找到任何解决方案来捕获它。

我们尝试了以下方法,但没有成功。有人可以帮我吗?

    试图从我们在 SDK 中传递的上下文中获取活动 初始化,我们从活动中获取视图并尝试绘制它, 正在捕获空白屏幕截图 尝试将 SDK Flutter 插件迁移到 V2 使用 https://flutter.dev/docs/development/packages-and-plugins/plugin-api-migration 试图遍历视图层次结构并使用 Activity 绘制视图 上下文,正在捕获空白屏幕截图 尝试绘制从 FlutterActivity.getWindow().getDecorView().getRootView(),空白 正在捕获屏幕截图。

【问题讨论】:

你解决了吗? 【参考方案1】:

您可以查看其GitHub 上的Screenshoot package 代码是如何做到的。该软件包是 Flutter v2 的最新版本。

包使用:

通过GlobalKey 获取当前小部件的render object。 GlobalKey _containerKey = GlobalKey().currentContext?.findRenderObject(); 然后它转换为RenderRepaintBoundaryRenderRepaintBoundary boundary = findRenderObject as RenderRepaintBoundary; 获取设备的像素比例。 pixelRatio = pixelRatio ?? MediaQuery.of(context).devicePixelRatio; 最后,它创建了图像。 ui.Image image = await boundary.toImage(pixelRatio: pixelRatio ?? 1);

查看下面的完整代码:

Future<ui.Image?> captureAsUiImage(
      double? pixelRatio: 1,
      Duration delay: const Duration(milliseconds: 20)) 
    //Delay is required. See Issue https://github.com/flutter/flutter/issues/22308
    return new Future.delayed(delay, () async 
      try 
        var findRenderObject =
            this._containerKey.currentContext?.findRenderObject();
        if (findRenderObject == null) 
          return null;
        
        RenderRepaintBoundary boundary =
            findRenderObject as RenderRepaintBoundary;
        BuildContext? context = _containerKey.currentContext;
        if (pixelRatio == null) 
          if (context != null)
            pixelRatio = pixelRatio ?? MediaQuery.of(context).devicePixelRatio;
        
        ui.Image image = await boundary.toImage(pixelRatio: pixelRatio ?? 1);
        return image;
       catch (Exception) 
        throw (Exception);
      
    );
  

【讨论】:

以上是关于无法使用原生代码在 V2 Flutter 中截屏,它在 V1 Flutter 中运行良好的主要内容,如果未能解决你的问题,请参考以下文章

在 Xcode 中截屏

以编程方式在 iPad 中截屏

有没有办法用 vba 在 MS-Access 中截屏?

检测用户何时在 Unity 中截屏

如何在 React Native 中截屏测试?

win32gui在python3.7中截屏会导致内存泄漏