Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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


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

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

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

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