Отпустите AudioRecord android, когда другое приложение запросит запись

В моем приложении есть служба аудиозаписи, которая будет непрерывно записывать звук. Таким образом, он всегда будет занимать AudioRecord. Это означает, что никакое другое приложение не может использовать диктофон, так как он уже занят службой. Есть ли способ уведомить, что другое приложение запрашивает аудиомагнитофон (чтобы я мог его выпустить), а также когда приложение выпускает его (чтобы я мог вернуть его службе)?


person berserk    schedule 05.09.2014    source источник
comment
Я думаю, что это не обычный сценарий, поэтому я думаю, что нет никакого способа добиться этого.   -  person rekire    schedule 18.09.2014
comment
@rekire Функция вызова устройства автоматически берет микрофон, даже если служба запущена. Так что, я думаю, должен быть какой-то способ.   -  person berserk    schedule 18.09.2014
comment
Я думаю, что это использует более низкие нативные API, которые недоступны для любых приложений.   -  person rekire    schedule 18.09.2014
comment
@rekire Это возможно! Но все равно буду ждать ответа ^^   -  person berserk    schedule 18.09.2014


Ответы (3)


Возможно, возможный способ — создать BroadcastReceiver, который получает событие от приложения, которое запрашивает контроль над источником микрофона. Метод onReceive() должен взаимодействовать со службой и освобождать ресурс. Когда другое приложение завершает работу, оно может отменить процесс, чтобы снова запустить службу. Если вы не можете контролировать поведение запрашивающего приложения, я думаю, что проблема немного в другом. Так или иначе:

Проблема заключается в том, чтобы узнать, когда запрашивается ресурс, это можно сделать с помощью AudioManager. типы намерений. Не забудьте проверить Управление фокусом звука, в котором говорится о потере фокуса звука. ПЕРЕХОДНЫМ способом!

person fiipi    schedule 23.09.2014
comment
Спасибо за ответ! Я дам ему попробовать :) - person berserk; 23.09.2014
comment
Я читаю класс AudioManager, но нет трансляций для доступности микрофона. Вместо этого есть некоторые флаги, которые я не думаю, что можно использовать в моем случае. - person berserk; 25.09.2014

Как упоминал @Rekire, возможно, нет никакого способа добиться этого. Кроме того, AudioManager не предоставляет таких трансляций, поэтому это невозможно для разных приложений. Возможно, рутирование устройства — единственный вариант.

person Mukesh Rana    schedule 25.09.2014
comment
Хм.. думаю, у меня нет другого выбора! - person berserk; 25.09.2014

Это можно сделать с помощью обратного вызова AudioManager.OnAudioFocusChangeListener. Просто остановите запись по событию AUDIOFOCUS_LOSS_TRANSIENT и снова начните по событию AUDIOFOCUS_GAIN. Это решение хорошо работает для голосового поиска Google (виджет поиска Google, Google Chrome и т. д.).

Но, к сожалению, он плохо работает с другими обычными приложениями (например, приложение Диктофон HTC M7 не может начать запись при первом нажатии на кнопку «Запись», второе нажатие делает свое дело — кажется, приложение должно быть готово повторить попытку записи в случае сбоя несколько раз). раз).

person Ruslan Yanchyshyn    schedule 21.05.2015