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

10 回复

尊敬的开发者,您好, 查看了您的代码,还请您参考以下步骤进行修改:

  1. session为函数内的临时变量,函数执行完成后,有可能被系统回收。建议将session声明为全局变量。
  2. 在激活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及设备版本信息吗?另外您这边的日志信息方便的话也请提供下,谢谢了。

日志获取:

  1. 执行:hdc hilog > xxxx.log
  2. 触发定位
  3. 停止脚本执行。
  4. 在目录下获取日志信息。

这个日志没有获取到,我这个代码有的时候能在后台播放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),并确保:

  1. StreamUsage 设为 STREAM_USAGE_MUSIC(你已设置,但仅对音频策略有效)
  2. 长时任务申请类型为 audioPlayback(你已做)
  3. 激活AVSession并始终持有“音频焦点” —— SoundPool 申请焦点不持久,焦点丢失后输出即被中断。

根本上,将你的播放器替换为 AVPlayer,加载音频资源并播放,后台就不会断音。SoundPool 即便强行用后台任务保活,也无法绕过系统对音效管道的超时回收。

回到顶部