鸿蒙(API 12 Beta3版)【使用通话设备切换组件】使用投播组件

news2025/1/11 18:39:36

基本概念

系统不再提供音频输出设备切换的API,如果需要应用内切换音频输出设备,请实现AVCastPicker组件,相关参数可参考[@ohos.multimedia.avCastPicker]和 [@ohos.multimedia.avCastPickerParam]。

本文将主要介绍AVCastPicker组件接入,实现通话设备切换。

当前系统支持两种组件样式的显示方式:默认样式显示和自定义样式显示。如果应用选择显示默认样式,当设备切换时,系统将根据当前选择的设备显示系统默认的组件样式;如果应用选择显示自定义样式,那么需要应用根据设备的变化刷新自己定义的样式。

开发步骤

默认样式实现

  1. 创建voice_call类型的AVSession,AVSession在构造方法中支持不同的类型参数,由AVSessionType定义,voice_call表示通话类型,如果不创建,将显示空列表。
import { avSession } from '@kit.AVSessionKit';

private session: avSession.AVSession | undefined = undefined;

// 通话开始时创建voice_call类型的avsession
this.session = await avSession.createAVSession(getContext(this), 'voiptest', 'voice_call');
  1. 在需要切换设备的通话界面创建AVCastPicker组件。
import { AVCastPicker } from '@kit.AVSessionKit';

// 创建组件,并设置大小
build() {
  Row() {
    Column() {
      AVCastPicker()
        .size({ height:45, width:45 })
    }
  }
}
  1. 创建VOICE_COMMUNICATION类型的AudioRenderer,并开始播放。具体通话音频播放等实现)。
import { audio } from '@kit.AudioKit';
import { BusinessError } from '@kit.BasicServicesKit';

private audioRenderer: audio.AudioRenderer | undefined = undefined;
private audioStreamInfo: audio.AudioStreamInfo = {
  // 请按照实际场景设置,当前参数仅参考
  samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_48000, // 采样率
  channels: audio.AudioChannel.CHANNEL_2, // 通道
  sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE, // 采样格式
  encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW // 编码格式
}
private audioRendererInfo: audio.AudioRendererInfo = {
  // 需使用通话场景相应的参数
  usage: audio.StreamUsage.STREAM_USAGE_VOICE_COMMUNICATION, // 音频流使用类型:VOIP通话
  rendererFlags: 0 // 音频渲染器标志:默认为0即可
}
private audioRendererOptions: audio.AudioRendererOptions = {
  streamInfo: this.audioStreamInfo,
  rendererInfo: this.audioRendererInfo
}

// 初始化,创建通话audiorenderer实例,设置监听事件
try {
 this.audioRenderer = await audio.createAudioRenderer(this.audioRendererOptions);
} catch (err) {
 console.error(`audioRender create :  Error: ${JSON.stringify(err)}`);
}

this.audioRenderer?.start((err: BusinessError) => {
 if (err) {
   console.error(`audioRender start faild :  Error: ${JSON.stringify(err)}`);
 } else {
   console.error('audioRender start success');
 }
});
  1. (可选)如果应用想知道设备切换情况,可以监听当前发声设备切换回调。
import { audio } from '@kit.AudioKit';

let audioManager = audio.getAudioManager(); // 先创建audiomanager
let audioRoutingManager = audioManager.getRoutingManager(); // 再调用AudioManager的方法创建AudioRoutingManager实例

// 可选监听当前发声设备切换回调
audioRoutingManager.on('preferOutputDeviceChangeForRendererInfo', this.audioRendererInfo, (desc: audio.AudioDeviceDescriptors) => {
  console.info(`device change To : ${desc[0].deviceType}`); // 设备类型
});
  1. 通话结束后,销毁会话。
// 通话结束销毁第一步创建的session
this.session?.destroy((err) => {
  if (err) {
    console.error(`Failed to destroy session. Code: ${err.code}, message: ${err.message}`);
  } else {
    console.info(`Destroy : SUCCESS `);
  }
});

自定义样式实现

自定义样式通过设置[CustomBuilder]类型的参数customPicker实现。

实现自定义样式的步骤与实现默认样式基本相同,开发者可参考[默认样式实现],完成创建AVSession、实现音频播放等步骤。

存在差异的步骤如下所示。

  1. 创建自定义AVCastPicker,需要新增自定义参数。(对应默认样式实现步骤2)
import { AVCastPicker } from '@kit.AVSessionKit';

@State pickerImage:ResourceStr = $r('app.media.earpiece'); // 自定义资源

build() {
  Row() {
    Column() {
      AVCastPicker(
        {
          customPicker: (): void => this.ImageBuilder() // 新增自定义参数
        }
      ).size({ height: 45, width:45 })
    }
  }
}

// 自定义内容
@Builder
ImageBuilder(): void {
  Image(this.pickerImage)
    .size({ width: '100%', height: '100%' })
    .backgroundColor('#00000000')
    .fillColor(Color.Black)
}
  1. 如果应用要根据出声设备变化而改变自定义样式,必须监听设备切换,然后实时刷新自定义样式。(对应默认样式实现步骤4)
import { audio } from '@kit.AudioKit';

async observerDevices() {
  let audioManager = audio.getAudioManager();
  let audioRoutingManager = audioManager.getRoutingManager();

  // 初次拉起AVCastPicker时需获取当前设备,刷新显示
  this.changePickerShow(audioRoutingManager.getPreferredOutputDeviceForRendererInfoSync(this.audioRendererInfo));

  // 监听当前发声设备切换,及时根据不同设备类型显示不同的样式
  audioRoutingManager.on('preferOutputDeviceChangeForRendererInfo', this.audioRendererInfo, (desc: audio.AudioDeviceDescriptors) => {
    this.changePickerShow(audioRoutingManager.getPreferredOutputDeviceForRendererInfoSync(this.audioRendererInfo));
  });
}

// 设备更新后刷新自定义资源pickerImage
private changePickerShow(desc: audio.AudioDeviceDescriptors) {
  if (desc[0].deviceType === 2) {
    this.pickerImage = $r('app.media.sound');
  } else if (desc[0].deviceType === 7) {
    this.pickerImage = $r('app.media.bluetooth');
  } else {
    this.pickerImage = $r('app.media.earpiece');
  }
}

最后呢

很多开发朋友不知道需要学习那些鸿蒙技术?鸿蒙开发岗位需要掌握那些核心技术点?为此鸿蒙的开发学习必须要系统性的进行。

而网上有关鸿蒙的开发资料非常的少,假如你想学好鸿蒙的应用开发与系统底层开发。你可以参考这份资料,少走很多弯路,节省没必要的麻烦。由两位前阿里高级研发工程师联合打造的《鸿蒙NEXT星河版OpenHarmony开发文档》里面内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(Harmony NEXT)技术知识点

如果你是一名Android、Java、前端等等开发人员,想要转入鸿蒙方向发展。可以直接领取这份资料辅助你的学习。下面是鸿蒙开发的学习路线图。

在这里插入图片描述

针对鸿蒙成长路线打造的鸿蒙学习文档。话不多说,我们直接看详细鸿蒙(OpenHarmony )手册(共计1236页)与鸿蒙(OpenHarmony )开发入门视频,帮助大家在技术的道路上更进一步。

  • 《鸿蒙 (OpenHarmony)开发学习视频》
  • 《鸿蒙生态应用开发V2.0白皮书》
  • 《鸿蒙 (OpenHarmony)开发基础到实战手册》
  • OpenHarmony北向、南向开发环境搭建
  • 《鸿蒙开发基础》
  • 《鸿蒙开发进阶》
  • 《鸿蒙开发实战》

在这里插入图片描述

总结

鸿蒙—作为国家主力推送的国产操作系统。部分的高校已经取消了安卓课程,从而开设鸿蒙课程;企业纷纷跟进启动了鸿蒙研发。

并且鸿蒙是完全具备无与伦比的机遇和潜力的;预计到年底将有 5,000 款的应用完成原生鸿蒙开发,未来将会支持 50 万款的应用。那么这么多的应用需要开发,也就意味着需要有更多的鸿蒙人才。鸿蒙开发工程师也将会迎来爆发式的增长,学习鸿蒙势在必行! 自↓↓↓拿

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2040336.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【论文笔记】:PVswin-YOLOv8s:基于无人机的行人和车辆检测,使用改进的YOLOv8在智能城市中进行交通管理

摘要 在智慧城市中,有效的交通拥堵管理取决于熟练的行人和车辆检测。无人机 (UAV) 提供了一种具有移动性、成本效益和宽视野的解决方案,然而,优化识别模型对于克服小型和遮挡物体带来的挑战至关重要。为了解决这些问题…

推出 SAM 2:适用于视频和图像的下一代 Meta Segment Anything 模型

继图像元分割模型(SAM) 取得成功之后,我们发布了SAM 2,这是一个用于在图像和视频中实时提示对象分割的统一模型,可实现最先进的性能。 为了秉承我们的开放科学方针,我们通过宽松的 Apache 2.0 许可证共享代码和模型权重。 我们还…

嵌入式linux系统镜像制作day2

点击上方"蓝字"关注我们 01、前言 嵌入式linux系统镜像制作day1这一节先了解,后面实操 02、Yocto项目快速启动 Yocto项目通过OpenEmbedded构建系统为各种平台(包括x86-64和仿真平台)提供了一个针对ARM、MIPS、PowerPC和x86架构的开源开发环境。您可以使用Yocto项…

WebDeveloper:1靶机渗透测试

一、靶机下载地址 https://www.vulnhub.com/entry/web-developer-1,288/ 二、信息收集 1、主机发现 # 使用命令 nmap 192.168.145.0/24 -sn | grep -B 2 "00:0C:29:54:22:E9" 2、端口扫描 # 使用命令 nmap 192.168.145.216 -p- -sV 3、指纹识别 # 使用命令 wha…

【SpringCloud】什么是MQ

RabbitMQ 1.什么是MQ 1.1 同步和异步通信 微服务间通讯有同步和异步两种方式: 同步通讯:就例如打电话一样,需要实时响应异步通讯:就例如发邮件一样,不需要马上回复 1.1.1同步通讯 Feign的远程调用就属于同步通讯…

【数据分析】描述性统计分析 - 直方图

一、什么是直方图 由一批长方形构成,通过长方形的面积或高度来代表对应组在数据中所占的比例。用长方形的面积代表对应组的频数与组距的比时,则称为频率分布直方图;当用长方形的高代表对应组的频数时,则称为频数分布直方图。但严格统计意义上…

WT32-ETH01开发板模块,启明云端物联网方案,乐鑫ESP32多样化开发应用

在物联网(IoT)的浪潮中,无线Wi-Fi模块作为连接传统硬件与现代智能网络的桥梁,正逐渐成为智能家居和设备通信不可或缺的一部分。Wi-Fi模块也被称为串口Wi-Fi模块,是一种嵌入式模块,它能够将串口或TTL电平信号转换为符合Wi-Fi无线网…

普元EOS-多数据源时业务数据库初始化

1 问题 EOS开发应用的时候,可以采用多数据源。 项目启动的是时候报错如下: 2024-08-14 16:03:56.105 ERROR [EOS-DEMO-SYS,EOSLOWCODE,default,cuipengyu:EOSLOWCODE:28015,,,,] 28960 --- [Timer-0] c.p.g.a.a.m.RdcloudStatisticsThread : User…

66_1JSON【浏览器中处理JSON、Java中处理JSON(FastJSON、Jackson)】、Java中的bean

JSON 概念 JSON:JavaScript Object Notation是一种表示对象的方式 基于JavaScript语言的轻量级的数据交换格式;(即:用来传输数据的一种格式) 现在传输数据的方式更多是采用json的格式,渐渐代替了XML JSON的数据表示 JSON采用名值…

封装一个细粒度的限流器

文章目录 原因限流对象限流后的做法怎么确定限流阈值观测业务性能数据压测借鉴链路上的其他服务手动计算 四种静态限流算法令牌桶漏桶固定窗口与滑动窗口 手写限流算法令牌桶漏桶固定窗口滑动窗口 分布式限流的具体实现 原因 尽管云原生网关里有统一入口的限流(根据…

股指期货套期保值中的展期管理有哪些?

在复杂的金融市场环境中,展期作为一种重要的风险管理工具,被广泛应用于期货交易中,特别是当投资者需要对长期资产进行套期保值时。展期的核心思想在于,通过连续替换高流动性的近月期货合约来替代流动性较差的远月合约,…

untiy有渲染线程和逻辑线程嘛

之前我也这么认为,其实unity引擎是单线程的,当然后续的jobs不在考虑范围内 如果你在一个awake 或者 start方法中 延时,是会卡住主线程的 比如 其实游戏引擎有一个基础简单理解,那就是不断的进行一个循环,在这个周期循…

网络分段如何增强 OT 网络的可见性

防火墙在保护运营技术(OT) 网络和系统方面发挥什么作用? 很多人会说,防火墙是一种防御机制,用于保护该环境免受 IT 和外界的影响。对于负责该关键系统正常运行的操作员来说,防火墙是阻止他人进入的外围保护。它也是需要从 OT 系统…

Unity Render Streaming项目实践经验

UnityRenderStreaming项目 项目github地址见上,我使用项目的3.1.0-exp.7版本、Unity 2023.1.0版本、windows11运行。 1下载项目包 2在Unity Hub中打开RenderStreaming~文件夹 3在package manager中导入com.unity.renderstreaming package 因为已经下载过了就选择install pa…

Linux shell编程学习笔记71: sort 命令——构造有序世界

0 前言 在大数据时代,我们面对和使用大量数据,如果数据是有序的,无疑是有益的。 在Linux中,我们可以使用 sort 命令来构造一个有序的空间。 1 sort命令 的功能、格式和选项说明 我们可以使用命令sort --help来获取帮助信息。 …

Spark MLlib 特征工程(下)

Spark MLlib 特征工程(下) 前面我们提到,典型的特征工程包含如下几个环节,即预处理、特征选择、归一化、离散化、Embedding 和向量计算,如下图所示。 在上一讲,我们着重讲解了其中的前 3 个环节,也就是预处理、特征选…

Memecoin的火爆与AMM在Solana上的主导地位

随着Solana区块链的高速发展,尤其是近年来Memecoin市场的崛起,AMM(自动做市商)逐渐成为Solana去中心化交易所(DEX)的主导交易模式。尽管Solana以其高效性能能够支持每秒数千笔交易,足以让中心化…

【C语言篇】深入理解指针3(附转移表源码)

文章目录 数组指针什么是数组指针数组指针变量的初始化 二维数组传参的本质函数指针函数指针变量的创建函数指针变量的使用 两端有趣的代码typedef 关键字 函数指针数组转移表写在最后 数组指针 什么是数组指针 在【C语言篇】深入理解指针2我们学习了指针数组,指针…

Qt项目【上位机十字屏开发】

效果图 说明 重写 QWidget 中的 paintEvent() 处理绘图事件&#xff0c;废话不多说&#xff0c;上代码 源码 #ifndef MYWIDGETFORM_H #define MYWIDGETFORM_H#include <QWidget>namespace Ui { class myWidgetForm; }enum MYTYPE{SIZEWIDTH,SIZEHEIGHT,TOPWIDTH,TOPHE…

XMind在软件需求分析中编写测试用例的应用技巧

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言 在软件需求分析中&#xff0c;编写测试用例是确保软件质量的重要环节。之前很多同学都是用Excel&#xff0c;但是XMind作为一款功能强大的思维导图工具&#xff0c;可以在需求分析阶段帮助测试人员系统地设计和组织测试用…