首页 > 其他分享 >Flutter OS外接纹理适配简介-相机预览

Flutter OS外接纹理适配简介-相机预览

时间:2024-12-30 10:09:19浏览次数:1  
标签:surfaceId textureId 预览 适配 void 纹理 null OS Flutter

Flutter OHOS外接纹理适配简介

Flutter在OHOS平台使用外接纹理,视频播放和相机预览使用方法是一致的,在注册纹理时,flutter engine返回surfaceId。图片场景,则是以PixelMap的形式注册到flutter engine。

注:1. 一般而言,为了方便复用,会将ohos对接flutter外接纹理的功能代码作为一个module模块组件单独写一个插件注册到Flutter engine

  1. 外接纹理背景色为白色,暂不支持修改

相机预览

实现说明

1. 实现插件,在onAttachedToEngine中,从入参FlutterPluginBinding中获取TextureRegistry

const TAG = "CameraPlugin";
export class CameraPlugin implements FlutterPlugin, MethodCallHandler {
  private binding: FlutterPluginBinding | null = null;
  private mMethodChannel: MethodChannel | null = null;
  private textureRegistry: TextureRegistry | null = null;
  private textureId: number = -1;
  private surfaceId: number = -1;

  getUniqueClassName(): string {
return TAG;
  }

  onAttachedToEngine(binding: FlutterPluginBinding): void {
Log.e(TAG, "CameraPlugin onAttachedToEngine");
this.binding = binding;
this.mMethodChannel = new MethodChannel(binding.getBinaryMessenger(), "CameraControlChannel");
this.mMethodChannel.setMethodCallHandler(this);
this.textureRegistry = binding.getTextureRegistry();

  }

2. 在onMethodCall中实现注册纹理的响应方法

  onMethodCall(call: MethodCall, result: MethodResult): void {
let method: string = call.method;
Log.e(TAG, "Received '" + method + "' message.");
switch (method) {
  case "registerTexture":
this.registerCameraTexture();
result.success(this.textureId);
break;
  case "startCamera":
this.startCamera();
result.success(null);
break;
  case "unregisterTexture":
this.unregisterTexture(call.argument("textureId"));
result.success(null);
break;
}
  }

registerCameraTexture中实现注册纹理,先获取textureId,再使用该textureId去注册纹理到flutter engine,返回surfaceId。

  registerCameraTexture(): void {
Log.i(TAG, "start register Camera texture in flutter engine");
this.textureId = this.textureRegistry!.getTextureId();
this.surfaceId = this.textureRegistry!.registerTexture(this.textureId)!.getSurfaceId();
  }

3. 在启动相机预览中,使用前面获取到的surfaceId。

  startSession() {
console.log(`[camera test] 已经授权,相机开始拍摄`);
let cameraManager = getCameraManager(getContext(this) as common.BaseContext);
let cameraDevices = getCameraDevices(cameraManager);
let cameraInput = getCameraInput(cameraDevices[0], cameraManager);
if (cameraInput != null) {
  getSupportedOutputCapability(cameraDevices[0], cameraManager, cameraInput)
.then((supportedOutputCapability) => {
  if (supportedOutputCapability != undefined) {
let previewOutput = getPreviewOutput(cameraManager, supportedOutputCapability, this.surfaceId.toString());
let captureSession = getCaptureSession(cameraManager);
if (captureSession != undefined && previewOutput != undefined && cameraInput != null) {
  beginConfig(captureSession);
  setSessionCameraInput(captureSession, cameraInput);
  setSessionPreviewOutput(captureSession, previewOutput);
  startSession(captureSession);
}
  }
});
}
  }

4 . dart侧通过MethodChannel触发,触发纹理注册和启动相机预览。

class _CameraPageState extends State<CameraPage> {
  final MethodChannel _channel = MethodChannel('CameraControlChannel');

  int textureId = -1;

  @override
  void initState() {
super.initState();

newTexture();
startCamera();
  }

  @override
  void dispose() {
super.dispose();
if (textureId >= 0) {
  _channel.invokeMethod('unregisterTexture', {'textureId': textureId});
}
  }

  void startCamera() async {
await _channel.invokeMethod('startCamera');
  }

  void newTexture() async {
int id = await _channel.invokeMethod('registerTexture');
setState(() {
  this.textureId = id;
});
  }

预览画面使用获取到的textureId构造一个texture widget。

  Widget getTextureBody(BuildContext context) {
return Container(
  width: 500,
  height: 500,
  child: Texture(
textureId: textureId,
  ),
);
  }

标签:surfaceId,textureId,预览,适配,void,纹理,null,OS,Flutter
From: https://www.cnblogs.com/cnblogzzy/p/18640221

相关文章

  • wx.postMessageToReferrerPage
    wx.postMessageToReferrerPage(Objectobject)基础库3.7.2开始支持,低版本需做兼容处理。小程序插件:不支持微信鸿蒙OS版:支持功能描述向跳转的源页面发送消息。参数Objectobject属性类型默认值必填说明extraDataObject否需要返回的数据多次调......
  • wx.getSystemInfoSync
    Objectwx.getSystemInfoSync()从基础库2.20.1开始,本接口停止维护,请使用wx.getSystemSetting、wx.getAppAuthorizeSetting、wx.getDeviceInfo、wx.getWindowInfo、wx.getAppBaseInfo代替以Promise风格调用:支持小程序插件:支持,需要小程序基础库版本不低于1.9.6微信Win......
  • TCP/IP四层模型与OSI参考模型
      TCP/IP四层模型:1.链路层(数据链路层/网络接口层):包括操作系统中的设备驱动程序、计算机中对应的网络接口卡2.网络层(互联网层):处理分组在网络中的活动,比如分组的选路。3.运输层:主要为两台主机上的应用提供端到端的通信。4.应用层:负责处理特定的应用程序细节。  假设......
  • HarmonyOS 5.0 Next实战应用开发—‘我的家乡’【HarmonyOS Next华为公司完全自研的操
    HarmonyOS5.0NextHarmonyOSNEXT是鸿蒙抛弃Linux内核及安卓开放源代码项目(AOSP)等代码的首个大版本,该系统仅支持鸿蒙内核和鸿蒙系统的应用,不再兼容安卓应用。引入了“和谐美学”设计理念,通过先进的物理渲染引擎,细腻地还原了真实世界的光影色彩与时空力感,为用户呈现更加沉浸、多......
  • Marigold:Repurposing Diffusion-Based Image Generators for Monocular Depth Estimat
    目录一、概述二、相关工作1、单目深度估计2、扩散模型3、单目深度估计的扩散模型4、基础模型三、Method四、实验一、概述    Marigold是一个扩散模型和通过微调手段的单目深度估计方法,可以利用预先训练好的StableDiffusion中的视觉知识,来实现更好更通用......
  • POSIX 多线程 ------ 线程
    多线程当引入线程后,进程可以看作是资源的集合,线程可以看作是执行单元,线程之间共享进程的某些资源,比如文件描述符等等,这方便了线程之间的通信,每个线程都有自己的堆栈(因为线程的启动函数可能不同,甚至可能递归)简单来说就是,同一个进程内的线程可以共享一些资源,每个线程都有自己的......
  • 适配器模式
    实验八适配器模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解适配器模式的动机,掌握该模式的结构;2、能够利用适配器模式解决实际问题。[实验任务一]:双向适配器实现一个双向适配器,使得猫可以学狗叫,狗可以学猫抓老鼠。类图源代码publicinterfaceDog{......
  • 基于HarmonyOS 5.0(NEXT)与SpringCloud架构的跨平台应用开发与服务集成研究【实战】
    HarmonyOSNEXT百川奔腾入海,千帆共进有为,鸿蒙与你共未来!鸿蒙生态千帆起HarmonyOSNEXT!全新HarmonyOSNEXT开发者预览版将在今年第一季度面向所有开发者开放。华为宣布将于2024年1月18日举行“鸿蒙生态千帆启航仪式”,揭秘鸿蒙生态和HarmonyOSNEXT进阶新篇章。2023年......
  • Jetpack Compose 学习
    这是在软件企业文化最后一节课中一位同学介绍的一个框架用于安卓移动开发目前我的安卓移动开发应用的框架主要是flutter和uniappJetpackCompose是Google推出的现代AndroidUI工具包,旨在简化和加速用户界面开发。它是一种声明式UI框架,允许开发者用更少的代码构建......
  • 记录:wsl2 安装 CentOS8-stream 安装docker 安装redis-cluster集群 一些步骤及问题
     一。解压  下载的CentOS8-stream.zip压缩包,双击安装   (下载地址记录:wsl2安装centOS7一些问题解决并使用shell工具连接)  二。修改root密码 (安装后直接进入root 不知道密码所以修改)  直接passwd即可修改   三。yumli......