Android MediaSessionCompat onMediaButtonEvent не работает

Я хочу иметь возможность определять, когда на моем головном сиденье нажата кнопка паузы (когда медиафайлы не воспроизводятся)

Я пробовал всевозможные приемники и сервисы, но ничего не получалось. Пока я не протестировал этот код, я получил его после удаления всего наворота из очень старого примера.

import android.content.ComponentName
import android.content.Intent
import android.os.Bundle
import android.support.v4.media.session.MediaSessionCompat
import androidx.appcompat.app.AppCompatActivity
import androidx.media.session.MediaButtonReceiver


class MainActivity : AppCompatActivity() {
    private lateinit var mMediaSessionCompat: MediaSessionCompat
    private val mMediaSessionCallback: MediaSessionCompat.Callback = object : MediaSessionCompat.Callback() {
        override fun onMediaButtonEvent(mediaButtonEvent: Intent): Boolean {
            println("WORKS!!!")
            return super.onMediaButtonEvent(mediaButtonEvent)
        }
    }

    private fun initMediaSession() {
        val mediaButtonReceiver = ComponentName(applicationContext, MediaButtonReceiver::class.java)
        mMediaSessionCompat = MediaSessionCompat(applicationContext, "Tag", mediaButtonReceiver, null)
        mMediaSessionCompat.setCallback(mMediaSessionCallback)
        mMediaSessionCompat.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS or MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS)
        mMediaSessionCompat.isActive = true
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        initMediaSession()
        setContentView(R.layout.activity_main)
    }

    override fun onDestroy() {
        super.onDestroy()
        mMediaSessionCompat.release()
    }
}

Этот код некоторое время работал, но в других проектах почему-то не работал и после перезагрузки этот код уже не работает. У меня нет причин, по которым он перестал работать, но я пытался заставить его работать несколько часов, и я не понимаю, почему он не работает. Может ли кто-нибудь просто дать мне минимальный воспроизводимый пример, который работает, или указать, что мне не хватает.


person Blue    schedule 01.06.2021    source источник
comment
Нажатия мультимедийных кнопок доставляются в последнее приложение, воспроизводившее звук (если только оно не используется активной активностью). Возможно, вам потребуется воспроизвести любой (даже фиктивный) звук, чтобы зарегистрироваться для аудиофокуса, см. buttons-issue" title="android o oreo 8 и более поздние выпуски мультимедийных кнопок"> stackoverflow.com/questions/45960265/   -  person Pawel    schedule 02.06.2021
comment
@Pawel Иногда Android заставляет меня плакать. Знаете ли вы, считается ли TTS, или вы можете заставить его считаться?   -  person Blue    schedule 02.06.2021
comment
Извините, я не знаю. Но если ваша цель — запустить это в действии (поэтому, когда пользователь открывает ваше приложение), вы всегда можете переопределить onKeyUp, отфильтровать медиа-кнопки и доставить их непосредственно в ваш медиа-сеанс.   -  person Pawel    schedule 02.06.2021


Ответы (1)


Я решил это, просто воспроизведя фиктивный звук

private fun playDummySound() {
    val mMediaPlayer: MediaPlayer = MediaPlayer.create(this, R.raw.dummy_sound_500ms)
    mMediaPlayer.setOnCompletionListener { mMediaPlayer.release() }
    mMediaPlayer.start()
}

взято с https://github.com/anars/blank-audio

Проблема устранена с помощью решения в Android O (Oreo, 8) проблема с медиа-кнопками и выше

person Blue    schedule 01.06.2021