HarmonyOS 快门声音怎么实现

拍照时需要开启快门声音。

HarmonyOS
4天前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
Heiang

把快门声音资源文件放到resource/rawfile目录下,使用资源管理接口获取打包在HAP内的媒体资源文件并通过fdSrc属性进行播放(文件放在resource/rawfile目录下)。

参考示例如下:

import media from '@ohos.multimedia.media'
import { AppUtil } from '@pura/harmony-utils'
import { BusinessError } from '@ohos.base'
import resourceManager from '@ohos.resourceManager';

class ShutterSound {
  private count: number = 0
  private isSeek: boolean = true // 用于区分模式是否支持seek操作
  // 注册avplayer回调函数
  private setAVPlayerCallback(avPlayer: media.AVPlayer) {
    // seek操作结果回调函数
    avPlayer.on('seekDone', (seekDoneTime: number) => {
      console.log(`AVPlayer seek succeeded, seek time is ${seekDoneTime}`)
    })
    // error回调监听函数,当avPlayer在操作过程中出现错误时调用 reset接口触发重置流程
    avPlayer.on('error', (err: BusinessError) => {
      console.log(`Invoke avPlayer failed, code is ${err.code}, message is ${err.message}`)
      avPlayer.reset() // 调用reset重置资源,触发idle状态
    })
    // 状态机变化回调函数
    avPlayer.on('stateChange', async (state: string, reason: media.StateChangeReason) => {
      switch (state) {
        case 'idle': // 成功调用reset接口后触发该状态机上报
          console.log('AVPlayer state idle called.')
          avPlayer.release() // 调用release接口销毁实例对象
          break
        case 'initialized': // avplayer 设置播放源后触发该状态上报
          console.log('AVPlayer state initialized called.')
          avPlayer.prepare()
          break
        case 'prepared': // prepare调用成功后上报该状态机
          console.log('AVPlayer state prepared called.')
          avPlayer.play() // 调用播放接口开始播放
          break
        case 'playing': // play成功调用后触发该状态机上报
          console.log('AVPlayer state playing called.')
          break
        case 'paused': // pause成功调用后触发该状态机上报
          console.log('AVPlayer state paused called.')
          avPlayer.play() // 再次播放接口开始播放
          break
        case 'completed': // 播放结束后触发该状态机上报
          console.log('AVPlayer state completed called.')
          avPlayer.stop() //调用播放结束接口
          break
        case 'stopped': // stop接口成功调用后触发该状态机上报
          console.log('AVPlayer state stopped called.')
          avPlayer.reset() // 调用reset接口初始化avplayer状态
          break
        case 'released':
          console.log('AVPlayer state released called.')
          break
        default:
          console.log(`AVPlayer state ${state} called.`)
          break
      }
    })
  }

  async play() {
    let avPlayer: media.AVPlayer = await media.createAVPlayer()
    this.setAVPlayerCallback(avPlayer)
    let fileDescriptor = await getContext(this).resourceManager.getRawFd('object.mp3')
    let avFileDescriptor: media.AVFileDescriptor =
      { fd: fileDescriptor.fd, offset: fileDescriptor.offset, length: fileDescriptor.length }
    avPlayer.fdSrc = avFileDescriptor
  }
}

export default new ShutterSound()
分享
微博
QQ
微信
回复
4天前
相关问题
HarmonyOS 如何添加拍照快门声音
100浏览 • 1回复 待解决
js采集声音出现问题怎么处理?
3367浏览 • 1回复 待解决
HarmonyOS soundpool播放声音的问题
591浏览 • 1回复 待解决
HarmonyOS ohaudio 通话模式声音无法外放
463浏览 • 1回复 待解决
后台播放声音会直接无声
1851浏览 • 1回复 待解决
HarmonyOS 怎么实现高斯模糊
592浏览 • 1回复 待解决
HarmonyOS 换肤功能怎么实现
579浏览 • 1回复 待解决
HarmonyOS 超出隐藏怎么实现
42浏览 • 1回复 待解决
HarmonyOS 跳转邮件App,怎么实现
74浏览 • 1回复 待解决
HarmonyOS map转json怎么实现
34浏览 • 1回复 待解决