feat: voiceAnnouncements.ets修改

This commit is contained in:
Surenjun 2025-03-27 11:32:24 +08:00
parent 53bfef994e
commit e51f80f783

View File

@ -7,17 +7,18 @@ import common from '@ohos.app.ability.common';
const TAG = 'VoiceAnnounce' const TAG = 'VoiceAnnounce'
interface Queue{
url: string,
callback?: Function
}
type PlayAudio = (urls: string[], shit?: boolean, callback?: Function) => Queue | void
export default class VoiceAnnounce { export default class VoiceAnnounce {
//队列时候立马终止 //队列时候立马终止
private isStopped: Boolean private isStopped: Boolean
private queue: { private queue: Queue[]
url: string, private newQueue: Queue[]
callback?: Function
}[]
private newQueue: {
url: string,
callback?: Function
}[]
private pendingQueue: String[] private pendingQueue: String[]
private callback: Function; private callback: Function;
@ -26,15 +27,18 @@ export default class VoiceAnnounce {
this.queue = [] this.queue = []
} }
async playAudio(urls: string[], shit?: boolean, callback?: Function) { async playAudio(urls: string[], shit?: boolean, callbackFn?: Function) {
const { isStopped, queue } = this; const isStopped = this.isStopped;
const tempUrls = urls.map((url, index) => { const queue = this.queue;
return {
url, const tempUrls: Queue[] = urls.map((url, index) => {
callback: (index === urls.length - 1) ? callback : undefined const callback:Function|undefined = (index === urls.length - 1) ? callbackFn : undefined
} const temp:Queue = {url, callback}
return temp
}); });
if (shit) { if (shit) {
//队列清空,重新初始化 //队列清空,重新初始化
this.isStopped = true; this.isStopped = true;
@ -53,7 +57,9 @@ export default class VoiceAnnounce {
async executeQueue() { async executeQueue() {
const go = async () => { const go = async () => {
const { queue, isStopped, newQueue } = this; const queue = this.queue;
const isStopped = this.isStopped;
const newQueue = this.newQueue;
const avPlayer = new AVPlayer(); const avPlayer = new AVPlayer();
if (isStopped) { if (isStopped) {
//清空原来队列 //清空原来队列
@ -77,8 +83,7 @@ export default class VoiceAnnounce {
class AVPlayer { class AVPlayer {
public avPlayer: any = null; public avPlayer?: media.AVPlayer;
private voiceUrl: string[]; private voiceUrl: string[];
private voiceStatus: 'completed' | 'playing' private voiceStatus: 'completed' | 'playing'
private endCallback: Function private endCallback: Function
@ -87,7 +92,7 @@ class AVPlayer {
} }
// 以下为使用资源管理接口获取打包在HAP内的媒体资源文件并通过fdSrc属性进行播放示例 // 以下为使用资源管理接口获取打包在HAP内的媒体资源文件并通过fdSrc属性进行播放示例
async play(name, callback) { async play(name:string, callback:Function):Promise<boolean> {
try { try {
//检查SD中的语音 //检查SD中的语音
// console.info('surenjun name',name) // console.info('surenjun name',name)
@ -123,7 +128,7 @@ class AVPlayer {
this.avPlayer = await media.createAVPlayer(); this.avPlayer = await media.createAVPlayer();
return new Promise(async (resolve, reject) => { return new Promise(async (resolve, reject) => {
await this.setAVPlayerCallback(() => { await this.setAVPlayerCallback(() => {
resolve() resolve(true)
}); });
try { try {
const context: common.UIAbilityContext = AppStorage.get('context') const context: common.UIAbilityContext = AppStorage.get('context')
@ -133,34 +138,28 @@ class AVPlayer {
message: `${name}语音文件不存在`, message: `${name}语音文件不存在`,
duration: 4000 duration: 4000
}); });
resolve(1) resolve(true)
} }
}) })
} }
} }
async queryFile(displayName): Promise<mediaLibrary.FileAsset> { async queryFile(displayName:string): Promise<mediaLibrary.FileAsset> {
return new Promise(async (resolve, reject) => { return new Promise(async (resolve, reject) => {
const context = AppStorage.get('context') const context = AppStorage.get<common.UIAbilityContext>('context')
const mediaLib = mediaLibrary.getMediaLibrary(context); const mediaLib = mediaLibrary.getMediaLibrary(context);
let ret let fileResult = await mediaLib.getFileAssets({
let fetchOp = {
selections: `media_type=? AND display_name = ?`, selections: `media_type=? AND display_name = ?`,
selectionArgs: [`${mediaLibrary.MediaType.AUDIO}`, displayName], selectionArgs: [`${mediaLibrary.MediaType.AUDIO}`, displayName],
}; });
let fileResult = await mediaLib.getFileAssets(fetchOp);
let retCount = fileResult.getCount(); let retCount = fileResult.getCount();
if (retCount > 0) { if (retCount > 0) {
ret = await fileResult.getFirstObject(); let ret = await fileResult.getFirstObject();
return resolve(ret); return resolve(ret);
} else { } else {
return reject(false); return reject(false);
} }
}) })
} }
//音频播放队列 //音频播放队列
@ -175,7 +174,7 @@ class AVPlayer {
} }
// 注册avplayer回调函数 // 注册avplayer回调函数
setAVPlayerCallback(callBack) { setAVPlayerCallback(callBack:Function) {
this.avPlayer.on('error', (err) => { this.avPlayer.on('error', (err) => {
this.avPlayer && this.avPlayer.stop() this.avPlayer && this.avPlayer.stop()
this.avPlayer && this.avPlayer.reset() this.avPlayer && this.avPlayer.reset()
@ -185,7 +184,7 @@ class AVPlayer {
let num = 0; let num = 0;
// 状态机变化回调函数 // 状态机变化回调函数
this.avPlayer.on('stateChange', async (state, reason) => { this.avPlayer.on('stateChange', async (state, reason) => {
const { endCallback } = this; const endCallback = this.endCallback;
switch (state) { switch (state) {
case 'idle': // 成功调用reset接口后触发该状态机上报 case 'idle': // 成功调用reset接口后触发该状态机上报
break; break;