PlayerNotificationManager не работает на Android 13

Я новичок в разработке Android, я создаю приложение, которое поддерживает воспроизведение видео в фоновом режиме. Решил сделать через Exo Player и PlayerNotificationManager. На Android 12 и ниже все работает нормально, а вот на Android 13 уведомление вообще не хочет отображаться, есть идеи?

Я использую архитектуру MVVM, в методе инициализации моей модели представления я инициализирую exoPlayer и playerNotificationManager

Код инициализации:

playerNotificationManager = PlayerNotificationManager.Builder(
    getApplication<Application>().applicationContext,
    1,
    EXO_PLAYER_CHANNEL_ID)
        .setSmallIconResourceId(R.drawable.racoon)
        .setMediaDescriptionAdapter(mediaDescriptionAdapter)
        .setFastForwardActionIconResourceId(R.drawable.ic_forward_10sec)
        .setRewindActionIconResourceId(R.drawable.ic_replay_10sec)
        .build()

После этого в своем фрагменте я присваиваю exoPlayer своему playerNotificationManager в методах onResume и onStop:

override fun onResume() {
        super.onResume()
        Log.d("MyLog", "onResume")
        if (videoViewModel.playerNotificationManager != null){
            videoViewModel.playerNotificationManager?.setPlayer(null)
        }
    }

    override fun onStop() {
        super.onStop()
        Log.d("MyLog", "onStop")
        videoViewModel.playerNotificationManager?.setPlayer(videoViewModel.exoPlayer)
    }

Также я попытался зарегистрировать следующие разрешения в своем манифесте:

<uses-permission android:name = "android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name = "android.permission.POST_NOTIFICATIONS"/>

Но результат остался прежним, андроид 13 вообще не хочет отображать мое уведомление

Разрешено ли разрешение на уведомление для вашего приложения?

primo 18.11.2022 13:16

Он один раз запросит разрешение на уведомление, если ваше приложение не нацелено на уровень Android API 33. Система автоматически обработает разрешение на уведомление. Но если доступ к уведомлениям не разрешен, он больше никогда не будет запрашивать разрешение, и вам придется включить его в настройках вручную.

primo 18.11.2022 13:18

Спасибо @primo, вы помогли мне решить проблему. Проблема заключалась в том, что целевой SDK моего приложения был 33, но я не обрабатывал разрешение уведомлений. Я изменил цель на 32, включил уведомление на устройстве, и это сработало.

VikNamin 18.11.2022 13:40

Я использую службу для того же и устанавливаю проигрыватель в playerNotificationManager в методе привязки службы. Так что насчет этого? Как мы можем внутри сервиса проверить, предоставлено разрешение или нет, и запросить об этом?

krupa parekh 11.01.2023 13:18
Как настроить Tailwind CSS с React.js и Next.js?
Как настроить Tailwind CSS с React.js и Next.js?
Tailwind CSS - единственный фреймворк, который, как я убедился, масштабируется в больших командах. Он легко настраивается, адаптируется к любому...
LeetCode запись решения 2536. Увеличение подматриц на единицу
LeetCode запись решения 2536. Увеличение подматриц на единицу
Увеличение подматриц на единицу - LeetCode
Переключение светлых/темных тем
Переключение светлых/темных тем
В Microsoft Training - Guided Project - Build a simple website with web pages, CSS files and JavaScript files, мы объясняем, как CSS можно...
Отношения &quot;многие ко многим&quot; в Laravel с методами присоединения и отсоединения
Отношения &quot;многие ко многим&quot; в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel могут быть немного сложными, но с помощью Eloquent ORM и его моделей мы можем сделать это с легкостью. В этой...
В PHP
В PHP
В большой кодовой базе с множеством различных компонентов классы, функции и константы могут иметь одинаковые имена. Это может привести к путанице и...
Карта дорог Беладжар PHP Laravel
Карта дорог Беладжар PHP Laravel
Laravel - это PHP-фреймворк, разработанный для облегчения разработки веб-приложений. Laravel предоставляет различные функции, упрощающие разработку...
0
4
181
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

На основе комментария @primo и этих ссылок:

Я сделал следующее, чтобы решить мою проблему:

В методе onCreate моего фрагмента:

if (VERSION.SDK_INT >= VERSION_CODES.TIRAMISU) {
        val launcher = registerForActivityResult(
            ActivityResultContracts.RequestPermission()
        ) { isGranted: Boolean? ->
            notificationGranted = isGranted == true
        }
        launcher.launch(Manifest.permission.POST_NOTIFICATIONS)
    }

В методе onStop:

if (VERSION.SDK_INT >= VERSION_CODES.TIRAMISU && !notificationGranted){
        videoViewModel.exoPlayer.pause()
    }
    videoViewModel.playerNotificationManager?.setPlayer(videoViewModel.exoPlayer)

И тогда все работает нормально.

Другие вопросы по теме