iOS 获取手机后台音频状态以及类别

需求: 获取iPhone手机其他第三方音频状态,是否在打电话?是否在后台听音乐?是否在用qq语音打电话?是否在用微信语音打电话?

 

第一步:导入AVKit

查找官方文档发现:

/// The prompt style is a hint to sessions using AVAudioSessionModeVoicePrompt to alter the type of

    /// prompts they issue in response to other audio activity on the system, such as Siri and phone

    /// calls. This property is key-value observable.

    @available(iOS 13.0, *)

    open var promptStyle: AVAudioSession.PromptStyle { get }

 

第二步:继续看这个属性写的是什么东西:

/**
         @enum     AVAudioSessionPromptStyle
         @brief
             The prompt style is a hint to sessions that use AVAudioSessionModeVoicePrompt to modify the type of
             prompt they play in response to other audio activity on the system, such as Siri or phone calls.
             Sessions that issue voice prompts are encouraged to pay attention to changes in the prompt style and
             modify their prompts in response. Apple encourages the use of non-verbal prompts when the Short
             style is requested.
         @var AVAudioSessionPromptStyleNone
             Indicates that another session is actively using microphone input and would be negatively impacted
             by having prompts play at that time. For example if Siri is recognizing speech, having navigation or
             exercise prompts play, could interfere with its ability to accurately recognize the user’s speech.
             Client sessions should refrain from playing any prompts while the prompt style is None.
         @var AVAudioSessionPromptStyleShort
             Indicates one of three states: Siri is active but not recording, voicemail playback is active, or
             voice call is active. Short, non-verbal versions of prompts should be used.
         @var AVAudioSessionPromptStyleNormal
             Indicates that normal (long, verbal) versions of prompts may be used.
     */
    public enum PromptStyle : UInt {

        
        case none = 1852796517

        case short = 1936224884

        case normal = 1852992876
    }

//知道你们懒,我帮你们谷歌翻译一下
@enum AVAudioSessionPromptStyle
         @简要
             提示样式是使用AVAudioSessionModeVoicePrompt修改会话类型的会话的提示
             提示他们播放以响应系统上的其他音频活动,例如Siri或电话。
             鼓励发出语音提示的会话注意提示样式和
             修改他们的提示以作为回应。当短促时,Apple鼓励使用非语言提示
             要求样式。
         @var AVAudioSessionPromptStyleNone
             表示另一个会话正在使用麦克风输入,并且会受到负面影响
             通过在那时播放提示。例如,如果Siri识别语音,导航或
             锻炼提示播放,可能会干扰其准确识别用户语音的能力。
             提示样式为“无”时,客户端会话应避免播放任何提示。
         @var AVAudioSessionPromptStyleShort
             指示以下三种状态之一:Siri处于活动状态但未录制,语音邮件播放处于活动状态,或
             语音通话已启动。提示应使用简短的非语言版本的提示。
         @var AVAudioSessionPromptStyleNormal
             指示可以使用普通(长,口头)提示版本。

 

第三步:使用方法

let types: UInt = AVAudioSession.sharedInstance().promptStyle.rawValue
                if types == 1852992876 { 
                    //普通听歌等情景
                } else if types == 1936224884{ 
                    //手机通话,微信通话等情景
                } else {
                    //1852796517 
                    //  其他特殊情景,我不想要其他提示,导航等
                }            

 

总结: 以上是API是iOS13.0之后可以使用的方法

那么iOS13.0之前的系统怎么办呢?

我自己想了个办法,虽然不是最佳,但至少能凑合用一下。如果在听歌,则会有一瞬间,声音没有了,然后又恢复了

    ///判断暂停success  or  failed 
    //1. 先尝试下暂停音频
    //2. 获取第三方音频播放的status
    //3. if 暂停 success  当前有第三方音频例如网易云音乐等在听歌
    //4. if 在打电话 or  QQ  or  WeChat 电话  ,则暂停failed 
    func isStop() {
        self.setOtherAudioCAtegory(category: .soloAmbient)

        DispatchQueue.main.asyncAfter(deadline: .now() + 0.05) {[weak self] in
            self?.isOtherAudioPlaying = AVAudioSession.sharedInstance().isOtherAudioPlaying
            if self?.isOtherAudioPlaying == true {
                //暂停 failed
                // 在这里我可以做别的事情了
            } else {
                //暂停success
                 // 在这里我可以做别的事情了
            }
            self?.resumeGoOn()
        }

    }




//尝试暂停一下其他音频
    func setOtherAudioCAtegory(category: AVAudioSession.Category) {
   
        try? audioSession.setCategory(category);
        try? audioSession.setActive(true)
        
    }


/// go on 第三方音乐app
    func resumeGoOn() -> Void {
        do {
            try audioSession.setActive(false, options: .notifyOthersOnDeactivation)
        } catch {
            
        }
    }

 

posted @ 2020-11-02 16:33  醉酒清风  阅读(813)  评论(0编辑  收藏  举报