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 kulaklıktaki duraklat/oynat düğmesi). Kullanıcı medya düğmesine bastığında Android, düğmeyi tanımlayan bir anahtar kodu içeren bir KeyEvent oluşturur. Medya düğmesi KeyEvents anahtar kodları, KEYCODE_MEDIA ile başlayan sabit değerlerdir (örneğin, KEYCODE_MEDIA_PLAY).

Uygulamalar, medya düğmesi etkinliklerini üç durumda, öncelik sırasına göre işleyebilmelidir:

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

Ön plan etkinliğinde medya düğmelerini işleme

Ön plan etkinliği, onKeyDown() yönteminde medya düğmesi önemli etkinliğini alır. Android'in çalışan sürümüne bağlı olarak, sistemin etkinliği bir medya denetleyiciye yönlendirmesinin iki yolu vardır:

  • Android 5.0 (API düzeyi 21) veya sonraki bir sürümü çalıştırıyorsanız FLAG_HANDLES_MEDIA_BUTTONS MediaBrowserCompat.ConnectionCallback.onConnected numaralı telefonu arayın. Bu işlem, medya denetleyicinizin dispatchMediaButtonEvent() yöntemini otomatik olarak çağırır ve anahtar kodu, medya oturumu geri çağırmasına dönüştürülür.
  • Android 5.0'dan (API düzeyi 21) önce, etkinliği kendiniz yönetmek için onKeyDown() API'sini değiştirmeniz gerekir. (Ayrıntılar için Etkin bir medya oturumundaki medya düğmelerini kullanma konusuna bakın.) Aşağıdaki kod snippet'i, anahtar koduna nasıl müdahale edileceği ve sevkMediaButtonEvent() işlevini nasıl çağıracağını göstermektedir. Etkinliğin işlendiğini belirtmek için true değerini döndürdüğünüzden emin olun:

    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 işlemi gerçekleştiremiyorsa Android, bunu işleyebilecek bir medya oturumu bulmaya çalışır. Yine, Android'in çalışan sürümüne bağlı olarak, medya oturumu aramasının iki yolu vardır:

  • Android 8.0 (API düzeyi 26) veya sonraki bir sürümü çalıştırıyorsanız sistem, yerel olarak ses çalan bir MediaSession içeren son uygulamayı bulmaya çalışır. Oturum hâlâ etkinse Android, etkinliği doğrudan oturuma gönderir. Aksi takdirde, oturum etkin değilse ve bir medya düğmesi alıcısı varsa Android, etkinliği alıcıya gönderir ve böylece oturumu yeniden başlatarak etkinliği alabilir. (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.) Oturumun bir medya düğmesi alıcısı yoksa sistem, medya düğmesi etkinliğini siler ve hiçbir şey olmaz. Mantık, aşağıdaki şemada gösterilmektedir:

  • Android 8.0'dan (API düzeyi 26) önceki sürümlerde sistem, etkinliği etkin bir medya oturumuna göndermeye çalışır. Birden fazla etkin medya oturumu varsa Android durdurulmuş bir medya oturumu yerine oynatmaya hazırlanan (arabelleğe alınıyor/bağlanıyor), oynatılan veya duraklatılmış bir medya oturumu seçmeye çalışır. (Daha fazla ayrıntı için Etkin bir medya oturumunda medya düğmelerini kullanma bölümüne bakın.) Etkin bir oturum yoksa 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 bir medya oturumunda medya düğmelerini kullanma

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

Android 5.0 (API düzeyi 21) sürümünden önce, Android, ACTION_MEDIA_BUTTON işlemiyle bir amaç yayınlayarak medya düğmesi etkinliklerini işliyor. Uygulamanızın bu amaçlara müdahale etmek için bir Yayın Alıcısı kaydetmesi gerekir. MediaButtonReceiver sınıfı bu amaç doğrultusunda özel olarak tasarlanmıştır. Android medya uyumluluğu kitaplığında bulunan ve ACTION_MEDIA_BUTTON işini işleyen ve gelen Intent'leri uygun MediaSessionCompat.Callback yöntem çağrılarına dönüştüren bir kolaylık sınıfıdır.

MediaButtonReceiver, kısa ömürlü bir BroadcastReceiver'dır. Gelen niyetleri medya oturumunuzu yöneten hizmete yönlendirir. Android 5.0'dan önceki sistemlerde medya düğmelerini kullanmak istiyorsanız MediaButtonReceiver öğesini, MEDIA_BUTTON intent filtresiyle manifest dosyanıza eklemeniz gerekir.:

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

BroadcastReceiver, amacı hizmetinize yönlendirir. Niyeti ayrıştırmak ve medya oturumunuza geri çağırmayı oluşturmak için hizmetinizin onStartCommand() bölümüne MediaButtonReceiver.handleIntent() yöntemini ekleyin. Bu işlem, anahtar kodunu uygun oturum geri çağırma yöntemine dönüştürür.

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 tanımlayabilirse manifestte kayıtlı bir bileşene (ör. hizmet veya BroadcastReceiver) bir ACTION_MEDIA_BUTTON intent'i göndererek oturumu yeniden başlatmaya çalışır.

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

MediaSessionCompat kullandığınızda bu davranış otomatik olarak etkinleştirilir. Android çerçevesinin MediaSession veya Destek Kitaplığı 24.0.0 ile 25.1.1 arasındaki sürümleri kullanıyorsanız bir medya düğmesinin etkin olmayan medya oturumunu yeniden başlatmasına izin vermek için setMediaButtonReceiver yöntemini çağırmanız gerekir.

Android 5.0 (API düzeyi 21) ve sonraki sürümlerde bu davranışı boş bir medya düğme alıcısı ayarlayarak devre dışı bırakabilirsiniz:

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 çıkarır 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() çağırır.

Tüm uygulamalarda tutarlı bir medya düğmesi deneyimi sağlamak için varsayılan davranışı kullanmanız ve yalnızca belirli bir amaç doğrultusunda sapmanız gerekir. Bir medya düğmesinin özel işlenmesi gerekiyorsa geri çağırmanızın onMediaButtonEvent() yöntemini geçersiz kılın, KeyEvent öğesini intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT) kullanarak ayıklayın, etkinliği kendiniz işleyin ve true değerini döndürün.

Özet

Medya düğmesi etkinliklerini Android'in tüm sürümlerinde doğru şekilde işlemek için medya oturumu oluştururken FLAG_HANDLES_MEDIA_BUTTONS değerini belirtmeniz gerekir.

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

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

  • Medya kumandasından onConnected() geri çağırması olan MediaControllerCompat.setMediaController() numarasını ara
  • Bir medya düğmesinin etkin olmayan bir oturumu yeniden başlatmasına izin vermek için setMediaButtonReceiver() yöntemini çağırıp buna PendingIntent ileterek dinamik olarak MediaButtonReceiver oluşturun

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

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