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



我们正在构建一个SDK,一旦集成,它将截取应用程序的屏幕截图。我们能够为Native Android,Native iOS,Cordova,IONIC,React Native,Xamarin平台截取屏幕截图。但是无法在 V2 颤振中拍摄快照。在 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
  3. 尝试遍历视图层次结构并使用活动绘制视图 上下文,正在捕获空白屏幕截图
  4. 试图绘制从 FlutterActivity.getWindow((.getDecorView((.getRootView((, blank 正在捕获的屏幕截图。

您可以查看其GitHub上的屏幕截图包代码是如何做到这一点的。该软件包是最新的 Flutter v2。

该软件包使用:

  • 获取当前小部件的呈现对象,这要归功于GlobalKeyGlobalKey _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);
}
});
}

相关内容

最新更新