You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

技术问询:如何在接听/结束通话时触发音频文件(仅接收方播放)

实现接听/结束通话时触发音频播放(仅接收方)

Android 实现方案

核心步骤

  • 监听通话状态:通过TelephonyManager注册PhoneStateListener,捕捉来电、接听、结束通话三种状态
  • 过滤接收方:标记来电场景(CALL_STATE_RINGING),确保仅在接收来电时触发音频
  • 播放音频:使用MediaPlayer播放本地预存的音频文件

代码示例

// 初始化通话状态监听
TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
boolean isIncomingCall = false;

telephonyManager.listen(new PhoneStateListener() {
    @Override
    public void onCallStateChanged(int state, String incomingNumber) {
        super.onCallStateChanged(state, incomingNumber);
        switch (state) {
            case TelephonyManager.CALL_STATE_RINGING:
                isIncomingCall = true; // 标记为来电(接收方)
                break;
            case TelephonyManager.CALL_STATE_OFFHOOK:
                if (isIncomingCall) {
                    // 接听来电时播放音频
                    playCallAudio();
                }
                break;
            case TelephonyManager.CALL_STATE_IDLE:
                if (isIncomingCall) {
                    // 结束来电时播放音频
                    playCallAudio();
                    isIncomingCall = false; // 重置标记
                }
                break;
        }
    }
}, PhoneStateListener.LISTEN_CALL_STATE);

// 音频播放方法
private void playCallAudio() {
    MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.call_trigger_sound);
    mediaPlayer.start();
    mediaPlayer.setOnCompletionListener(MediaPlayer::release); // 播放完成后释放资源
}

注意事项

  • 需动态申请READ_PHONE_STATE权限(Android 10+)
  • 音频文件需放入res/raw目录下
  • 确保在通话状态切换时重置isIncomingCall标记,避免误触发

iOS 实现方案

核心步骤

  • 监听通话事件:使用CallKit框架监听通话状态变化
  • 识别接收方:通过CXCall的isOutgoing属性判断是否为来电(接收方)
  • 播放音频:用AVAudioPlayer播放本地音频,需配置音频会话避免冲突

代码示例

import CallKit
import AVFoundation

class CallAudioTrigger: NSObject, CXCallObserverDelegate {
    private let callObserver = CXCallObserver()
    private var audioPlayer: AVAudioPlayer?
    
    override init() {
        super.init()
        callObserver.setDelegate(self, queue: DispatchQueue.main)
        // 初始化音频播放器
        guard let audioPath = Bundle.main.path(forResource: "call_trigger_sound", ofType: "mp3") else { return }
        let audioURL = URL(fileURLWithPath: audioPath)
        audioPlayer = try? AVAudioPlayer(contentsOf: audioURL)
        audioPlayer?.prepareToPlay()
    }
    
    func callObserver(_ callObserver: CXCallObserver, callChanged call: CXCall) {
        // 接听来电时触发
        if !call.isOutgoing && call.hasConnected && !call.hasEnded {
            audioPlayer?.play()
        }
        // 结束来电时触发
        if !call.isOutgoing && call.hasEnded {
            audioPlayer?.play()
        }
    }
}

// 在AppDelegate中初始化监听
let callAudioTrigger = CallAudioTrigger()

注意事项

  • iOS 10+需使用CallKit,低版本可替换为CTCallCenter
  • Info.plist需添加NSMicrophoneUsageDescription(部分版本强制要求)
  • 配置音频会话为AVAudioSession.Category.playback,确保通话结束后音频正常播放

通用关键要点

  • 仅在接收方设备上标记来电场景,绝对避免呼叫方触发音频
  • 音频文件提前打包进应用资源,不要依赖网络加载
  • 严格管理音频播放器生命周期,防止内存泄漏

内容的提问来源于stack exchange,提问作者Darth Vader

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 12:28:10