You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何检测其他应用是否正在播放音频——实现音乐播放器应用在视频播放时自动暂停功能

检测其他应用音频播放并自动暂停音乐的实现方案

嘿,这个需求其实在移动端开发里挺常见的,不同平台的实现思路各有侧重,我给你梳理下具体的做法:

Android 平台

Android 系统本身提供了**音频焦点(Audio Focus)**机制,这是处理这类场景的标准方案:

  • 申请并监听音频焦点
    首先你需要向系统申请音频焦点,同时注册一个焦点变化监听器。当其他应用请求音频焦点时,系统会通过回调通知你,这时你就可以暂停自己的音乐播放。示例代码大概是这样的:
    val audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager
    val focusRequest = AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN)
        .setOnAudioFocusChangeListener { focusChange ->
            when (focusChange) {
                AudioManager.AUDIOFOCUS_LOSS,
                AudioManager.AUDIOFOCUS_LOSS_TRANSIENT,
                AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK -> {
                    // 失去焦点,暂停音乐播放
                    yourMusicPlayer.pause()
                }
                AudioManager.AUDIOFOCUS_GAIN -> {
                    // 重新获得焦点,可以恢复播放
                    yourMusicPlayer.play()
                }
            }
        }
        .build()
    val result = audioManager.requestAudioFocus(focusRequest)
    if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
        // 成功获取焦点,开始播放
        yourMusicPlayer.play()
    }
    
  • 主动检测当前播放状态
    如果需要主动判断是否有其他应用在播放音频,API 26及以上可以用 getActivePlaybackConfigurations() 获取当前活跃的音频播放配置,从中拿到其他应用的包名:
    val playbackConfigs = audioManager.activePlaybackConfigurations
    val isOtherAppPlaying = playbackConfigs.any { config ->
        config.clientPackageName != packageName && config.playbackType == AudioPlaybackConfiguration.PLAYBACK_TYPE_MEDIA
    }
    if (isOtherAppPlaying) {
        yourMusicPlayer.pause()
    }
    

iOS 平台

iOS 则通过 AVAudioSession 来处理音频相关的系统交互:

  • 监听音频中断通知
    注册 AVAudioSessionInterruptionNotification 通知,当其他应用抢占音频资源时,系统会发送中断事件,你可以在回调里暂停播放:
    import AVFoundation
    
    override func viewDidLoad() {
        super.viewDidLoad()
        NotificationCenter.default.addObserver(
            self,
            selector: #selector(handleAudioInterruption(_:)),
            name: AVAudioSession.interruptionNotification,
            object: AVAudioSession.sharedInstance()
        )
    }
    
    @objc func handleAudioInterruption(_ notification: Notification) {
        guard let info = notification.userInfo,
              let typeValue = info[AVAudioSessionInterruptionTypeKey] as? UInt,
              let type = AVAudioSession.InterruptionType(rawValue: typeValue) else {
            return
        }
        if type == .began {
            // 音频被中断,暂停播放
            yourMusicPlayer.pause()
        } else if type == .ended {
            // 中断结束,可以恢复播放
            yourMusicPlayer.play()
        }
    }
    
  • 直接判断是否有其他应用播放
    iOS 14及以上提供了 isOtherAudioPlaying 属性,可以直接查询当前是否有其他应用在播放音频:
    if AVAudioSession.sharedInstance().isOtherAudioPlaying {
        yourMusicPlayer.pause()
    }
    

跨平台框架(比如 Flutter)

如果是用跨平台框架开发,可以借助成熟的音频插件来简化处理,比如 just_audioaudioplayers,这些插件已经封装了原生的音频焦点监听逻辑,只需要配置对应的参数就能实现自动暂停的效果。

另外要注意,不管哪个平台,都需要在应用权限配置里添加对应的音频权限,比如 Android 的 android.permission.MEDIA_CONTENT_CONTROL(API 21+),iOS 的音频相关权限一般默认已包含,但如果涉及音乐库访问需要额外配置。

内容的提问来源于stack exchange,提问作者Y programming واى برمجة

火山引擎 最新活动