Аудио воспроизводится, но не отображается в уведомлении Android API 34Android

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Аудио воспроизводится, но не отображается в уведомлении Android API 34

Сообщение Anonymous »

после обновления моего API до версии 34, когда я играю, звук воспроизводится, но не отображается в списке уведомлений. поэтому я не могу остановить звук, даже когда закрываю приложение, и я не вижу никаких ошибок в Logcat, чтобы узнать, откуда возникла ошибка. как исправить это при воспроизведении аудио, чтобы отображалось уведомление при нажатии значка в уведомлении, чтобы остановить аудио
я уже добавил Service в манифест.xml это мой Foreground.kt

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


class Foreground(val activity: Context) {

private var iconNotification: Bitmap? = null
private var notification: Notification? = null
private var mNotificationManager: NotificationManager? = null

@SuppressLint("LaunchActivityFromNotification")
fun generateForegroundNotification(): Notification? {
//        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val broadCast = Intent(Constant.PAUSE)
val pendingIntent = PendingIntent.getBroadcast(
activity, 0, broadCast, PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_NO_CREATE
)
iconNotification = BitmapFactory.decodeResource(activity.resources, R.drawable.logo)
if (mNotificationManager == null) {
mNotificationManager = activity.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
assert(mNotificationManager != null)
mNotificationManager?.createNotificationChannelGroup(
NotificationChannelGroup("chats_group", "Chats")
)
val notificationChannel =
NotificationChannel("service_channel", "Service Notifications",
NotificationManager.IMPORTANCE_MIN)
notificationChannel.enableLights(false)
notificationChannel.lockscreenVisibility = Notification.VISIBILITY_SECRET
mNotificationManager?.createNotificationChannel(notificationChannel)
}
val builder = NotificationCompat.Builder(activity, "service_channel")

builder.setContentTitle(StringBuilder(activity.resources.getString(R.string.app_name)).append("  is playing").toString())
.setTicker(StringBuilder(activity.resources.getString(R.string.app_name)).append("service is running").toString())
.setContentText("Touch to stop") //                    , swipe down for more options.
.setSmallIcon(R.drawable.logo)
.setPriority(NotificationCompat.PRIORITY_LOW)
.setWhen(0)
.setOnlyAlertOnce(true)
.setContentIntent(pendingIntent)
.setOngoing(true)

if (iconNotification != null) {
builder.setLargeIcon(
Bitmap.createScaledBitmap(
iconNotification!!, 128, 128, false
)
)
}

builder.color = activity.resources.getColor(R.color.blue)
notification = builder.build()
//        }

return notification
}
}

это мой MediaNotification.kt

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


class MediaNotification(private val activity: Context) {

companion object {
const val CHANNEL_ID = "audio_service_channel"
const val NOTIFICATION_ID = 101
}

private var notificationManager: NotificationManager? = null

fun buildNotification(playbackStatus: PlaybackStatus) {
// Create a MediaStyle notification
val builder = NotificationCompat.Builder(activity, CHANNEL_ID)

// Pending intent for previous button click
val prevIntent = MediaButtonReceiver.buildMediaButtonPendingIntent(
activity, PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS
)

// Pending intent for play/pause button click
val playPauseIntent = PendingIntent.getService(
activity, 0,
Intent(activity, AudioService::class.java).setAction(ACTION_PLAY_PAUSE.toString()),
PendingIntent.FLAG_UPDATE_CURRENT
)

// Pending intent for next button click
val nextIntent = MediaButtonReceiver.buildMediaButtonPendingIntent(
activity, PlaybackStateCompat.ACTION_SKIP_TO_NEXT
)

// Create notification
val notification = builder.setContentTitle("Quran Audio")
.setContentText("Playing audio")
.setSmallIcon(R.drawable.logo_transparent)
.setLargeIcon(
BitmapFactory.decodeResource(
activity.resources,
R.drawable.logo_transparent
)
)
.setContentIntent(playPauseIntent)
.setDeleteIntent(
MediaButtonReceiver.buildMediaButtonPendingIntent(
activity, PlaybackStateCompat.ACTION_STOP
)
)
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
.addAction(R.drawable.logo_transparent, "Previous", prevIntent)
.addAction(
if (playbackStatus == PlaybackStatus.PLAYING)
R.drawable.logo_transparent else R.drawable.logo_transparent,
if (playbackStatus == PlaybackStatus.PLAYING)
"Pause"  else "Play",
playPauseIntent
)
.addAction(R.drawable.logo_transparent, "Next", nextIntent)
.setStyle(
androidx.media.app.NotificationCompat.MediaStyle()
.setShowActionsInCompactView(0, 1, 2) // Previous, Play/Pause, Next buttons
.setMediaSession(MediaSessionCompat(activity, "Audio").sessionToken)
)
.setPriority(NotificationCompat.PRIORITY_HIGH)
.build()

notificationManager?.notify(NOTIFICATION_ID, notification)
}
}

```

this is my **AudioService.kt**

```

class AudioService : Service(), MediaPlayer.OnCompletionListener,
MediaPlayer.OnPreparedListener, MediaPlayer.OnErrorListener,
AudioManager.OnAudioFocusChangeListener,
MediaPlayer.OnSeekCompleteListener, MediaPlayer.OnInfoListener,
MediaPlayer.OnBufferingUpdateListener {

private var startReceiver: BroadcastReceiver? = null
private var pauseReceiver: BroadcastReceiver? = null

class LocalBinder : Binder() {
val service: AudioService
get() = AudioService()
}

private var surah = 0
private val TAG = "Audio Service"
private var current = 0
private var playList = ArrayList()
private var mediaPlayer: MediaPlayer? = null
private var audioManager: AudioManager? = null

override fun onBind(intent: Intent): IBinder {
return LocalBinder()
}

@SuppressLint("ForegroundServiceType")
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
intent?.let {
surah = it.getIntExtra("SURAH", 0)
current = it.getIntExtra("CURRENT", 0)
if (mediaPlayer == null) {
mediaPlayer = MediaPlayer()
}
playList = it.getStringArrayListExtra("LIST")!!
if (mediaPlayer == null) initMediaPlayer()
if (requestAudioFocus()) playAudio()
else stopSelf()
}

startReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
intent?.let {
surah = it.getIntExtra("SURAH", 0)
current = it.getIntExtra("CURRENT", 0)
if (mediaPlayer == null)
mediaPlayer = MediaPlayer()
playList = it.getStringArrayListExtra("LIST")!!
if (requestAudioFocus()) playAudio()
else stopSelf()

playList.forEach { i ->
Log.e("Receiver", i)
}
}
}
}

pauseReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent:  Intent?) {
intent?.let {
mediaPlayer?.pause()
stopForeground(true)
stopSelf()
}
}
}

// Register the receivers with the Context.RECEIVER_NOT_EXPORTED flag
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
registerReceiver(startReceiver, IntentFilter("START_ACTION").apply { addCategory(Intent.CATEGORY_DEFAULT) }, Context.RECEIVER_NOT_EXPORTED)
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
registerReceiver(pauseReceiver, IntentFilter("PAUSE_ACTION").apply { addCategory(Intent.CATEGORY_DEFAULT) }, Context.RECEIVER_NOT_EXPORTED)
}

// These additional registerReceiver calls without the export flag might be redundant if START_ACTION and PAUSE_ACTION are the intended actions
// registerReceiver(startReceiver, IntentFilter(PLAY))
// registerReceiver(pauseReceiver, IntentFilter(PAUSE))

startForeground(101, Foreground(this).generateForegroundNotification())

return super.onStartCommand(intent, flags, startId)
}

fun playAudio() {
sendBroadcast(
Intent(Constant.SURAH+surah)
.putExtra("AYAT", current)
)
Log.e("Player", Constant.SURAH+surah)
try {
mediaPlayer?.reset()
mediaPlayer?.setDataSource(this, Uri.parse(playList[current]))
mediaPlayer?.prepare()
mediaPlayer?.start()
mediaPlayer?.setOnCompletionListener {
current++
if (playList.size>current) {
mediaPlayer?.reset()
mediaPlayer?.setDataSource(this, Uri.parse(playList[current]))
mediaPlayer?.prepare()
mediaPlayer?.start()
sendBroadcast(
Intent(Constant.SURAH+surah)
.putExtra("AYAT", current)
)
} else {
stopForeground(true)
stopSelf()
}
}
} catch (e: Exception) {
Log.e("Service Error", "$e")
}
Log.e("Player", "Last")
}

private fun initMediaPlayer() {
mediaPlayer = MediaPlayer()
mediaPlayer?.setOnCompletionListener(this)
mediaPlayer?.setOnErrorListener(this)
mediaPlayer?.setOnPreparedListener(this)
mediaPlayer?.setOnBufferingUpdateListener(this)
mediaPlayer?.setOnSeekCompleteListener(this)
mediaPlayer?.setOnInfoListener(this)
mediaPlayer?.reset()

mediaPlayer?.setAudioStreamType(AudioManager.STREAM_MUSIC)
}

private fun requestAudioFocus(): Boolean {
audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager
val result = audioManager!!.requestAudioFocus(
this,
AudioManager.STREAM_MUSIC,
AudioManager.AUDIOFOCUS_GAIN
)
return result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED
}

private fun removeAudioFocus(): Boolean {
return AudioManager.AUDIOFOCUS_REQUEST_GRANTED ==
audioManager?.abandonAudioFocus(this)
}

override fun onCompletion(mp: MediaPlayer?) {
Log.d(TAG, "onCompletion")
}

override fun onPrepared(mp: MediaPlayer?) {
Log.d(TAG, "onPrepared")
}

override fun onError(mp: MediaPlayer?, what: Int, extra: Int): Boolean {
Log.d(TAG, "onError")
return true
}

override fun onAudioFocusChange(focusChange: Int) {
when (focusChange) {
AudioManager.AUDIOFOCUS_GAIN -> {
if (mediaPlayer == null) initMediaPlayer() else if (!mediaPlayer!!.isPlaying) mediaPlayer!!.start()
mediaPlayer!!.setVolume(1.0f, 1.0f)
}
AudioManager.AUDIOFOCUS_LOSS ->  {
if (mediaPlayer!!.isPlaying) mediaPlayer!!.stop()
mediaPlayer!!.release()
mediaPlayer = null
}
AudioManager.AUDIOFOCUS_LOSS_TRANSIENT ->
if (mediaPlayer!!.isPlaying) mediaPlayer!!.pause()
AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK ->
if (mediaPlayer!!.isPlaying) mediaPlayer!!.setVolume(0.1f, 0.1f)
}
}

override fun onSeekComplete(mp: MediaPlayer?) {
Log.d(TAG, "onSeekComplete")
}

override fun onInfo(mp: MediaPlayer?, what: Int, extra: Int): Boolean {
Log.d(TAG, "onInfo")
return true
}

override fun onBufferingUpdate(mp: MediaPlayer?, percent: Int) {
Log.d(TAG, "onBufferingUpdate")
}

override fun onDestroy() {
super.onDestroy()
removeAudioFocus()
unregisterReceiver(startReceiver)
unregisterReceiver(pauseReceiver)
}
}

а это мой AudioService.kt

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

class AudioService : Service(), MediaPlayer.OnCompletionListener,
MediaPlayer.OnPreparedListener, MediaPlayer.OnErrorListener,
AudioManager.OnAudioFocusChangeListener,
MediaPlayer.OnSeekCompleteListener, MediaPlayer.OnInfoListener,
MediaPlayer.OnBufferingUpdateListener {

private var startReceiver: BroadcastReceiver? = null
private var pauseReceiver: BroadcastReceiver? = null

class LocalBinder : Binder() {
val service: AudioService
get() = AudioService()
}

private var surah = 0
private val TAG = "Audio Service"
private var current = 0
private var playList = ArrayList()
private var mediaPlayer: MediaPlayer? = null
private var audioManager: AudioManager? = null

override fun onBind(intent: Intent): IBinder {
return LocalBinder()
}

@SuppressLint("ForegroundServiceType")
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
intent?.let {
surah = it.getIntExtra("SURAH", 0)
current = it.getIntExtra("CURRENT", 0)
if (mediaPlayer == null) {
mediaPlayer = MediaPlayer()
}
playList = it.getStringArrayListExtra("LIST")!!
if (mediaPlayer == null) initMediaPlayer()
if (requestAudioFocus()) playAudio()
else stopSelf()
}

startReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
intent?.let {
surah = it.getIntExtra("SURAH", 0)
current = it.getIntExtra("CURRENT", 0)
if (mediaPlayer == null)
mediaPlayer = MediaPlayer()
playList = it.getStringArrayListExtra("LIST")!!
if (requestAudioFocus()) playAudio()
else stopSelf()

playList.forEach { i ->
Log.e("Receiver", i)
}
}
}
}

pauseReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent:  Intent?) {
intent?.let {
mediaPlayer?.pause()
stopForeground(true)
stopSelf()
}
}
}

// Register the receivers with the Context.RECEIVER_NOT_EXPORTED flag
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
registerReceiver(startReceiver, IntentFilter("START_ACTION").apply { addCategory(Intent.CATEGORY_DEFAULT) }, Context.RECEIVER_NOT_EXPORTED)
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
registerReceiver(pauseReceiver, IntentFilter("PAUSE_ACTION").apply { addCategory(Intent.CATEGORY_DEFAULT) }, Context.RECEIVER_NOT_EXPORTED)
}

// These additional registerReceiver calls without the export flag might be redundant if START_ACTION and PAUSE_ACTION are the intended actions
// registerReceiver(startReceiver, IntentFilter(PLAY))
// registerReceiver(pauseReceiver, IntentFilter(PAUSE))

startForeground(101, Foreground(this).generateForegroundNotification())

return super.onStartCommand(intent, flags, startId)
}

fun playAudio() {
sendBroadcast(
Intent(Constant.SURAH+surah)
.putExtra("AYAT", current)
)
Log.e("Player", Constant.SURAH+surah)
try {
mediaPlayer?.reset()
mediaPlayer?.setDataSource(this, Uri.parse(playList[current]))
mediaPlayer?.prepare()
mediaPlayer?.start()
mediaPlayer?.setOnCompletionListener {
current++
if (playList.size>current) {
mediaPlayer?.reset()
mediaPlayer?.setDataSource(this, Uri.parse(playList[current]))
mediaPlayer?.prepare()
mediaPlayer?.start()
sendBroadcast(
Intent(Constant.SURAH+surah)
.putExtra("AYAT", current)
)
} else {
stopForeground(true)
stopSelf()
}
}
} catch (e: Exception) {
Log.e("Service Error", "$e")
}
Log.e("Player", "Last")
}

private fun initMediaPlayer() {
mediaPlayer = MediaPlayer()
mediaPlayer?.setOnCompletionListener(this)
mediaPlayer?.setOnErrorListener(this)
mediaPlayer?.setOnPreparedListener(this)
mediaPlayer?.setOnBufferingUpdateListener(this)
mediaPlayer?.setOnSeekCompleteListener(this)
mediaPlayer?.setOnInfoListener(this)
mediaPlayer?.reset()

mediaPlayer?.setAudioStreamType(AudioManager.STREAM_MUSIC)
}

private fun requestAudioFocus(): Boolean {
audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager
val result = audioManager!!.requestAudioFocus(
this,
AudioManager.STREAM_MUSIC,
AudioManager.AUDIOFOCUS_GAIN
)
return result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED
}

private fun removeAudioFocus(): Boolean {
return AudioManager.AUDIOFOCUS_REQUEST_GRANTED ==
audioManager?.abandonAudioFocus(this)
}

override fun onCompletion(mp: MediaPlayer?) {
Log.d(TAG, "onCompletion")
}

override fun onPrepared(mp: MediaPlayer?) {
Log.d(TAG, "onPrepared")
}

override fun onError(mp: MediaPlayer?, what: Int, extra: Int): Boolean {
Log.d(TAG, "onError")
return true
}

override fun onAudioFocusChange(focusChange: Int) {
when (focusChange) {
AudioManager.AUDIOFOCUS_GAIN -> {
if (mediaPlayer == null) initMediaPlayer() else if (!mediaPlayer!!.isPlaying) mediaPlayer!!.start()
mediaPlayer!!.setVolume(1.0f, 1.0f)
}
AudioManager.AUDIOFOCUS_LOSS ->  {
if (mediaPlayer!!.isPlaying) mediaPlayer!!.stop()
mediaPlayer!!.release()
mediaPlayer = null
}
AudioManager.AUDIOFOCUS_LOSS_TRANSIENT ->
if (mediaPlayer!!.isPlaying) mediaPlayer!!.pause()
AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK ->
if (mediaPlayer!!.isPlaying) mediaPlayer!!.setVolume(0.1f, 0.1f)
}
}

override fun onSeekComplete(mp: MediaPlayer?) {
Log.d(TAG, "onSeekComplete")
}

override fun onInfo(mp: MediaPlayer?, what: Int, extra: Int): Boolean {
Log.d(TAG, "onInfo")
return true
}

override fun onBufferingUpdate(mp: MediaPlayer?, percent: Int) {
Log.d(TAG, "onBufferingUpdate")
}

override fun onDestroy() {
super.onDestroy()
removeAudioFocus()
unregisterReceiver(startReceiver)
unregisterReceiver(pauseReceiver)
}
}

Кто-нибудь может помочь, пожалуйста
Я уже искал это в Google, но не нашел, что поможет мне это исправить, потому что, когда я пытаюсь нажать «Аудио», это Воспроизводится без ошибок, но не отображается в уведомлении.

Подробнее здесь: https://stackoverflow.com/questions/786 ... oid-api-34
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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