после обновления моего API до версии 34, когда я играю, звук воспроизводится, но не отображается в списке уведомлений. поэтому я не могу остановить звук, даже когда закрываю приложение, и я не вижу никаких ошибок в Logcat, чтобы узнать, откуда возникла ошибка. как исправить это при воспроизведении аудио, чтобы отображалось уведомление при нажатии значка в уведомлении, чтобы остановить аудио
я уже добавил Service в манифест.xml
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, но не нашел, что поможет мне это исправить, потому что, когда я пытаюсь нажать «Аудио», это Воспроизводится без ошибок, но не отображается в уведомлении.
после обновления моего API до версии 34, когда я играю, звук воспроизводится, но не отображается в списке уведомлений. поэтому я не могу остановить звук, даже когда закрываю приложение, и я не вижу никаких ошибок в Logcat, чтобы узнать, откуда возникла ошибка. как исправить это при воспроизведении аудио, чтобы отображалось уведомление при нажатии значка в уведомлении, чтобы остановить аудио я уже добавил [b]Service в манифест.xml[/b] [code]
[/code] это мой [b]Foreground.kt[/b] [code]
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)
[/code] это мой [b]MediaNotification.kt[/b] [code]
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 )
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) } } } }
// 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))
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 onBufferingUpdate(mp: MediaPlayer?, percent: Int) { Log.d(TAG, "onBufferingUpdate") }
override fun onDestroy() { super.onDestroy() removeAudioFocus() unregisterReceiver(startReceiver) unregisterReceiver(pauseReceiver) } }
[/code] а это мой [b]AudioService.kt[/b] [code] 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) } } } }
// 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))
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 onBufferingUpdate(mp: MediaPlayer?, percent: Int) { Log.d(TAG, "onBufferingUpdate") }
override fun onDestroy() { super.onDestroy() removeAudioFocus() unregisterReceiver(startReceiver) unregisterReceiver(pauseReceiver) } }
[/code] Кто-нибудь может помочь, пожалуйста Я уже искал это в Google, но не нашел, что поможет мне это исправить, потому что, когда я пытаюсь нажать «Аудио», это Воспроизводится без ошибок, но не отображается в уведомлении.
Мое приложение генерирует уведомление, но значок, который я установил для этого уведомления, не отображается. Вместо этого я получаю белый квадрат.
Я пробовал изменить размер PNG значка (размеры 720x720, 66x66, 44x44, 22x22). Любопытно, что при...
Мое приложение генерирует уведомление, но значок, который я установил для этого уведомления, не отображается. Вместо этого я получаю белый квадрат.
Я пробовал изменить размер PNG значка (размеры 720x720, 66x66, 44x44, 22x22). Любопытно, что при...
Мое приложение генерирует уведомление, но значок, который я установил для этого уведомления, не отображается. Вместо этого я получаю белый квадрат.
Я пробовал изменить размер PNG значка (размеры 720x720, 66x66, 44x44, 22x22). Любопытно, что при...
Мое приложение генерирует уведомление, но значок, который я установил для этого уведомления, не отображается. Вместо этого я получаю белый квадрат.
Я пробовал изменить размер PNG значка (размеры 720x720, 66x66, 44x44, 22x22). Любопытно, что при...
У меня есть простой API Flask, который синтезирует речь из входного текста с помощью службы преобразования речи в текст Azure. Изначально, когда я запускал приложение в Windows, все работало отлично, без каких-либо проблем. Однако после переключения...