В Android есть ли способ направить звук в A2DP с помощью MODE_IN_COMMUNICATION?

Если я установлю для режима AudioManager значение MODE_IN_COMMUNICATION, а поток медиаплеера — STREAM_VOICE_CALL, я смогу направить звук на громкую связь или внутренний динамик телефонной трубки. И если он направлен на внутренний динамик, а к нему подключена проводная гарнитура, он автоматически направляется на него. Однако я не могу найти способ направить звук на гарнитуру A2DP (без изменения режима звука на MODE_NORMAL или потока на STREAM_MUSIC). Моя проблема в том, что использование MODE_NORMAL и STREAM_VOICE_CALL вызывает проблемы на некоторых устройствах, а использование STREAM_MUSIC является проблемой, если в фоновом режиме уже играет музыка, тогда мое приложение «смешивается» с этой фоновой музыкой.

Итак, я надеялся, что есть способ принудительно передать звук на гарнитуру A2DP, используя комбинацию MODE_IN_COMMUNICATION и STREAM_VOICE_CALL. Это возможно?


person user496854    schedule 08.05.2013    source источник


Ответы (1)


Возможно, это работает на некоторых устройствах, но если вам важна совместимость с большинством устройств, то ответ «Нет».

Когда телефон находится в состоянии MODE_IN_CALL или MODE_IN_COMMUNICATION, все потоки обычно следуют стратегии маршрутизации PHONE. Это означает, что маршрутизация на A2DP не будет разрешена, поскольку:

1) A2DP все равно не поддерживает двустороннюю передачу голоса.

2) Если ваш аксессуар BT поддерживает профиль громкой связи, он будет использовать канал SCO для голосового аудио, а канал ACL, используемый для A2DP, должен быть закрыт, чтобы избежать помех между ними.

person Michael    schedule 09.05.2013
comment
на самом деле STREAM_VOICE_CALL и MODE_NORMAL работают практически на всех устройствах. Я понимаю, о чем вы говорите, но есть некоторые устройства (и ПЗУ), которые вообще не передают звук при использовании STREAM_VOICE_CALL (без громкой связи или чего-то еще). Но любое устройство, которое позволяет использовать STREAM_VOICE_CALL для динамика, также будет передавать его через A2DP. - person user496854; 09.05.2013
comment
на самом деле STREAM_VOICE_CALL и MODE_NORMAL работают практически на всех устройствах Конечно, но я ответил на ваш вопрос относительно MODE_IN_COMMUNICATION. любое устройство, которое позволяет использовать STREAM_VOICE_CALL в качестве динамика, также будет передавать его через A2DP Не во время вызова (т. е. когда телефон находится в состоянии MODE_IN_CALL / MODE_IN_COMMUNICATION). - person Michael; 09.05.2013
comment
Вот почему я не упомянул MODE_IN_CALL в вопросе. Использование MODE_NORMAL / STREAM_VOICE_CALL позволяет воспроизводить звук как через внутренний динамик, так и через громкую связь, а если подключена проводная, USB- или A2DP-гарнитура, звук автоматически направляется на них. Вот почему эта комбинация так полезна. Но некоторые устройства просто не позволяют перехватывать STREAM_VOICE_CALL, поэтому я думал, что MODE_IN_COMMUNICATION будет работать так же (но похоже, что это не так) - person user496854; 09.05.2013
comment
Мне кажется, что поток MUSIC — это то, что вам нужно. Что касается звука вашего приложения, который смешивается с другим звуком, так оно и работает. Многие устройства просто не различают разные потоки на нижних уровнях (в тот или иной момент они смешиваются в один), что делает практически невозможным маршрутизацию одного типа потока на один выход (например, на динамик), а другого потока введите где-нибудь еще (например, A2DP). Есть исключения, такие как платформа U8500 от ST-E (используется, например, в XPeria P и XPeria U, и, я думаю, в Galaxy S3 Mini). - person Michael; 09.05.2013
comment
@ Майкл Это все еще так? Если да, то возможны ли индивидуальные стратегии маршрутизации? Другим возможным обходным решением может быть запрос фокуса воспроизведения через взаимодействие со стерео через что-то вроде этого. , вы знаете, где я мог бы посмотреть, чтобы узнать об этом? Я не пытаюсь сделать двусторонний голос, просто прерываю FM-радио стереомузыкой с телефона. - person Ben Gardner; 02.04.2020