Medya düğmelerine yanıt verme

Medya düğmeleri, Android cihazlarda ve diğer çevre birimi cihazlarında bulunan donanım düğmeleridir (örneğin, Bluetooth mikrofonlu kulaklıktaki duraklat/oynat düğmesi). Kullanıcı bir medya düğmesine bastığında Android, düğmeyi tanımlayan bir anahtar kodu içeren bir KeyEvent oluşturur. Medya düğmesi KeyEvents'inin anahtar kodları, KEYCODE_MEDIA ile başlayan sabit değerlerdir (örneğin, KEYCODE_MEDIA_PLAY).

Uygulamalar, medya düğmesi etkinliklerini üç durumda işleyebilmelidir. Bu sırayla: öncelik:

  • Uygulamanın kullanıcı arayüzü etkinliği görünür olduğunda
  • Kullanıcı arayüzü etkinliği gizlendiğinde ve uygulamanın medya oturumu etkinken
  • Kullanıcı arayüzü etkinliği gizlendiğinde ve uygulamanın medya oturumu etkin olmadığında ve yeniden başlatılması gerektiğinde

Ön plan etkinliğinde medya düğmelerini kullanma

Ön plan etkinliği, onKeyDown() ürününde medya düğmesi önemli etkinliğini alır yöntemidir. Android'in çalışan sürümüne bağlı olarak sistemin etkinliği şuraya yönlendiren iki yolu vardır: Bir medya denetleyicisi:

  • Android 5.0 (API düzeyi 21) veya sonraki bir sürümü kullanıyorsanız şunu arayın: FLAG_HANDLES_MEDIA_BUTTONS. MediaBrowserCompat.ConnectionCallback.onConnected. Bu, medya denetleyicinizin dispatchMediaButtonEvent(), Bu işlem, anahtar kodunu bir medya oturumu geri çağırmasına dönüştürür.
  • Android 5.0'dan (API düzeyi 21) önce, onKeyDown() öğesini işlenecek şekilde değiştirmeniz gerekir yardımcı olabilirsiniz. (Ayrıntılar için Etkin medya oturumunda medya düğmelerini kullanma bölümüne bakın.) Aşağıdaki kod snippet'i, anahtar kodunu kullanın ve dispatchMediaButtonEvent() fonksiyonunu çağırın. true adlı yeri şu kullanıcıya iade ettiğinizden emin olun: Bu da etkinliğin işlendiğini gösterir:

    Kotlin

        fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                return super.onKeyDown(keyCode, event)
            }
            when (keyCode) {
                KeyEvent.KEYCODE_MEDIA_PLAY -> {
                    yourMediaController.dispatchMediaButtonEvent(event)
                    return true
                }
            }
            return super.onKeyDown(keyCode, event)
        }
        

    Java

        @Override
        boolean onKeyDown(int keyCode, KeyEvent event) {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                  return super.onKeyDown(keyCode, event);
                }
                switch (keyCode) {
                  case KeyEvent.KEYCODE_MEDIA_PLAY:
                          yourMediaController.dispatchMediaButtonEvent(event);
                          return true;
                }
                return super.onKeyDown(keyCode, event);
        }
        

Medya oturumu bulma

Ön plan etkinliği etkinliği gerçekleştirmiyorsa Android, bir medya oturumuna başlamanıza yardımcı olur. Aynı şekilde, Android'de medya oturumu aramanın iki yolu vardır:

  • Android 8.0 (API düzeyi 26) veya sonraki sürümleri kullanıyorsanız sistem, yerel olarak ses çalan bir MediaSession içeren son uygulamayı bulun. Oturum Android, etkinliği doğrudan bu etkinliğe gönderir. Aksi halde, oturum etkin değil ve bir mediabutton alıcısı varsa Android etkinliği gönderir tıklayın. Bu işlem, oturumu yeniden başlatarak etkinliği alabilmesini sağlar. (Ayrıntılar için Etkin olmayan bir medya oturumunu yeniden başlatmak için medya düğmelerini kullanma bölümüne bakın.) Oturumda medya düğmesi alıcısı yoksa sistem medyayı siler hiçbir şey olmaz. Mantık aşağıdaki şekilde gösterilmiştir diyagram:

  • Android 8.0'dan (API düzeyi 26) önce sistem, etkinliği etkin medya oturumuna eklendi. Birden fazla etkin medya oturumu varsa Android, oynatmaya hazırlanan (arabelleğe alma/bağlanma) bir medya oturumu seçin. durdurulmuş bir kullanıcı yerine duraklatılmış veya oynatılmış. (Bkz. Etkin medya oturumunda medya düğmelerini kullanma başlıklı bölüme bakın.) Etkin bir oturumunda, Android etkinliği en son etkin oturuma göndermeye çalışır. (Ayrıntılar için Etkin olmayan bir medya oturumunu yeniden başlatmak için medya düğmelerini kullanma bölümüne bakın.) Mantık, aşağıdaki şemada gösterilmektedir:

Etkin medya oturumunda medya düğmelerini kullanma

Android 5.0 (API düzeyi 21) ve sonraki sürümlerde Android, şunu kullanarak medya düğmesi etkinliklerini etkin medya oturumunuza otomatik olarak gönderir: onMediaButtonEvent() Varsayılan olarak bu geri çağırma, KeyEvent'i anahtar koduyla eşleşen uygun medya oturumu Geri Çağırma yöntemine çevirir.

Android, Android 5.0'dan (API düzeyi 21) önce medya düğmesi etkinliklerini bir amaç yayınlayarak işler. ACTION_MEDIA_BUTTON işlemiyle. Uygulamanız şunu kaydetmelidir: BroadcastReceiver'ı kullanarak bu amaçlara müdahale eder. İlgili içeriği oluşturmak için kullanılan MediaButtonReceiver. için özel olarak tasarlanmış bir bu şekilde ilerler. Bu, 2017 yılında yürütülen bir Android içerik uyumlu hale getirme ACTION_MEDIA_BUTTON öğesini işler ve gelen Amaçları uygun MediaSessionCompat.Callback yöntem çağrıları.

MediaButtonReceiver, kısa ömürlü bir BroadcastReceiver'dır. Gelen amaçlarınız için kullanılır. Dilerseniz Android 5.0'dan önceki sistemlerde medya düğmeleri manifest dosyanızdaki MediaButtonReceiver değerini MEDIA_BUTTON intent filtresiyle değiştirin.:

<receiver android:name="android.support.v4.media.session.MediaButtonReceiver" >
   <intent-filter>
     <action android:name="android.intent.action.MEDIA_BUTTON" />
   </intent-filter>
 </receiver>

BroadcastReceiver, niyeti hizmetinize iletir. Amacı ayrıştırmak için ve medya oturumunuz için geri çağırma oluşturun. MediaButtonReceiver.handleIntent() yöntemini hizmetinizin onStartCommand() bölümüne ekleyin. Bu işlem, anahtar kodunu uygun oturum geri çağırma yöntemine çevirir.

Kotlin

private val mediaSessionCompat: MediaSessionCompat = ...

override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
    MediaButtonReceiver.handleIntent(mediaSessionCompat, intent)
    return super.onStartCommand(intent, flags, startId)
}

Java

private MediaSessionCompat mediaSessionCompat = ...;

 public int onStartCommand(Intent intent, int flags, int startId) {
   MediaButtonReceiver.handleIntent(mediaSessionCompat, intent);
   return super.onStartCommand(intent, flags, startId);
 }

Etkin olmayan bir medya oturumunu yeniden başlatmak için medya düğmelerini kullanma

Android son etkin medya oturumunu belirleyebilirse manifest kayıtlı bir bileşene (hizmet veya BroadcastReceiver gibi) ACTION_MEDIA_BUTTON Intent'i göndererek oturumu yeniden başlatmaya çalışır.

Bu, uygulamanızın kullanıcı arayüzü görünür değilken oynatmayı yeniden başlatmasına olanak tanır. Çoğu ses uygulaması için durum bu şekildedir.

MediaSessionCompat kullandığınızda bu davranış otomatik olarak etkinleştirilir. Şu durumda: Android çerçevesinin MediaSession veya Destek Kitaplığı 24.0.0 25.1.1 Bir medya düğmesinin yeniden başlatmasını sağlamak için setMediaButtonReceiver etkin olmayan medya oturumu.

Bu davranışı Android 5.0 (API düzeyi 21) ve sonraki sürümlerde bir boş medya düğmesi alıcısı ayarlama:

Kotlin

// Create a MediaSessionCompat
mediaSession = MediaSessionCompat(context, LOG_TAG)
mediaSession.setMediaButtonReceiver(null)

Java

// Create a MediaSessionCompat
mediaSession = new MediaSessionCompat(context, LOG_TAG);
mediaSession.setMediaButtonReceiver(null);

Medya düğmesi işleyicilerini özelleştirme

onMediaButtonEvent() için varsayılan davranış, anahtar kodunu ayıklar ve hangi yöntemin çağrılacağını belirlemek için medya oturumunun mevcut durumunu ve desteklenen işlemler listesini kullanır. Örneğin, KEYCODE_MEDIA_PLAY, onPlay() yöntemini çağırır.

Tüm uygulamalarda tutarlı bir medya düğmesi deneyimi sağlamak için varsayılan davranışı tercih eder ve yalnızca belirli bir amaç için değişiklik yapar. Bir medya düğmesi özel bir işlem gerekiyorsa geri arama onMediaButtonEvent(). yöntemini kullanıyorsanız, şunu kullanarak KeyEvent öğesini: intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT), etkinliği kendiniz halledip true adresine dönün.

Özet

Android'in tüm sürümlerinde medya düğmesi etkinliklerini doğru şekilde işlemek için belirtin: FLAG_HANDLES_MEDIA_BUTTONS oturum açmanız gerekir.

Ayrıca, desteklemeyi planladığınız Android sürümlerine bağlı olarak aşağıdaki koşulları da karşılamanız gerekir:

Android 5.0 veya sonraki sürümlerde çalışırken:

  • Medya denetleyici onConnected() geri çağırmasından MediaControllerCompat.setMediaController() öğesini çağır
  • Bir medya düğmesinin etkin olmayan bir oturumu yeniden başlatmasına izin vermek için şunu çağırarak dinamik bir MediaButtonReceiver oluşturun: setMediaButtonReceiver() ve PendingIntent ileterek

Android 5.0'dan önceki sistemlerde çalışırken:

  • Medya düğmelerini işlemek için etkinliğin onKeyDown() değerini geçersiz kıl
  • MediaButtonReceiver öğesini uygulamanın manifest dosyasına ekleyerek statik olarak oluşturun