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

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
    )
  }
}
相关推荐
行者-全栈开发4 小时前
【鸿蒙心迹】三方库移植(二)——CMake 交叉编译与符号冲突排查实录(HarmonyOS 7.x)
harmonyos·cmake·交叉编译·三方库移植·ohos·符号冲突
梦想不只是梦与想6 小时前
鸿蒙三方库源码调试
harmonyos·断点调试·三方源码调试
用户117910488337 小时前
AI输出满屏井号星号?hmharness把Markdown渲染成终端表格 GitHub:swsgbl/hmharness
ai编程·harmonyos
了一1239 小时前
鸿蒙ArkWeb 长截图(滚动截图)技术方案总结
harmonyos
熊猫钓鱼>_>10 小时前
平行视界兼容模式与魔法变量配置避坑【鸿蒙心迹】
运维·服务器·开发语言·笔记·华为·harmonyos·openharmony
李&@杰11 小时前
小型园区网从零到精通
网络·tcp/ip·华为
罗四强11 小时前
第2篇:环境搭建:DevEco Studio 安装 + 第一个 Hello World
harmonyos·鸿蒙·鸿蒙系统
用户1179104883312 小时前
AI终端里复制不了代码?hmharness把鼠标还给终端 GitHub:swsgbl/hmharness
ai编程·harmonyos
贾伟康14 小时前
HarmonyOS 端侧智能体长对话压缩:摘要版本、证据索引与安全回退
harmonyos·arkts·状态恢复·上下文压缩·端侧智能体
NJPJI_Yang15 小时前
鸿蒙操作系统小艺 Skill 开发实战:让应用被 HarmonyOS 7 一句话召唤
pytorch·深度学习·harmonyos