HarmonyOS 鸿蒙Next中SoundPool播放音频,如何设置在App切到后台后,音频可以继续播放
HarmonyOS 鸿蒙Next中SoundPool播放音频,如何设置在App切到后台后,音频可以继续播放 请教下SoundPool播放音频,如何设置在App切到后台后,音频可以继续播放
我写的代码,可以后台播放10多秒,然后音频就不响了,不过打印的日志还在
下面的是我的代码
1. 配置权限与后台模式
"requestPermissions": [
{ "name": "ohos.permission.KEEP_BACKGROUND_RUNNING", "reason": "$string:micro_reason" }
]
{
"name": "EntryAbility",
"backgroundModes": ["audioPlayback"],
}
2 申请长时任务与激活AVSession
async startContinuousTask() {
let context = getContext(this);
// 1申请长时任务
let wantAgentInfo: wantAgent.WantAgentInfo = {
wants: [{
bundleName: "com.xiaoluaiyue.hmfreeguji",
abilityName: "EntryAbility" }
],
actionType: wantAgent.OperationType.START_ABILITY,
requestCode: 0,
actionFlags: [wantAgent.WantAgentFlags.UPDATE_PRESENT_FLAG]
};
let wantAgentObj: WantAgent = await wantAgent.getWantAgent(wantAgentInfo);
let list: string[] = ["audioPlayback"];
try {
await backgroundTaskManager.startBackgroundRunning(context, list, wantAgentObj);
console.info(`jiejie=Succeeded in operationing startBackgroundRunning.`);
} catch (error) {
console.error(`jiejie=Failed to operation startBackgroundRunning: ${error.message}`);
}
let session: avSession.AVSession | null = null;
session = await avSession.createAVSession(context, "AudioPlayback", "audio");
await session.activate();
}
3 在EntryAbility里面调用
export default class EntryAbility extends UIAbility {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
}
...
onBackground(): void {
this.startContinuousTask()
}
async startContinuousTask() {
...
}
}
是哪里写出问题了吗 用的media.SoundPool播放,usage也设置的 audio.StreamUsage.STREAM_USAGE_MUSIC。
现在可以后台运行,但是音频放几十秒就停止了。。。 后台运行要不要写停止呀?
更多关于HarmonyOS 鸿蒙Next中SoundPool播放音频,如何设置在App切到后台后,音频可以继续播放的实战教程也可以访问 https://www.itying.com/category-93-b0.html
尊敬的开发者,您好, 查看了您的代码,还请您参考以下步骤进行修改:
- session为函数内的临时变量,函数执行完成后,有可能被系统回收。建议将session声明为全局变量。
- 在激活AVSession前还需要设置元数据,以及注册控制命令,确认AVSession完整接入。 参考代码如下:
let session: AVSessionManager.AVSession | undefined;
export default class EntryAbility extends UIAbility {
// ...
async startContinuousTask() {
// ...
// 接入媒体会话服务(AVSession)
session = await AVSessionManager.createAVSession(context, 'SESSION_NAME', 'audio');
// 设置元数据
let metadata: AVSessionManager.AVMetadata = {
assetId: '0', // 由应用指定,用于标识应用媒体库里的媒体。
title: '音效播放',
mediaImage: 'IMAGE',
artist: '我的应用',
};
await session.setAVMetadata(metadata).then(() => {
console.info(`SetAVMetadata successfully`);
});
// 注册控制命令
await session.on('play', () => {
// todo
});
await session.on('pause', () => {
// todo
});
await session.activate(); // 激活接口要在元数据、控制命令注册完成之后再执行。
console.info(`activate successfully`);
}
}
更多关于HarmonyOS 鸿蒙Next中SoundPool播放音频,如何设置在App切到后台后,音频可以继续播放的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
开发者你好,从日志中未找到长时任务相关的有效日志信息,方便的话还请重新提供下demo运行的完整日志信息和出现音频播放中断的时间点以便进一步分析,开发者可以参考下AVSession被回收导致长时任务失效中的排查方案。
日志获取还请开发者将DevEco Studio中的日志过滤级别修改为No filters,若是可以的话也请提供下您这边具体的音频播放页面的代码,谢谢了。
开发者你好,
本地尝试使用音视频后台播放和长时任务的使用流程中示例,在6.0.1 Release版本DevEco Studio和API 22的设备上退至后台后应用可以正常播放音频未出现中断的问题,为了进一步分析您的问题,方便的话可以提供下您这边的可以复现的Demo及设备版本信息吗?另外您这边的日志信息方便的话也请提供下,谢谢了。
日志获取:
- 执行:hdc hilog > xxxx.log
- 触发定位
- 停止脚本执行。
- 在目录下获取日志信息。
这个日志没有获取到,我这个代码有的时候能在后台播放1分钟,有时候能播放5分钟 然后才不播放的。我用的手机API 17,开发工具6.0.0 Releas
是不是需要用AudioRenderer加个静音保活流
开发者你好,方便的话可以提供下您这边的完整demo,这边复现看下,谢谢了。
用AudioRenderer可以吗?
是用AudioRenderer加个静音保活流吗?现在场景是播放个简短的音频 有间隔的播放。
在鸿蒙Next中,SoundPool默认不支持后台播放。需在module.json5中添加keepAlive: true,并申请ohos.permission.KEEP_BACKGROUND_RUNNING权限。在Ability的onBackground()中调用SoundPool.resume()或重新调用play(),同时确保音频焦点模式为AUDIOFOCUS_GAIN。
你的代码中配置了长时任务与AVSession,这能让应用在后台存活一段时间,但SoundPool 本身是为短促音效设计的。系统对SoundPool的后台音频输出了额外的策略限制:即使进程未杀、日志继续打印,音频管线仍可能被挂起,所以你只能听到约十几秒声音。
要实现真正的后台音乐持续播放,应使用 AVPlayer(或AudioRenderer),并确保:
StreamUsage设为STREAM_USAGE_MUSIC(你已设置,但仅对音频策略有效)- 长时任务申请类型为
audioPlayback(你已做) - 激活AVSession并始终持有“音频焦点” —— SoundPool 申请焦点不持久,焦点丢失后输出即被中断。
根本上,将你的播放器替换为 AVPlayer,加载音频资源并播放,后台就不会断音。SoundPool 即便强行用后台任务保活,也无法绕过系统对音效管道的超时回收。

