2015-07-24 2 views
3

Я не могу найти ничего, связанного с выяснением того, какое приложение получило аудиофокус. Я могу правильно определить из своего приложения, какое изменение фокуса было, но не из какого-либо другого приложения. Есть ли способ определить, какое приложение получило фокус?Извлечение имени приложения с изменением фокусного расстояния

«Что я хочу делать?»

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

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

+0

просто задумываясь громко ... как получить верхнюю часть текущих задач? конечно, приложение, которое только что получило аудиофокус, должно занимать там довольно высокое место. – alvi

+2

FYI getRecentTasks() сильно ограничен в Android L. Это похоже на неправильный подход, т. Е. Что-то Android не хочет раскрывать приложениям, возможно, из соображений безопасности. Возможно, есть лучший подход, что бы вы сделали, если бы узнали название приложения? –

ответ

1

Краткая Ответ: Нет хорошего решения ... и Android, вероятно, намеревался это сделать так.

Объяснение: Глядя на исходный код, AudioManager имеет (даже скрытые API) нет API для проверки, кто имеет Audio Focus. AudioManager обертывает вызовы AudioService, которые хранятся в реальном состоянии звука. API, который AudioService предоставляет через свой Stub, когда AudioManager связывается с ним, также не имеет API для запроса текущего Audio Focus. Таким образом, даже с помощью разрешений на уровне отражения/системного уровня вы не сможете получить нужную вам информацию.

Если вам интересно, как отслеживаются изменения фокуса, вы можете посмотреть MediaFocusControl, экземпляр которого является переменной-членом AudioService here.

Непроверено Hacky Эвристический: Вы можете быть в состоянии получить некоторую полезную информацию, глядя на UsageStats временные метки. Затем, когда у вас есть приложения, которые использовались в течение ~ 500 мс, вы теряете AudioFocus, вы можете перекрестно проверить их на приложения с разрешениями на аудио. Вы можете следить за this post, чтобы получить разрешения для любого установленного приложения.

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

+0

Если вы нацеливаетесь только на леденец, он может перехватить медиа-уведомление и получить пакет таким образом. – JohanShogun

+0

Спасибо за информацию, это было действительно полезно. Я действительно был занят работой и еще кое-что, чтобы вернуться к этой теме. «MediaFocusControl» - это то, что я раньше врыл, но должен был вернуться к нему, чтобы освежить мои мысли. Я заглянул в «UsageStats» и с тем, что @JohanShogun предположил, что у меня есть рабочее решение, которое покажется хорошим. Еще раз спасибо за вашу помощь. Я ценю это! – Codexer

+0

Awesome, я никогда не использовал UsageStats, рад, что у них есть практическое применение. –

2

Глядя на класс MediaContorller (новый в lollipop, доступен в библиотеке сопоставления для более старых версий).

Есть эти два метода, которые выглядят интересно:

https://developer.android.com/reference/android/media/session/MediaController.html#getPackageName()

https://developer.android.com/reference/android/media/session/MediaController.html#getSessionActivity()

getPackageName якобы возвращает текущее имя сессии пакет: http://androidxref.com/5.1.1_r6/xref/frameworks/base/media/java/android/media/session/MediaController.java#397

getSessionActivity дает вам PendingIntent с активностью для запуска (если один поставляется), где вы также можете получить пакет.

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

+0

Я нашел ваше сообщение довольно интересным, которое привнесло «MediaController» на ум, с которым я действительно мог работать. Я использовал «UsageStats» (решение @Trevor Carothers) вместе с «MediaController», чтобы прийти к решению, которое, похоже, сейчас работает нормально. Еще раз благодарю вас, я ценю вашу помощь и время! – Codexer

1

Вы можете использовать dumpsys audio, чтобы найти, кто использует аудиофокус. И вы также можете посмотреть результаты dumpsys media_session.

И, если вы хотите найти, кто играет музыку, вы можете выбрать dumpsys media.audio_flinger. Для себя я переключаюсь на эту команду.

Смежные вопросы