AVAudioRecorder - 如何从来电中恢复
创始人
2024-11-12 21:30:45
0

在来电中恢复AVAudioRecorder的解决方法如下:

  1. 监听来电状态变化,可以使用CoreTelephony框架来实现。在电话接通和挂断时,会触发相应的通知,我们可以在通知的回调方法中暂停和恢复录音。
import AVFoundation
import CoreTelephony

class ViewController: UIViewController {
    var audioRecorder: AVAudioRecorder?
  
    override func viewDidLoad() {
        super.viewDidLoad()
    
        // 监听电话状态变化
        NotificationCenter.default.addObserver(self, selector: #selector(handleCallStateChange), name: NSNotification.Name.CTCallStateDidChange, object: nil)
        
        // 设置录音会话
        let session = AVAudioSession.sharedInstance()
        do {
            try session.setCategory(.playAndRecord, mode: .default, options: [])
            try session.setActive(true)
        } catch {
            print("Failed to set audio session: \(error.localizedDescription)")
        }
        
        // 初始化AVAudioRecorder
        let audioFilename = getDocumentsDirectory().appendingPathComponent("recording.wav")
        let settings = [
            AVFormatIDKey: Int(kAudioFormatLinearPCM),
            AVSampleRateKey: 44100.0,
            AVNumberOfChannelsKey: 2,
            AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue
        ]
        
        do {
            audioRecorder = try AVAudioRecorder(url: audioFilename, settings: settings)
            audioRecorder?.prepareToRecord()
        } catch {
            print("Failed to initialize audio recorder: \(error.localizedDescription)")
        }
    }
    
    @objc func handleCallStateChange(notification: NSNotification) {
        guard let call = CTCallCenter().currentCalls.first else { return }
        
        if call.callState == CTCallStateConnected {
            // 来电接通,暂停录音
            audioRecorder?.pause()
        } else if call.callState == CTCallStateDisconnected {
            // 来电挂断,恢复录音
            audioRecorder?.record()
        }
    }
    
    func getDocumentsDirectory() -> URL {
        let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
        return paths[0]
    }
}

上述代码中,我们在viewDidLoad方法中设置了录音会话,并初始化了AVAudioRecorder对象。在handleCallStateChange方法中,我们根据来电状态的变化来暂停和恢复录音。当电话接通时,我们调用pause方法暂停录音;当电话挂断时,我们调用record方法恢复录音。

请注意,为了监听来电状态变化,需要在项目中导入CoreTelephony.framework,并添加对CoreTelephony的引用。

  1. 如果你使用SwiftUI来实现界面,可以使用onReceive修饰符来监听电话状态变化。
import AVFoundation
import CoreTelephony
import SwiftUI

class RecorderViewModel: ObservableObject {
    var audioRecorder: AVAudioRecorder?
  
    init() {
        // 监听电话状态变化
        NotificationCenter.default.addObserver(self, selector: #selector(handleCallStateChange), name: NSNotification.Name.CTCallStateDidChange, object: nil)
        
        // 设置录音会话
        let session = AVAudioSession.sharedInstance()
        do {
            try session.setCategory(.playAndRecord, mode: .default, options: [])
            try session.setActive(true)
        } catch {
            print("Failed to set audio session: \(error.localizedDescription)")
        }
        
        // 初始化AVAudioRecorder
        let audioFilename = getDocumentsDirectory().appendingPathComponent("recording.wav")
        let settings = [
            AVFormatIDKey: Int(kAudioFormatLinearPCM),
            AVSampleRateKey: 44100.0,
            AVNumberOfChannelsKey: 2,
            AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue
        ]
        
        do {
            audioRecorder = try AVAudioRecorder(url: audioFilename, settings: settings)
            audioRecorder?.prepareToRecord()
        } catch {
            print("Failed to initialize audio recorder: \(error.localizedDescription)")
        }
    }
    
    @objc func handleCallStateChange(notification: NSNotification) {
        guard let call = CTCallCenter().currentCalls.first else { return }
        
        if call.callState == CTCallStateConnected {
            // 来电接通,暂停录音
            audioRecorder?.pause()
        } else if call.callState

相关内容

热门资讯

黑科技能赢(wpk微扑克模拟器... 黑科技能赢(wpk微扑克模拟器)wEpoKe原来有挂!太坑了总是存在有挂(2021已更新)(哔哩哔哩...
黑科技美元局(Wepoke黑科... 【福星临门,好运相随】;黑科技美元局(Wepoke黑科技)wepoke好像真的是有挂!太实锤了果然是...
黑科技有挂(aapoker实测... 这是一款非常优秀的红龙扑克 ia辅助检测软件,能够让你了解到红龙扑克中牌率当中全部隐藏参数,与同类红...
黑科技代打(德扑自定义房间)A... 黑科技代打(德扑自定义房间)Aapoker从来有挂!太嚣张了往昔真的是有挂(2024已更新)(哔哩哔...
黑科技计算(pokermast... 黑科技计算(pokermastersteam外挂)微扑克好像真的有挂!太无语了原生存在有挂(2021...
黑科技规律(Wepoke安卓)... 黑科技规律(Wepoke安卓)AAPOKEr果然是真的有挂!太离谱了本然是真的有挂(2021已更新)...
黑科技美元局(菠萝德州)德州先... 黑科技美元局(菠萝德州)德州先前真的有挂!太坑了从来真的是有挂(2023已更新)(哔哩哔哩);菠萝德...
黑科技新版(Wepoke德州版... 黑科技新版(Wepoke德州版)德州wpk果然是有挂!太离谱了其实是真的有挂(2025已更新)(哔哩...
黑科技最新(wpk逻辑)wpk... 黑科技最新(wpk逻辑)wpk俱乐部果然真的是有挂!太嚣张了固有有挂(2022已更新)(哔哩哔哩)1...
黑科技了解(红龙扑克发牌)we... we辅助poker新手教程相关信息汇总(需添加指定威信136704302获取下载链接);黑科技了解(...