我目前需要捕捉拨出电话开始响铃的时刻。根据Abeer Ahmad在 "How to identify the ringing state of outgoing call in android" ,一个解决方案是使用 Visualizer class 检测发出的声音的频率变化(从 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)。
最佳答案
调用 new Visualizer(0);
监听 Stream 0,混合输出。
问题是调用音频并不总是出现在混合输出中,如 this Google Bug 所示所以你需要自己找到正确的流。但是,我还没有找到执行此操作的简单方法。
MediaPlayer 曾经有一个可以使用的非公开监听方法,但它已从最新版本中删除。您可以尝试的远景是在同一流上创建音轨并收听该 session 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 将成为唯一允许产生音频的 session ,它应该会影响可视化工具的结果。
注意:如果您查看 AudioManager sources 中的 generateAudioSessionId您会看到它使用 Native AudioSystem 类。我建议可以使用 NDK 访问此类并找到当前 Audio Session ID
关于android - 如何使用 Visualizer 类检测 Android 中的拨出调用铃声?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42627180/