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 denetleyicinizindispatchMediaButtonEvent()
, 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ındanMediaControllerCompat.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()
vePendingIntent
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