Intereting Posts
Smack throws "NoClassDefFoundError: сбой разрешения: Lorg / jxmpp / util / XmppStringUtils" Как я могу вызвать getContentResolver в android? Обнаруживать браузер Android или WebView Пользовательское сворачивание панели инструментов сглаживает изменение размера Получить имя из абсолютного пути, подстроку из последней косой черты, java android Рассчитать уровень громкости от микрофона на Android Как я могу реализовать SlideShow в android? Android View Pager Adapter показывает пустой экран Являются ли приложения IOS и Android с Webview только рассмотренными гибридами или веб-приложениями? EditText в ListView с помощью windowSoftInputMode adjustPan Сбой Android ViewGroup: попытка чтения из поля 'int android.view.View.mViewFlags' по ссылке нулевого объекта Добавление пространства между столбцами таблицыLayout Удаление левой стрелки из панели действий в андроиде? Android-фрагмент oncreateview вызвал изменение вкладок Android Studio: отключить предупреждение для строки if if

Как определить исходящий звонок в Android с помощью класса Visualizer?

В настоящее время мне нужно зафиксировать момент, когда начинается исходящий звонок. Согласно Abeer Ahmad в разделе «Как определить состояние звонка исходящего вызова в android» , решение должно заключаться в обнаружении изменения частоты излучаемого звука (от 0 до значения, соответствующего кольцу) с использованием класса Visualizer . Однако при выполнении вызова не регистрируется значение частоты, отличное от 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).

Solutions Collecting From Web of "Как определить исходящий звонок в Android с помощью класса Visualizer?"

Вызов new Visualizer(0); Прослушивает Stream 0, смешанный выход.

Проблема заключается в том, что звук вызова не всегда присутствует в смешанном выпуске, как указано в этой ошибке Google, поэтому вам нужно найти правильный поток самостоятельно. Однако я не нашел простой способ сделать это.

Для MediaPlayer использовался непубличный метод snoop, который можно было использовать, но он был удален из последних версий. Длинный выстрел, который вы могли бы попробовать, – создать звуковую дорожку в одном потоке и прослушивать этот идентификатор сеанса:

 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 станет единственным сеансом, позволяющим производить аудио, он должен влиять на результаты визуализатора.

Примечание . Если вы посмотрите на generateAudioSessionId в источниках AudioManager, вы увидите, что он использует класс Native AudioSystem. Я бы предположил, что можно использовать NDK для доступа к этому классу и найти текущий идентификатор аудио сессии