8.9 KiB
8.9 KiB
Исправления Audio Focus и интеграции с системой
Проблемы, которые были исправлены
1. Неправильная обработка Audio Focus
Проблема: При включении другого медиа (например, YouTube, Spotify), радио плеер через некоторое время снова включался автоматически.
Причина:
- Audio Focus обрабатывался неправильно
- При потере фокуса (
AUDIOFOCUS_LOSS) плеер не останавливал сервис полностью - Не было правильного отслеживания состояния Audio Focus
Решение:
- Добавлены флаги для отслеживания состояния Audio Focus:
hasAudioFocus- текущее состояние фокусаplaybackDelayed- воспроизведение отложено до получения фокусаresumeOnFocusGain- нужно ли возобновить воспроизведение при получении фокуса
- При
AUDIOFOCUS_LOSS(постоянная потеря фокуса) теперь вызываетсяstopServiceGracefully(), что полностью останавливает сервис - При
AUDIOFOCUS_LOSS_TRANSIENT(временная потеря) плеер ставится на паузу, но запоминает, что нужно возобновить воспроизведение - При
AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCKгромкость уменьшается до 20% вместо паузы
2. Сервис работал постоянно
Проблема: Приложение и уведомление работали постоянно, пока система не убивала приложение.
Причина:
- Audio Focus не освобождался при паузе или остановке
- Сервис не останавливался должным образом при неактивном воспроизведении
Решение:
- Audio Focus теперь освобождается в следующих случаях:
- При паузе (
handlePauseCommand()) - При остановке сервиса (
stopServiceGracefully()) - При переходе в состояние IDLE (
onPlaybackStateChanged()) - При остановке воспроизведения (
onIsPlayingChanged()) - При освобождении ресурсов (
releaseResources())
- При паузе (
- Добавлено логирование для отслеживания освобождения Audio Focus
3. Нет интеграции с системой
Проблема: Плеер не интегрировался с системой Android (особенно на Samsung устройствах).
Причина:
- ExoPlayer автоматически обрабатывал Audio Focus (
setAudioAttributes(..., true)) - Это конфликтовало с ручной обработкой Audio Focus
Решение:
- Отключена автоматическая обработка Audio Focus в ExoPlayer:
setAudioAttributes(..., false) - Вся обработка Audio Focus теперь происходит вручную через
AudioManager - Добавлен обработчик
onIsPlayingChanged()для отслеживания состояния воспроизведения - Улучшена обработка
onTaskRemoved()- сервис останавливается только если не воспроизводится
Изменения в коде
Добавлены новые поля для отслеживания состояния:
private var hasAudioFocus = false
private var playbackDelayed = false
private var resumeOnFocusGain = false
Улучшен AudioFocusChangeListener:
private val audioFocusRequest = AudioManager.OnAudioFocusChangeListener { focusChange ->
Timber.tag("PlayerService").i("Audio focus changed: $focusChange")
when (focusChange) {
AudioManager.AUDIOFOCUS_GAIN -> {
// Восстанавливаем громкость и возобновляем воспроизведение если нужно
}
AudioManager.AUDIOFOCUS_LOSS -> {
// Полностью останавливаем сервис
stopServiceGracefully()
}
AudioManager.AUDIOFOCUS_LOSS_TRANSIENT -> {
// Временная пауза с возможностью возобновления
}
AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK -> {
// Уменьшаем громкость до 20%
}
}
}
Добавлен новый обработчик:
override fun onIsPlayingChanged(isPlaying: Boolean) {
// Освобождаем Audio Focus когда воспроизведение останавливается
}
Улучшены методы:
requestAudioFocusAndPlay()- правильная обработка всех результатов запроса фокусаhandlePauseCommand()- освобождение Audio Focus при паузеstopServiceGracefully()- освобождение Audio Focus при остановкеreleaseResources()- проверка состояния перед освобождением фокусаonPlaybackStateChanged()- освобождение фокуса в состоянии IDLEonTaskRemoved()- улучшенная логика остановки сервисаplayRadio()- сброс флагов Audio Focus при новом воспроизведенииsetupPlayer()- отключена автоматическая обработка Audio Focus
Преимущества исправлений
-
Правильная интеграция с системой Android:
- Плеер корректно взаимодействует с другими медиа-приложениями
- Работает правильно на всех устройствах, включая Samsung
-
Экономия ресурсов:
- Сервис останавливается когда не нужен
- Audio Focus освобождается своевременно
- Уведомление не висит постоянно
-
Улучшенный пользовательский опыт:
- Плеер не включается автоматически после других приложений
- Правильная обработка временных прерываний (звонки, уведомления)
- Ducking вместо паузы для коротких звуков
-
Лучшая отладка:
- Добавлено подробное логирование всех изменений Audio Focus
- Легче отследить проблемы в полевых условиях
Тестирование
Рекомендуется протестировать следующие сценарии:
-
Воспроизведение другого медиа:
- Запустить радио
- Включить YouTube/Spotify
- Проверить, что радио останавливается и не включается автоматически
-
Временные прерывания:
- Запустить радио
- Получить звонок
- Проверить, что радио возобновляется после звонка
-
Уведомления:
- Запустить радио
- Получить уведомление со звуком
- Проверить, что громкость уменьшается (ducking) и восстанавливается
-
Закрытие приложения:
- Запустить радио
- Закрыть приложение через Recent Apps
- Проверить, что радио продолжает играть
- Поставить на паузу
- Проверить, что сервис останавливается
-
Отключение наушников:
- Запустить радио в наушниках
- Отключить наушники
- Проверить, что воспроизведение останавливается
Логирование
Все изменения Audio Focus теперь логируются с тегом "PlayerService":
- Получение/потеря фокуса
- Освобождение фокуса
- Изменения состояния воспроизведения
Для просмотра логов используйте:
adb logcat -s PlayerService:I