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

use*_*995 9 sdk android screenshot ios flutter

我们正在构建一个 SDK,一旦它被集成,它就会截取应用程序的屏幕截图。我们能够为原生 Android、原生 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,我们也没有找到任何解决方案来捕获它。

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

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

Gui*_*lem 1

您可以查看其GitHub上的Screenshoot 包代码是如何执行此操作的。该软件包已更新至 Flutter v2。

该包使用:

  • 通过获取当前小部件的渲染对象GlobalKey。GlobalKey _containerKey = GlobalKey().currentContext?.findRenderObject();
  • 然后它转换为RenderRepaintBoundary.RenderRepaintBoundary 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);
      }
    });
  }

Run Code Online (Sandbox Code Playgroud)