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

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
    )
  }
}

### 鸿蒙系统后台播放音乐功能的实现 在鸿蒙系统中,通过 `DevEco Studio` 开发工具可以轻松实现后台播放音乐的功能。以下是关于如何利用 HarmonyOS 提供的能力来完成这一目标的关键技术要点。 #### 1. 资源调度与后台任务管理 HarmonyOS 将应用程序的状态划分为前台、后台以及挂起三种模式[^2]。当应用从前台切换至后台时,其资源使用会被严格控制以优化整体性能并节省电量。因此,在设计后台播放音乐功能时,需特别注意以下几点: - **后台任务能力**:HarmonyOS 提供了专门用于处理后台任务的支持机制,允许开发者定义特定的任务逻辑以便于即使应用处于后台也能继续执行必要的操作。 - **生命周期管理**:由于音频流媒体服务通常需要持续运行而不会因短暂失去焦点就中断,故应合理配置组件的生命期属性使其适应不同场景需求。 #### 2. 使用 Ability Framework 构建 Service Component 要实现在后台播放音乐,则可以通过创建一个 Background Service 来维持音轨回放过程不间断。具体步骤如下所示: ##### 创建 FA (Feature Ability) 或 PA (Particle Ability) 根据项目实际要求决定采用哪种形式的服务端实体——如果涉及复杂界面交互则选用FA;反之仅作为纯数据处理器的话推荐PA即可满足条件。 ##### 编写代码片段示例 下面给出一段简单的 Java 实现方案示意如何启动及停止背景中的 Media Player 对象实例化工作流程: ```java import ohos.aafwk.content.Intent; import ohos.app.Context; import ohos.media.player.MediaPlayer; public class MusicService extends Service { private MediaPlayer mediaPlayer; @Override public int onStartCommand(Intent intent, int flags, int startId){ String musicPath = "/path/to/your/music.mp3"; // 替换为真实路径地址 try{ this.mediaPlayer = new MediaPlayer(); this.mediaPlayer.setDataSource(musicPath); this.mediaPlayer.prepare(); this.mediaPlayer.start(); }catch(Exception e){ System.out.println(e.getMessage()); } return START_STICKY; } @Override public void onDestroy(){ super.onDestroy(); if(this.mediaPlayer != null && this.mediaPlayer.isPlaying()){ this.mediaPlayer.stop(); this.mediaPlayer.release(); } } } ``` 上述代码展示了怎样初始化MediaPlayer对象并将指定文件加载进来准备播放的过程。同时重写了两个重要函数分别对应开启和销毁service期间的动作响应行为。 #### 3. 处理设备方向变化事件 另外值得注意的是,当屏幕旋转或其他可能导致Activity重建的情况发生时,我们还需要妥善应对这些状况以免影响用户体验连续性。为此可覆盖 onConfigurationUpdated 方法来进行相应调整动作设置保持当前播放状态不变。 ```java @Override protected void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); // 如果存在正在播放的内容,则无需重新加载或者暂停 if(mediaPlayer!=null&&mediaPlayer.isPlaying()){ Log.d("MusicApp","Screen orientation changed but playback continues."); } } ``` 此部分确保无论外部环境改变与否都不会干扰内部核心业务正常运转轨迹。 --- ### 总结说明 综上所述,借助 HarmonyOS 平台上丰富的 API 接口文档资料指导配合恰当的设计思路规划完全可以达成预期效果即让音乐程序即便位于不可见区域依旧能够流畅运作下去直至人为干预终止为止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jian11058

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值