HarmonyOS鸿蒙Next中如何获取手机是否在播放音视频的状态

HarmonyOS鸿蒙Next中如何获取手机是否在播放音视频的状态

安卓有AudioManager可以监听,是否在播放音视频,鸿蒙next有类似的接口吗

//安卓检查是否在播放音视频
AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); 
audioManager.isMusicActive();

//返回true,代表在播放音视频,不论在播放抖音、QQ音乐、B站等,都会返回true,停止播放就返回false

11 回复

【背景知识】

AVSession Kit 是系统提供的音视频管控服务,用于统一管理系统中所有音视频行为,帮助开发者快速构建音视频统一展示和控制能力。AVSession Kit 提供的能力范围包括:

  • 提供音视频统一管控能力,音视频应用接入 AVSession 后,可以发送应用的数据(比如正在播放的歌曲、歌曲的播放状态等)到系统播控中心。用户可以通过播控中心、语音助手等系统应用切换多个应用、多个设备播放。
  • AVSession Kit 提供音频后台约束能力,应用接入 AVSession(媒体会话)后,可以进行后台音频播放。通过系统播控中心,应用后台播放可见可控,音视频应用可统一控制。此功能需要同时申请后台任务。

【解决方案】

设置播放状态。

应用可以通过 setAVPlaybackState。把当前的播放状态设置给系统,以在播控中心界面进行展示。播放状态一般是在资源播放后会进行变化的内容,包括:当前媒体的播放状态(state)、播放位置(position)、播放倍速(speed)、缓冲时间(bufferedTime)、循环模式(loopMode)、是否收藏(isFavorite)、正在播放的媒体 Id(activeItemId)、自定义媒体数据(extras)等。具体可参考:设置播放状态。示例代码如下:

import { avSession as AVSessionManager } from '@kit.AVSessionKit';
import { BusinessError } from '@kit.BasicServicesKit';

async function setSessionInfo(session: AVSessionManager.AVSession) {
  let playbackState: AVSessionManager.AVPlaybackState = {
    state: AVSessionManager.PlaybackState.PLAYBACK_STATE_PAUSE,  // 播放状态
    isFavorite: false  // 是否收藏
    // ...
  }
  session.setAVPlaybackState(playbackState).then(() => {
    console.info('SetAVPlaybackState successfully');
  }).catch((err: BusinessError) => {
    console.error(`SetAVPlaybackState error, code: ${err.code}, message: ${err.message}`);
  });
}

更多关于HarmonyOS鸿蒙Next中如何获取手机是否在播放音视频的状态的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


你好。

虽然目前系统直接监听 设备播放状态得接口。但是可以曲线实现,去监听音频焦点,这样就能知道当前有没有应用在播放音乐了。

// 监听音频焦点变化
media.on('audioFocusChange', (focusState) => {
  if (focusState === media.AudioFocusState.LOSS) {
    console.log('音频焦点丢失,可能有其他应用正在播放音频');
  } else if (focusState === media.AudioFocusState.GAIN) {
    console.log('获取到音频焦点,本应用可以播放音频');
  }
});

详情参见: [【HarmonyOS NEXT】使用AVPlayer播放音乐,导致系统其它应用音乐播放暂停 - 播放音频焦点管理 | 华为开发者联盟]

你好

监听系统公共事件里似乎有是否播放声音。

有文档的链接吗?帮贴一下,谢谢,

有要学HarmonyOS AI的同学吗,联系我:https://www.itying.com/goods-1206.html

使用AVPlayer的状态机,可通过state属性主动获取当前状态,也可通过监听stateChange事件上报当前状态

项目名称

  • 项目状态: 进行中
  • 项目类型: 移动应用
  • 项目描述: 这是一个帮助用户管理日常任务的应用。
  • 开始日期: 2023-01-01
  • 预计完成日期: 2023-12-31
  • 团队成员: 张三, 李四, 王五
  • 进度: 50%
  • 备注: 需要增加更多功能以满足用户需求。

试了好像不行啊,AVPlayer不是全局的吧,只是针对当前应用的吧,

在HarmonyOS Next中,可以通过AVSession模块获取音视频播放状态。使用avSession.getController()获取控制器,然后调用isActive()方法判断是否在播放。示例代码:

import avSession from '@ohos.multimedia.avsession';

let session = avSession.createAVSession(context, 'mySession', 'audio');
let controller = avSession.createController(session.sessionId);
let isPlaying = controller.isActive();

需要声明ohos.permission.MANAGE_MEDIA_RESOURCES权限。此方法仅适用于鸿蒙系统,不依赖Java/C。

在HarmonyOS Next中,可以通过AudioManager类来检测音视频播放状态,类似于Android的实现方式。具体方法如下:

import audio from '@ohos.multimedia.audio';

// 获取AudioManager实例
let audioManager = audio.getAudioManager();

// 检查是否有音频正在播放
let isPlaying = audioManager.isActive(audio.AudioVolumeType.MEDIA);

说明:

  1. audio.getAudioManager()获取音频管理实例
  2. isActive()方法传入audio.AudioVolumeType.MEDIA参数,用于检测媒体音频通道状态
  3. 返回值为boolean类型,true表示有音视频正在播放,false表示没有

这个API可以检测系统所有媒体应用的播放状态,包括音乐、视频等应用。需要注意的是,使用前需要在module.json5中声明ohos.permission.MICROPHONE权限。

回到顶部