HarmonyOS AVSession与长时任务如何配合使用实现后台播放的能力?

开发音频播放能力需要接入长时任务以及AVSession实现后台播放的功能,一直报9800006的错误码。

阅读 499
1 个回答

参考长时任务示例:https://gitee.com/openharmony/applications\_app\_samples/tree/master/code/BasicFeature/TaskManagement/ContinuousTask

9800006长时任务通知信息校验失败,参考文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/errorcode-backgroundtaskmgr-V5\#section9800006-长时任务通知信息校验失败

示例参考如下:

import common from '@ohos.app.ability.common';
import abilityAccessCtrl, { Permissions } from '@ohos.abilityAccessCtrl';
import wantAgent, { WantAgent } from '@ohos.app.ability.wantAgent';
import backgroundTaskManager from '@ohos.resourceschedule.backgroundTaskManager';
import { BusinessError } from '@ohos.base';
import avSession from '@ohos.multimedia.avsession';
import media from '@ohos.multimedia.media';

@Entry
@Component
struct audioPlay {
  private context = getContext(this) as common.UIAbilityContext
  private scroller: Scroller = new Scroller()
  private avSession?: avSession.AVSession
  private player?: media.AVPlayer

  async start() {
    if (!this.player) {
      await this.loadAvplayer()
    } else {
      this.player.play()
    }
  }

  async stop() {
    this.player?.stop()
  }

  async loadAvplayer() {
    if (!this.context) {
      return
    }
    this.player = await media.createAVPlayer()
    this.player.on("timeUpdate", (time) => {

    })
    this.registerCallBack()
    try {
      let rawMp3File = await this.context.resourceManager.getRawFd("ring.mp3")
      this.player.fdSrc = rawMp3File;
    } catch (e) {
    }
  }

  registerCallBack() {
    this.player?.on("stateChange", async (state: media.AVPlayerState, reason) => {
      switch (state) {
        case "idle":
          break
        case "initialized":
          this.player?.prepare().then(() => {

          }, () => {

          });
          break
        case "prepared":
          if (this.player) {
            this.player.play()
          }
          break
        case "playing":
          if (this.player) {
            this.player.loop = true
          }
          break
        case 'paused':
          break
        case 'completed':
          break
        case 'stopped':
          if (this.player) {
            this.player.play()
          }
          break
        case 'released':
          break
        default:
          break
      }
    })
  }

  startContinuousTask() {

    if (!this.context) {
      return
    }
    if (!this.avSession) {
      this.createAVSession(this.context)

    }
    this.start()
    let wantAgentInfo: wantAgent.WantAgentInfo = {
      // 点击通知后,将要执行的动作列表
      wants: [
        {
          bundleName: this.context.abilityInfo.bundleName,
          abilityName: this.context.abilityInfo.name
        }
      ],
      // 点击通知后,动作类型
      operationType: wantAgent.OperationType.START_ABILITY,
      // 使用者自定义的一个私有值
      requestCode: 0,
      // 点击通知后,动作执行属性
      wantAgentFlags: [wantAgent.WantAgentFlags.UPDATE_PRESENT_FLAG]
    };

    // 通过wantAgent模块下getWantAgent方法获取WantAgent对象
    wantAgent.getWantAgent(wantAgentInfo).then((wantAgentObj: WantAgent) => {
      backgroundTaskManager.startBackgroundRunning(this.context,
        backgroundTaskManager.BackgroundMode.AUDIO_PLAYBACK, wantAgentObj).then(() => {
        console.info(`Succeeded in operationing startBackgroundRunning.`);
      }).catch((err: BusinessError) => {
        console.error(`Failed to operation startBackgroundRunning. Code is ${err.code}, message is ${err.message}`);
      });
    });
  }

  stopContinuousTask() {
    backgroundTaskManager.stopBackgroundRunning(this.context).then(() => {
      this.destroyAVSession()
      console.info(`Succeeded in operationing stopBackgroundRunning.`);
    }).catch((err: BusinessError) => {
      console.error(`Failed to operation stopBackgroundRunning. Code is ${err.code}, message is ${err.message}`);
    });
  }

  createAVSession(context: common.UIAbilityContext): void {
    avSession.createAVSession(context, 'player', 'audio').then((data) => {
      this.avSession = data;
    });
  };

  destroyAVSession(): void {
    this.avSession?.destroy();
  };

  aboutToAppear() {
  }

  build() {
    Navigation() {
      Scroll(this.scroller) {
        Column() {
          Button("开始音频播放长时任务")
            .height(50)
            .onClick(() => {
              this.startContinuousTask()
            })
          Button("取消音频播放长时任务")
            .height(50)
            .onClick(() => {
              this.stopContinuousTask()
            })
        }
        .width('100%')
      }
    }
    .titleMode(NavigationTitleMode.Mini)
    .hideBackButton(true)
  }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进