我目前需要捕捉拨出电话开始响铃的那一刻。根据{{3}}中的Abeer Ahmad,解决方案是使用"How to identify the ringing state of outgoing call in android"检测发出的声音的频率变化(从0到对应于环的值)。但是,在我打电话时,没有检测到0(静音)以外的频率值。这与移动设备发出另一种声音时发生的情况不对应,例如音频轨道的再现,其中检测到频率值。有人可以帮助我,还是给我一个替代解决方案?
这是我的代码:
mVisualizer = new Visualizer(0);
mVisualizer.setCaptureSize(Visualizer.getCaptureSizeRange()[1]);
Visualizer.OnDataCaptureListener listener = new Visualizer.OnDataCaptureListener(){
@Override
public void onWaveFormDataCapture(Visualizer visualizer, byte[] bytes, int samplingRate) { }
@Override
public void onFftDataCapture(Visualizer visualizer, byte[] bytes, int samplingRate) {
for (int i=0;i<bytes.length;i++) {
if (bytes[i] != 0) {
Log.i("INFO","FREQUENCY:"+bytes[i]);
break;
}
}
}
};
mVisualizer.setDataCaptureListener(listener, Visualizer.getMaxCaptureRate() / 2, true, true);
我使用的是Android Jellybean(API 17)。
答案 0 :(得分:1)
调用new Visualizer(0);
侦听流0的混合输出。
问题是呼叫音频不会始终出现在this Google Bug所示的混合输出中,因此您需要自己找到正确的流。但是,我还没有找到一种简单的方法来做到这一点。
MediaPlayer曾经有一个非公开的窥探方法可以使用,但它已从最近的版本中删除。您可以尝试的远景是在同一个流上创建音轨并收听该会话ID:
AudioTrack track = new AudioTrack(AudioManager.STREAM_VOICE_CALL, aSampleRate,
AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT,
aBuffersize, AudioTrack.MODE_STREAM);
您也可以在启动可视化工具之前尝试调用audioManager.setStreamSolo(AudioManager.STREAM_VOICE_CALL, true);
。从理论上讲,STREAM_VOICE_CALL将成为唯一允许生成音频的会话,它应该会影响可视化工具的结果。
注意:如果查看AudioManager sources中的generateAudioSessionId,您会看到它使用Native AudioSystem类。我建议可以使用NDK访问此课程并查找当前的音频会话ID