Intereting Posts
Android: наложение изображения (jpg) с прозрачностью Сохраните файлы SharedPreferences в пользовательском каталоге или получите по умолчанию SharedPreferences dir Android: Есть ли способ имитировать события D-Pad (API 10)? Что такое стандартное разрешение планшета Android? Не удалось выполнить cmd + щелчок по методу Java в Eclipse в Mountain Lion Andengine: добавьте представление, содержащее элементы управления пользовательским интерфейсом поверх andengine с помощью addContentView Как центрировать вектор, который можно рисовать в списке слоев без масштабирования Как добавить прядильщик в заголовок активности? OnPause / onRestore с savedInstanceState Android: в чем разница между сосредоточенными, включенными, нажатыми и выбранными состояниями? Создайте google-services.json для Android OBJ vs 3DS – Какой лучший формат для Android 3D Development Почему requestLayout вызывается непосредственно после аннулирования Клики для ссылок на веб-просмотр Android Оптимизация кода Java / Android: устраняет ли Java недостижимый код при сборке

Почему невозможно воспроизвести аудиофайл при голосовом вызове в android

Этот вопрос может показаться повторением следующих вопросов:
Как воспроизвести аудиофайл при голосовом вызове в android
Фоновый звук для звонка в процессе – возможно?

Ответы на эти вопросы говорят о невозможности воспроизведения предварительно записанного звука при голосовом вызове в android. Я хочу знать, почему это невозможно? Какое ограничение (аппаратное / программное обеспечение)? Действительно ли это ограничение или сделано намеренно? Можем ли мы изменить исходный код андроида, чтобы это стало возможным?

Solutions Collecting From Web of "Почему невозможно воспроизвести аудиофайл при голосовом вызове в android"

Я думаю, что это ограничение , введенное по соображениям безопасности и ограниченное на уровне ОС.

Давайте проанализируем угрозу безопасности, прежде всего. Если вы смогли воспроизвести пользовательские аудиофайлы для вызываемого абонента, откроется целый мир минусов : вы можете обмануть поддержку клиентов, вы могли бы притвориться кем-то другим, вы могли бы дать несанкционированные подтверждения покупки и так далее. По этой причине ни Android, ни iOS не позволяют использовать эту функцию.

На Android вы не сможете сделать это программным способом, просто потому, что текущие API не позволят вам это сделать . Об этом говорится в официальной документации, как указано здесь . Если вы вникнете в исходный код, возможно, вы можете включить эту функцию, обратившись к выходу микрофона во время телефонного разговора, но для этого потребуется запустить свою пользовательскую версию Android. Хорошей отправной точкой будет источник AudioTrack , доступный здесь .


EDIT : хорошим примером аудиомодуля является включение динамика Nexus 5 в качестве второго громкоговорителя (требуется корень). Здесь можно найти.

После тщательного исследования, я узнал, что существует более чем одно ограничение / препятствия, чтобы сделать это возможным. Эти ограничения / препятствия находятся на трех разных уровнях.

Первое ограничение относится к уровню API, потому что нет API высокого уровня для воспроизведения звуковых файлов в разговоре во время разговора, как указано в официальной документации Android .

Второе ограничение – на уровне радиоинтерфейса (RIL). RIL передает полный контроль над вызовом Radio Daemon (rild) библиотеки Linux, который затем передает управление поставщику RIL. Это означает, что мы не можем манипулировать голосовым вызовом в исходном коде Android.

Даже если мы сможем устранить эти два ограничения, мы все равно не сможем воспроизвести аудиофайл для текущего голосового вызова. Потому что есть третье ограничение . У каждого поставщика есть своя библиотека RIL, которая общается с Radio Daemon (rild). Это требует, чтобы поставщик RIL был открытым исходным кодом, которого нет на самом деле. Поставщики оборудования обычно не делают код своих драйверов устройств доступным.

Подробное обсуждение этой темы присутствует по этой ссылке .

Это связано с программным обеспечением из-за приоритетности маршрутизации аудио в Android. Взгляните на CallManager, где вы можете setAudioMode() метод setAudioMode() . После того, как аудио-режим был установлен на MODE_IN_COMMUNICATION следующий код

 audioManager.requestAudioFocusForCall(AudioManager.STREAM_VOICE_CALL, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT); 

С этого момента услуга телефонии имеет наивысший приоритет и не допускает параллельного воспроизведения другого звука.

Примечание. Вы можете воспроизводить аудиоданные только на стандартном устройстве вывода. В настоящее время это динамик мобильного устройства или Bluetooth-гарнитура. Вы не можете воспроизводить звуковые файлы во время разговора во время разговора.

См. Официальную ссылку http://developer.android.com/guide/topics/media/mediaplayer.html

Внедряя AudioManager.OnAudioFocusChangeListener, вы можете получить состояние аудиомастера. Так что, если какая-либо музыка воспроизводится в фоновом режиме, вы можете получить состояния AudioManager (воспроизведение и пауза полностью в руках разработчика) аналогично ……

Некоторые из встроенных музыкальных плееров в Android-устройстве, где они работают с этим, ограничивают музыку, когда звонок находится в TelephonyManager.EXTRA_STATE_OFFHOOK. Так что этот сценарий также полностью находится в руке разработчика (независимо от того, обрабатывать или нет), если он не обрабатывает оба, будет играть параллельно Y