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

этот вопрос может показаться повторением таких вопросов, как::
Как воспроизвести аудиофайл на голосовом вызове в android
фоновый звук для вызова в процессе-возможно?

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

5 ответов


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

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

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


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


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

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

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

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

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


Это программное обеспечение, связанное с приоритетностью маршрутизации звука в Android. Взгляните в callmanager выполняет где вы можете копаться в методе 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. таким образом, если какая-либо музыка играет в фоновом режиме, вы можете получить состояния AudioManager(воспроизведение и приостановка полностью в руках разработчика) аналогичным образом......

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