android - 如何使用 Visualizer 类检测 Android 中的拨出调用铃声?

标签 android

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

相关文章:

android - 为什么mvn android :lint skips sub modules?

android - 如何在 Android 中获取 Drawable 的颜色

c# - 400 错误请求仅在 Android 应用程序中无效的主机名

android - Galaxy Nexus 在使用 crop Intent 时出现循环

android - ViewModel 能否在 Activity 保存和恢复后继续存在?

android - 将数据保存在本地存储,并在手机在线时将其发送到服务器

android - Activity 生命周期单元测试

android - ViewModelProviders 实例失败,因为无法解析 "of"

android - 使 Android 2.1 上的蓝牙无限期可发现

java - Android 父类(super class)到子类的转换