Android Media3 MediaSessionService не выдает уведомлениеAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Android Media3 MediaSessionService не выдает уведомление

Сообщение Anonymous »

Как сказано в документации Android:

A MediaSessionService автоматически создаст для вас уведомление MediaStyle в форме MediaNotification.

Поэтому я реализовал минимальный MediaSessionService, который поддерживает «воспроизведение» песни и получение ее метаданных. Я могу управлять им с помощью MediaController из своей активности, но нет уведомления для управления им вне приложения. Чего мне не хватает?
Услуга:

Код: Выделить всё

@OptIn(UnstableApi::class)
class PlaybackService : MediaSessionService() {
private val _logger = Logger.getLogger("PlaybackService")
private val _job = SupervisorJob()
private var _mediaSession: MediaSession? = null

override fun onCreate() {
super.onCreate()

val scope = CoroutineScope(Dispatchers.IO + _job)
_mediaSession = MediaSession.Builder(this, Player(mainLooper, scope)).build()
setListener(object : Listener {
override fun onForegroundServiceStartNotAllowedException() {
_logger.warning("Foreground service start not allowed.")
}
})
}

override fun onDestroy() {
_mediaSession?.player?.release();
_mediaSession?.release();

_job.cancel()

super.onDestroy()
}

override fun onGetSession(controllerInfo: MediaSession.ControllerInfo): MediaSession? {
return _mediaSession
}

private class Player(looper: Looper, val scope: CoroutineScope) : SimpleBasePlayer(looper) {
private val _logger = Logger.getLogger("PlaybackService")

private val _availableCommands: Commands = Commands.Builder().addAll(
COMMAND_PLAY_PAUSE,
COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM,
COMMAND_SEEK_TO_NEXT_MEDIA_ITEM,
COMMAND_GET_CURRENT_MEDIA_ITEM,
COMMAND_GET_METADATA
).build();

private val _metadata = MediaMetadata.Builder()
.setArtist("Artist")
.setTitle("Title")
.build()

private val _audioAttributes = AudioAttributes.Builder()
.setContentType(C.AUDIO_CONTENT_TYPE_MUSIC)
.setUsage(C.USAGE_MEDIA)
.build()

override fun getState(): State {
return State.Builder()
.setAvailableCommands(_availableCommands)
.setPlaylist(listOf(MediaItemData.Builder("")
.setMediaMetadata(_metadata)
.build()))
.setAudioAttributes(_audioAttributes)
.build()
}

override fun handleSetPlayWhenReady(playWhenReady: Boolean) = scope.future {
onPlayPause(playWhenReady)
}

private suspend fun onPlayPause(play: Boolean) {
delay(500)
if (play)
_logger.info("Play command invoked.")
else
_logger.info("Pause command invoked.")
}
}
}
Использование MediaController:

Код: Выделить всё

    override fun onStart() {
super.onStart()

val context = requireContext()

if (ContextCompat.checkSelfPermission(context, "android.permission.POST_NOTIFICATIONS") != PERMISSION_GRANTED) {
_logger.info("Requesting permission for 'android.permission.POST_NOTIFICATIONS'...")
ActivityCompat.requestPermissions(requireActivity(), arrayOf("android.permission.POST_NOTIFICATIONS"), 0)
} else
_logger.info("Already has permission for 'android.permission.POST_NOTIFICATIONS'.")

val sessionToken = SessionToken(context, ComponentName(context, PlaybackService::class.java))
val future = MediaController.Builder(context, sessionToken).buildAsync();
future.addListener({
val mediaController = future.get()
mediaController.play()
val metadata = mediaController.mediaMetadata
}, MoreExecutors.directExecutor())
}
Манифест Android: EDIT: мое приложение теперь имеет разрешение android.permission.POST_NOTIFICATIONS, а onForegroundServiceStartNotAllowedException не вызывается, но уведомление по-прежнему не отображается.

Подробнее здесь: https://stackoverflow.com/questions/795 ... tification
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»