Проблемы с выпуском внутреннего микрофона Android

У меня очень интересная проблема.

У меня создалось впечатление, что когда мое приложение использует микрофон, а системному процессу Android (например, входящему или исходящему вызову) нужен микрофон, мое приложение освобождает его без каких-либо соображений.

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

Есть ли способ гарантировать, что каждый раз, когда системный процесс запрашивает микрофон, он будет освобожден?


person Borce Ivanovski    schedule 15.08.2016    source источник
comment
попробуйте stackoverflow.com/questions/4194342/   -  person Pavneet_Singh    schedule 15.08.2016
comment
Привет, Павнит. Итак, из того, что я прочитал по предоставленной ссылке, только определенные бренды в определенных регионах не решают эту проблему. Остальные автоматически запрашивают микрофон, и любое приложение, которое его держит, отпускает, верно?   -  person Borce Ivanovski    schedule 15.08.2016
comment
И чтобы добавить к этому, у меня вопрос: поскольку мое приложение не является приложением для записи, есть ли способ гарантировать, что приложение предоставит микрофон системным процессам?   -  person Borce Ivanovski    schedule 15.08.2016


Ответы (3)


В настоящее время невозможно проверить, запрашивает ли микрофон другое приложение. Однако есть некоторые обходные пути:

  • Если вы записываете звук в Activity, просто отпустите микрофон в onPause(), чтобы приложение переднего плана могло его использовать. Это не сработает, если вы записываете звук в фоновой службе.
  • Приостановите запись при входящем звонке. Чтобы обнаружить входящие (и исходящие) вызовы, взгляните на этот отличный ответ. По окончании разговора возобновите запись.
  • Грязный взлом: если обнаружения входящих вызовов недостаточно, вы можете просмотреть все запущенные приложения и посмотреть, есть ли у них разрешение на использование микрофона. Как только приложение с разрешением на использование микрофона будет запущено, приостановите запись. Получить все запущенные приложения может быть сложно. Дополнительную информацию см. здесь , здесь, здесь и здесь для проверки разрешений.
person Manuel Allenspach    schedule 18.08.2016
comment
Спасибо, Ману. Моему приложению нужен микрофон в фоновом режиме, потому что оно пытается распознавать звук даже тогда, если, конечно, пользователь этого хочет. Что касается входящих и исходящих звонков, я уже реализовал решение, и оно протестировано, работает. Что касается грязного взлома, я пытался реализовать что-то подобное, поскольку на данный момент другого варианта нет, я просто думал, что проверить только приложение на переднем плане, если у него есть разрешение RECORD_AUDIO, я прекращаю использование микрофон. Но не будет ли такая обработка слишком большой, если я запущу ее на таймере на 10-15 секунд? - person Borce Ivanovski; 18.08.2016
comment
@BorceIvanovski Я разработал похожее приложение, которое проверяет все запущенные приложения каждые 2 секунды и не разряжает слишком много батареи. Вы можете оптимизировать его дальше, например, вам не нужно проверять запущенные приложения, если экран выключен и так далее ... - person Manuel Allenspach; 18.08.2016
comment
хорошо, я не думал об этой части, чтобы оптимизировать ее еще больше. Если это не разряжает батарею каждые 2 секунды, это может быть даже лучшим вариантом. Кто-нибудь знает какой-либо пример, как получить текущее имя пакета приложения переднего плана? Поскольку мне не нужно искать запущенные приложения, мне просто нужно искать, какое из них находится на переднем плане, поскольку не имеет значения, запущено ли оно, оно должно быть на переднем плане, чтобы его можно было использовать. - person Borce Ivanovski; 18.08.2016
comment
извините, я просто прошел по ссылкам, которые вы предоставили, и они дают информацию о том, что мне нужно, позвольте мне попробовать и посмотреть, смогу ли я заставить его работать с этим. - person Borce Ivanovski; 18.08.2016
comment
извините за поздний ответ, мне удалось реализовать решение. Предложения работают, как описано в ссылках, которые вы мне дали. По какой-то причине у меня есть еще одна проблема, когда я использую функцию из ссылки getForegroundApp (), поскольку я много работаю с азиатскими мобильными телефонами, я получаю имя пакета, но также некоторые странные символы, и я попытался удалить их, но не повезло. Какие-либо предложения? Вот скриншот prntscr.com/c9nhth, поэтому я пытаюсь выполнить проверку разрешений, если они предоставлены для конкретное приложение переднего плана - person Borce Ivanovski; 24.08.2016
comment
Вы можете удалить из строки все символы, отличные от ASCII ... Этот ответ может содержать то, что вы ищете: stackoverflow.com/a/ 8519863/2829009 - person Manuel Allenspach; 24.08.2016
comment
отлично, я видел похожий пост, но у меня не было возможности проверить его, но я подумал, позвольте мне поблагодарить вас здесь и спросить, может быть, вы знаете, как вы знали :) Большое спасибо за помощь, Ману. - person Borce Ivanovski; 24.08.2016
comment
К сожалению, это не сработало, странные символы все еще в строке :( Что еще я могу попробовать, кто-нибудь может придумать? - person Borce Ivanovski; 25.08.2016
comment
нормально решено, используя .replaceAll (\ u0000,); Всем спасибо за помощь - person Borce Ivanovski; 25.08.2016
comment
У меня есть еще одна проблема, функция getForegroundApp в одной из ссылок работает на большинстве телефонов, которые я тестирую, но у меня проблема с Galaxy S7, она не приносит мне пакет приложения переднего плана, она просто дает мне это все время, не имеет значения, что впереди: com.samsung.android.providers.context Есть идеи? - person Borce Ivanovski; 30.08.2016
comment
@ Джаред Раммлер, можно ли понять, почему ваша функция не работает с API 23? - person Borce Ivanovski; 30.08.2016

Насколько мне известно, невозможно узнать состояние микрофона: "Занят", "Доступен" или если кто-то запрашивает это, потому что это каким-то образом это ответственность системы за управление процессы и ресурсы, поэтому, помня об этом, вы не можете хранить микрофон вечно, поэтому вы не можете его контролировать, что означает, что вы не можете управлять и обнаруживать запрос на ресурсы. Ниже приводится некоторая информация, которая может вам помочь.

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

person Pavneet_Singh    schedule 16.08.2016
comment
Спасибо Павнит за информацию. Я не пытаюсь добиться того, чтобы микрофон оставался навсегда, на самом деле я хочу добиться противоположного. Когда кто-то просит микрофон, отпустите его. Я столкнулся с проблемой на некоторых устройствах Android в Азии, где, когда приложение работает, входящие или исходящие вызовы не получают микрофон, что, как я думал, невозможно, поскольку они являются системными процессами. И да, я следую этому подходу, но некоторые пользователи могут держать приложение в фоновом режиме в течение более длительного периода времени, которое все еще использует микрофон. - person Borce Ivanovski; 16.08.2016
comment
Вот почему я задал этот вопрос, чтобы узнать, могу ли я оптимизировать приложение и отпустить микрофон, когда он находится в фоновом режиме, а какое-то другое приложение запрашивает использование микрофона. или чтобы убедиться, что когда системные процессы запрашивают освобождение микрофона, не имеет значения, на каком этапе находится мое приложение. - person Borce Ivanovski; 16.08.2016

В моем случае я создал фоновый поток, который проверял входящие биты с микрофона. Если они обнулятся (или задержка данных в несколько секунд), приложение прервет процесс. Тем не менее, конечно, это не «хорошее» решение, но может быть полезно.

person Vyacheslav    schedule 17.08.2016
comment
Спасибо, Вячеслав, но с этой проблемой мне это не поможет. - person Borce Ivanovski; 18.08.2016