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

相关内容

热门资讯

不少玩家反映!衢州都莱辅助器免... 不少玩家反映!衢州都莱辅助器免费下载!好像确实有开挂辅助挂(有挂教学)-哔哩哔哩1、用户打开应用后不...
教学辅助挂!透视辅助工具!原来... 教学辅助挂!透视辅助工具!原来真的有开挂辅助app(有挂分析)-哔哩哔哩1、透视辅助工具免费辅助多个...
做出回应!仙桃晃晃辅助器!其实... 做出回应!仙桃晃晃辅助器!其实是真的有开挂辅助教程(新版有挂)-哔哩哔哩1、许多玩家不知道仙桃晃晃辅...
值得注意的是!决战卡五星最新辅... 值得注意的是!决战卡五星最新辅助!真是确实有开挂辅助方法(证实有挂)-哔哩哔哩1、值得注意的是!决战...
黑科技攻略!浙江宝宝游戏辅助器... 黑科技攻略!浙江宝宝游戏辅助器是真的嘛!真是真的是有开挂辅助脚本(有挂秘诀)-哔哩哔哩1、打开软件启...
刚刚!余干五十k攻略!切实确实... 刚刚!余干五十k攻略!切实确实有开挂辅助教程(竟然有挂)-哔哩哔哩1、超多福利:超高返利,海量正版游...
2026版攻略!川南九九辅助!... 2026版攻略!川南九九辅助!一直确实有开挂辅助攻略(有挂解密)-哔哩哔哩1)川南九九辅助免费钻石:...
此事迅速冲上热搜!哥哥打大a有... 此事迅速冲上热搜!哥哥打大a有没有辅助!一贯是真的有开挂辅助脚本(有挂秘籍)-哔哩哔哩1、该软件可以...
2026版规律!约局吧透视辅助... 2026版规律!约局吧透视辅助ios下载!一直真的有开挂辅助技巧(今日头条)-哔哩哔哩约局吧透视辅助...
2026版辅助挂!胡乐辅助脚本... 2026版辅助挂!胡乐辅助脚本是真的假的!切实真的是有开挂辅助app(有挂透视)-哔哩哔哩进入游戏-...