2010-05-25 3 views
2

Я пытаюсь выяснить, какой правильный (новый) подход для обработки Intent.ACTION_MEDIA_BUTTON в Froyo. В течение до 2.2 дней нам приходилось регистрировать BroadcastReceiver (либо постоянно, либо во время выполнения), и события Media Button появлялись, если никакое другое приложение не перехватывало их и не прерывало широковещательную передачу.Любые рекомендации по работе с гарнитурой и Bluetooth AVRC для управления транспортом в Android 2.2

Froyo по-прежнему несколько поддерживает эту модель (по крайней мере, для проводной гарнитуры), но также вводит методы registerMediaButtonEventReceiver и unregisterMediaButtonEventReceiver, которые, как представляется, контролируют «транспортный фокус» между приложениями.

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

Какова логика реализации в Android 2.2? Каков правильный способ управления транспортными средствами? Нужно ли нам обнаруживать изменения в маршрутизации звука и пытаться восстановить фокус?

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

Стефан

ответ

1

После некоторых экспериментов я был в состоянии получить рабочий раствор с новым транспортом и аудио инфраструктуры фокуса в Android 2.2.

Что я в итоге делаю, требуя как Audio Focus (используя AudioManager.requestAudioFocus), так и Trasport Focus (используя AudioManagter.registerMediaButtonEventReceiver) каждый раз, когда мое приложение начинает воспроизведение.

requestAudioFocus выполняет обратный вызов, который вызывается, когда фокус аудио удаляется от вас (например, внутренний проигрыватель начинает воспроизведение). В моем случае я просто приостанавливаю воспроизведение в своем приложении, если фокус сделан постоянно. Тот же обратный вызов также теперь говорит вам о том, что фокус принимается только временным (например, система Nav говорит), поэтому вы можете «уклониться» от своего воспроизведения - уменьшить громкость или приостановить и возобновить после того, как это будет сделано.

Осталось только то, что встроенный музыкальный проигрыватель выполняет транспортную фокусировку каждый раз, когда вы подключаете Bluetooth-гарнитуру. Это приводит к тому, что при первом нажатии кнопки воспроизведения на гарнитуре после ее подключения всегда начинается воспроизведение в музыкальном проигрывателе по умолчанию.

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

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

0

У меня тоже есть этот же вопрос с регистрацией кнопки средства массовой информации.

Периодически Android возвращает регистрацию кнопки мультимедиа на музыкальный плеер по умолчанию. Я не мог понять, почему. Это может произойти, если приложение активно воспроизводится, а пока мое приложение приостановлено.

После того, как многие пользователи пожаловались, что их кнопки управления паузой и воспроизведением Bluetooth периодически перестают работать для управления моим приложением, я внедрил код, который повторно регистрирует мое приложение, вызывая registerMediaButtonEventReceiver каждые 2 секунды. Это позволяет мне вернуть регистрацию кнопки и, по большей части, избегает временного окна, где пользователь нажимает кнопку мультимедиа Bluetooth, и медиа-проигрыватель по умолчанию заканчивает отвечать.

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

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

+1

Я обнаружил, что если я вызываю registerMediaButtonEventReceiver каждый раз, когда я получаю событие ACTION_AUDIO_BECOMING_NOISY, которое улавливает случаи, когда медиаплеер по умолчанию захватывал регистрацию вдали от моего приложения. Мне также пришлось вызвать abortBroadcast(), чтобы другие приложения не получили это событие после меня, а затем захватили медиа-кнопки, после того, как я только что зарегистрировался для них. – skyhigh