首页 > 其他分享 >鸿蒙开发进阶(HarmonyOS)使用通话设备切换组件

鸿蒙开发进阶(HarmonyOS)使用通话设备切换组件

时间:2024-11-07 16:16:02浏览次数:3  
标签:err 进阶 鸿蒙 通话 样式 HarmonyOS AVCastPicker audio 自定义

 鸿蒙NEXT开发实战往期必看文章:

一分钟了解”纯血版!鸿蒙HarmonyOS Next应用开发!

“非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线!(从零基础入门到精通)

HarmonyOS NEXT应用开发案例实践总结合(持续更新......)

HarmonyOS NEXT应用开发性能优化实践总结(持续更新......)


基本概念

系统不再提供音频输出设备切换的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');
    ts
  2. 在需要切换设备的通话界面创建AVCastPicker组件。

    import { AVCastPicker } from '@kit.AVSessionKit';
    
    // 创建组件,并设置大小
    build() {
      Row() {
        Column() {
          AVCastPicker()
            .size({ height:45, width:45 })
        }
      }
    }
    ts
  3. 创建VOICE_COMMUNICATION类型的AudioRenderer,并开始播放。具体通话音频播放等实现,请参考AudioKit开发音频通话功能

    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_VIDEO_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');
     }
    });
    ts
  4. (可选)如果应用想知道设备切换情况,可以监听当前发声设备切换回调。

    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}`); // 设备类型
    });
    ts
  5. 通话结束后,销毁会话。

    // 通话结束销毁第一步创建的session
    this.session?.destroy((err) => {
      if (err) {
        console.error(`Failed to destroy session. Code: ${err.code}, message: ${err.message}`);
      } else {
        console.info(`Destroy : SUCCESS `);
      }
    });
    ts

自定义样式实现

自定义样式通过设置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)
    }
    ts
  2. 如果应用要根据出声设备变化而改变自定义样式,必须监听设备切换,然后实时刷新自定义样式。(对应默认样式实现步骤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');
      }
    }

 

标签:err,进阶,鸿蒙,通话,样式,HarmonyOS,AVCastPicker,audio,自定义
From: https://blog.csdn.net/wea22984984/article/details/143594125

相关文章

  • 鸿蒙开发进阶(HarmonyOS)相机应用录像(ArkTS)
     鸿蒙NEXT开发实战往期必看文章:一分钟了解”纯血版!鸿蒙HarmonyOSNext应用开发!“非常详细的”鸿蒙HarmonyOSNext应用开发学习路线!(从零基础入门到精通)HarmonyOSNEXT应用开发案例实践总结合(持续更新......)HarmonyOSNEXT应用开发性能优化实践总结(持续更新......)录像(Ar......
  • 鸿蒙开发进阶(HarmonyOS)相机拍照功能(ArkTS)
     鸿蒙NEXT开发实战往期必看文章:一分钟了解”纯血版!鸿蒙HarmonyOSNext应用开发!“非常详细的”鸿蒙HarmonyOSNext应用开发学习路线!(从零基础入门到精通)HarmonyOSNEXT应用开发案例实践总结合(持续更新......)HarmonyOSNEXT应用开发性能优化实践总结(持续更新......)拍照是......
  • Web组件和WebView 习题答案 <HarmonyOS第一课>
    一、判断题1. Web组件提供具有网页显示能力,@ohos.web.webview提供web控制能力。正确(True)错误(False)回答正确A2. 同一页面的多个Web组件,必须绑定不同的WebviewController。正确(True)错误(False)回答正确A二、单选题1. 下列关于Web组件的属性,描述错误的是?A.......
  • 鸿蒙接入Flutter3.22
    配置环境变量配置HarmonyOSSDK和环境变量API12,deveco-studio-5.0或command-line-tools-5.0配置Java17配置环境变量(SDK,node,ohpm,hvigor)exportTOOL_HOME=/Applications/DevEco-Studio.app/Contents#mac环境exportDEVECO_SDK_HOME=$TOOL_HOME/sdk#co......
  • Android音频进阶之PCM设备创建(九十三)
    简介:CSDN博客专家、《Android系统多媒体进阶实战》一书作者新书发布:《Android系统多媒体进阶实战》......
  • 鸿蒙Next密码自动填充服务:功能与应用场景全解析
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)在开发多语言电商平台方面的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。在当今数字化......
  • 鸿蒙 Next 密码保险箱:账号密码管理全流程
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)在开发多语言电商平台方面的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。在当今数字化......
  • 鸿蒙Next安全之应用加密:保障应用代码安全
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)在开发多语言电商平台方面的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。在数字化浪潮......
  • 深入探索鸿蒙Next密码自动填充服务:高级功能与适配场景
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)在开发多语言电商平台方面的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。在当今数字化......
  • 鸿蒙 Next 密码自动填充服务实战:构建安全登录模块
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)在开发多语言电商平台方面的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。在当今数字化......