如何使用Visualizer类检测Android中的拨出呼叫响铃?

时间:2017-03-06 13:42:39

标签: android

我目前需要捕捉拨出电话开始响铃的那一刻。根据{{​​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)。

1 个答案:

答案 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