鸿蒙后台运行,鸿蒙播放音乐后台

1、权限:

1.1、在entry => src => main => module.json5中配置:

"requestPermissions": [
      {"name": "ohos.permission.KEEP_BACKGROUND_RUNNING"}
    ],

1.2、在ability中配置backgroundModes(也是module.json5中),配置:

  "backgroundModes": [
          'audioPlayback'
        ]

表示为背景音频播放任务

全部:

"abilities": [
      {
        "name": "EntryAbility",
        "srcEntry": "./ets/entryability/EntryAbility.ets",
        "description": "$string:EntryAbility_desc",
        "icon": "$media:layered_image",
        "label": "$string:EntryAbility_label",
        "startWindowIcon": "$media:startIcon",
        "startWindowBackground": "$color:start_window_background",
        "exported": true,
        "skills": [
          {
            "entities": [
              "entity.system.home"
            ],
            "actions": [
              "action.system.home"
            ]
          }
        ],
        "backgroundModes": [
          'audioPlayback'
        ]
      }
    ],

在播放音乐时调用:

    AvPlayerManager.startBackgroundTask()






//   开启后台长时间任务,,播放的时候调用
  static async startBackgroundTask(){

    // 如果已经存在,就表示开启了后台任务
    if (AvSessionManager.session.sessionId){
      return
    }

    // want的信息,作用:当点击播控中心的时候,会跳转到app中来
    let wantAgentInfo: wantAgent.WantAgentInfo = {
      wants: [
        {
          bundleName: 'com.zhangjian.myapplication',//包名
          abilityName: 'EntryAbility' }
      ],
      operationType: wantAgent.OperationType.START_ABILITIES,
      requestCode: 0,
      wantAgentFlags: [wantAgent.WantAgentFlags.UPDATE_PRESENT_FLAG]
    }

    let want=await wantAgent.getWantAgent(wantAgentInfo)

    // 申请长时间任务
    await backgroundTaskManager.startBackgroundRunning(getContext(),
    backgroundTaskManager.BackgroundMode.AUDIO_PLAYBACK,
      want
    )
  }
复制代码
AvSessionManager,后台播放任务之前需要初始化
import { avSession } from '@kit.AVSessionKit'

export class AvSessionManager{
  static session:avSession.AVSession//媒体会话对象
  static controller:avSession.AVSessionController//控制器

  static async init(context:Context){
    AvSessionManager.session=await avSession.createAVSession(context,'bgPlay','audio')
    AvSessionManager.controller=await AvSessionManager.session.getController()
  }
}

音乐管理借鉴实例:

import { media } from '@kit.MediaKit'
import { SongItemType } from '../bean/SongItemType'
import { AvSessionManager } from './AvSessionManager'
import { backgroundTaskManager } from '@kit.BackgroundTasksKit'
import { wantAgent } from '@kit.AbilityKit'

export class AvPlayerManager{

  static player:media.AVPlayer|null=null
  static currentMusic:SongItemType=new SongItemType()

  static async init(){
    if (!AvPlayerManager.player) {

      AvPlayerManager.player=await media.createAVPlayer()
    }
    AvPlayerManager.player.on('stateChange',(state)=>{
      switch (state){
        case 'initialized':
          AvPlayerManager.player?.prepare()
          break
        case 'prepared':
          AvPlayerManager.player?.play()
          break
      }

    })

    AvPlayerManager.player.on('durationUpdate',(duration)=>{
      AvPlayerManager.currentMusic.duration=duration
    })
    AvPlayerManager.player.on('timeUpdate',(time)=>{
      AvPlayerManager.currentMusic.time=time
    })
    AvPlayerManager.player.on('error',(time)=>{

    })
  }

  static async changePlay(){
    await AvPlayerManager.player?.reset()
  }

  static play(song:SongItemType){

    AvPlayerManager.startBackgroundTask()
    AvPlayerManager.player!.url=song.url
  }
  static playRaw(){
    AvPlayerManager.startBackgroundTask()
    let mp3=getContext().createModuleContext('entry').resourceManager.getRawFdSync('like.MP3')

    let avFileDescriptor: media.AVFileDescriptor =
      { fd: mp3.fd, offset: mp3.offset, length: mp3.length };

    AvPlayerManager.player!.fdSrc=avFileDescriptor

  }
  static playUrl(song:string){
    AvPlayerManager.startBackgroundTask()

    AvPlayerManager.player!.url=song
  }

//   开启后台长时间任务,,播放的时候调用
  static async startBackgroundTask(){

    // 如果已经存在,就表示开启了后台任务
    if (AvSessionManager.session.sessionId){
      return
    }

    // want的信息,作用:当点击播控中心的时候,会跳转到app中来
    let wantAgentInfo: wantAgent.WantAgentInfo = {
      wants: [
        {
          bundleName: 'com.zhangjian.myapplication',//包名
          abilityName: 'EntryAbility' }
      ],
      operationType: wantAgent.OperationType.START_ABILITIES,
      requestCode: 0,
      wantAgentFlags: [wantAgent.WantAgentFlags.UPDATE_PRESENT_FLAG]
    }

    let want=await wantAgent.getWantAgent(wantAgentInfo)

    // 申请长时间任务
    await backgroundTaskManager.startBackgroundRunning(getContext(),
    backgroundTaskManager.BackgroundMode.AUDIO_PLAYBACK,
      want
    )
  }
}
相关推荐
鸿蒙自习室2 小时前
鸿蒙多线程开发——线程间数据通信对象01
ui·华为·harmonyos·鸿蒙
SameX3 小时前
HarmonyOS Next 企业数据备份与恢复策略
前端·harmonyos
SameX3 小时前
HarmonyOS Next 企业数据传输安全策略
前端·harmonyos
花先锋队长3 小时前
升级鸿蒙NEXT后,你的手机相机发生了这些变化……
华为·智能手机
SuperHeroWu74 小时前
【HarmonyOS】鸿蒙应用唤起系统相机拍照
华为·harmonyos·系统相机·photo·startability·camerapicker
惊鸿一博4 小时前
读书笔记_《创华为.任正非传》_精华书摘
华为
stone51954 小时前
鸿蒙系统ubuntu开发环境搭建
c语言·ubuntu·华为·嵌入式·harmonyos
bingw01145 小时前
华为机试HJ62 查找输入整数二进制中1的个数
数据结构·算法·华为
踏雪Vernon15 小时前
[OpenHarmony5.0][Docker][环境]OpenHarmony5.0 Docker编译环境镜像下载以及使用方式
linux·docker·容器·harmonyos