Medya tarayıcı istemcisi oluşturma

İstemci/sunucu tasarımını tamamlamak için, kullanıcı arayüzü kodunuzu, ilişkili bir MediaController'ı ve bir MediaTarayıcı'yı içeren bir etkinlik bileşeni oluşturmalısınız.

MediaTarayıcı iki önemli işlev gerçekleştirir: Bir MediaTarayıcı Hizmeti'ne bağlanır ve bağlandıktan sonra kullanıcı arayüzünüz için MediaController oluşturur.

Not: MediaTarayıcı'nın önerilen uygulaması - MediaBrowserCompat, Bu, Media-Compat destek kitaplığı. Bu sayfa boyunca "MediaTarayıcı" terimi bir örneği ifade eder bölümünü ziyaret edin.

MediaTarayıcı Hizmeti'ne bağlanın

İstemci etkinliğiniz oluşturulduğunda MediaTarayıcı Hizmeti'ne bağlanır. Küçük bir tokalaşma ve dans ortamı gerekir. Etkinliğin yaşam döngüsü geri çağırmalarını aşağıdaki gibi değiştirin:

  • onCreate(), bir MediaTarayıcıCompat oluşturur. Tanımladığınız MediaTarayıcıHizmeti ve MediaTarayıcıcompat.ConnectionCallback adını iletin.
  • onStart(), MediaTarayıcı Hizmeti'ne bağlanır. MediaTarayıcıCompat.ConnectionCallback burada devreye girer. Bağlantı başarılı olursa onConnect() geri çağırması medya denetleyicisini oluşturur, medya oturumuna bağlar, kullanıcı arayüzü kontrollerinizi MediaController'a bağlar ve denetleyiciyi medya oturumundan geri çağırmaları alacak şekilde kaydeder.
  • onResume(), ses akışını, uygulamanızın cihazdaki ses kontrolüne yanıt vereceği şekilde ayarlar.
  • onStop(), MediaTarayıcınızın bağlantısını keser ve etkinliğiniz durduğunda MediaController.Callback kaydını iptal eder.
KotlinJava
class MediaPlayerActivity : AppCompatActivity() {

   
private lateinit var mediaBrowser: MediaBrowserCompat

   
override fun onCreate(savedInstanceState: Bundle?) {
       
super.onCreate(savedInstanceState)
       
// ...
       
// Create MediaBrowserServiceCompat
        mediaBrowser
= MediaBrowserCompat(
               
this,
               
ComponentName(this, MediaPlaybackService::class.java),
                connectionCallbacks
,
               
null // optional Bundle
       
)
   
}

   
public override fun onStart() {
       
super.onStart()
        mediaBrowser
.connect()
   
}

   
public override fun onResume() {
       
super.onResume()
        volumeControlStream
= AudioManager.STREAM_MUSIC
   
}

   
public override fun onStop() {
       
super.onStop()
       
// (see "stay in sync with the MediaSession")
       
MediaControllerCompat.getMediaController(this)?.unregisterCallback(controllerCallback)
        mediaBrowser
.disconnect()
   
}
}
public class MediaPlayerActivity extends AppCompatActivity {
 
private MediaBrowserCompat mediaBrowser;

 
@Override
 
protected void onCreate(Bundle savedInstanceState) {
   
super.onCreate(savedInstanceState);
   
// ...
   
// Create MediaBrowserServiceCompat
    mediaBrowser
= new MediaBrowserCompat(this,
     
new ComponentName(this, MediaPlaybackService.class),
        connectionCallbacks
,
       
null); // optional Bundle
 
}

 
@Override
 
public void onStart() {
   
super.onStart();
    mediaBrowser
.connect();
 
}

 
@Override
 
public void onResume() {
   
super.onResume();
    setVolumeControlStream
(AudioManager.STREAM_MUSIC);
 
}

 
@Override
 
public void onStop() {
   
super.onStop();
   
// (see "stay in sync with the MediaSession")
   
if (MediaControllerCompat.getMediaController(MediaPlayerActivity.this) != null) {
     
MediaControllerCompat.getMediaController(MediaPlayerActivity.this).unregisterCallback(controllerCallback);
   
}
    mediaBrowser
.disconnect();

 
}
}

MediaTarayıcıCompat.ConnectionCallback'ı özelleştirin

Etkinliğiniz MediaTarayıcıCompat oluşturduğunda, bir ConnectionCallback örneği oluşturmanız gerekir. MediaTarayıcı Hizmeti'nden medya oturumu jetonunu almak için onConnected() yöntemini değiştirin ve jetonu kullanarak bir MediaControllerCompat oluşturun.

Kolaylık yöntemini kullanın MediaControllerCompat.setMediaController(). kumandaya bir bağlantı kaydedin. Bu, medya düğmelerinin işlenmesini etkinleştirir. Ayrıca, Aktarım denetimlerini oluştururken denetleyiciyi almak için MediaControllerCompat.getMediaController().

Aşağıdaki kod örneğinde onConnected() yönteminin nasıl değiştirileceği gösterilmektedir.

KotlinJava
private val connectionCallbacks = object : MediaBrowserCompat.ConnectionCallback() {
   
override fun onConnected() {

       
// Get the token for the MediaSession
        mediaBrowser
.sessionToken.also { token ->

           
// Create a MediaControllerCompat
           
val mediaController = MediaControllerCompat(
                   
this@MediaPlayerActivity, // Context
                    token
           
)

           
// Save the controller
           
MediaControllerCompat.setMediaController(this@MediaPlayerActivity, mediaController)
       
}

       
// Finish building the UI
        buildTransportControls
()
   
}

   
override fun onConnectionSuspended() {
       
// The Service has crashed. Disable transport controls until it automatically reconnects
   
}

   
override fun onConnectionFailed() {
       
// The Service has refused our connection
   
}
}
private final MediaBrowserCompat.ConnectionCallback connectionCallbacks =
 
new MediaBrowserCompat.ConnectionCallback() {
   
@Override
   
public void onConnected() {

     
// Get the token for the MediaSession
     
MediaSessionCompat.Token token = mediaBrowser.getSessionToken();

     
// Create a MediaControllerCompat
     
MediaControllerCompat mediaController =
       
new MediaControllerCompat(MediaPlayerActivity.this, // Context
        token
);

     
// Save the controller
     
MediaControllerCompat.setMediaController(MediaPlayerActivity.this, mediaController);

     
// Finish building the UI
      buildTransportControls
();
   
}

   
@Override
   
public void onConnectionSuspended() {
     
// The Service has crashed. Disable transport controls until it automatically reconnects
   
}

   
@Override
   
public void onConnectionFailed() {
     
// The Service has refused our connection
   
}
 
};

Kullanıcı arayüzünüzü medya denetleyiciye bağlayın

Yukarıdaki ConnectionCallback örnek kodunda, kullanıcı arayüzünüzü geliştirmek için bir buildTransportControls() çağrısı içerir. Oynatıcıyı kontrol eden kullanıcı arayüzü öğeleri için onClickListeners öğelerini ayarlamanız gerekir. Size uygun olan Her biri için MediaControllerCompat.TransportControls yöntemini kullanın.

Kodunuz, her düğme için bir onClickListener ile aşağıdaki gibi görünecektir:

KotlinJava
fun buildTransportControls() {
   
val mediaController = MediaControllerCompat.getMediaController(this@MediaPlayerActivity)
   
// Grab the view for the play/pause button
    playPause
= findViewById<ImageView>(R.id.play_pause).apply {
        setOnClickListener
{
           
// Since this is a play/pause button, you'll need to test the current state
           
// and choose the action accordingly

           
val pbState = mediaController.playbackState.state
           
if (pbState == PlaybackStateCompat.STATE_PLAYING) {
                mediaController
.transportControls.pause()
           
} else {
                mediaController
.transportControls.play()
           
}
       
}
   
}

   
// Display the initial state
   
val metadata = mediaController.metadata
   
val pbState = mediaController.playbackState

   
// Register a Callback to stay in sync
    mediaController
.registerCallback(controllerCallback)
}
void buildTransportControls()
{
 
// Grab the view for the play/pause button
  playPause
= (ImageView) findViewById(R.id.play_pause);

 
// Attach a listener to the button
  playPause
.setOnClickListener(new View.OnClickListener() {
   
@Override
   
public void onClick(View v) {
     
// Since this is a play/pause button, you'll need to test the current state
     
// and choose the action accordingly

     
int pbState = MediaControllerCompat.getMediaController(MediaPlayerActivity.this).getPlaybackState().getState();
     
if (pbState == PlaybackStateCompat.STATE_PLAYING) {
       
MediaControllerCompat.getMediaController(MediaPlayerActivity.this).getTransportControls().pause();
     
} else {
       
MediaControllerCompat.getMediaController(MediaPlayerActivity.this).getTransportControls().play();
     
}
 
});

 
MediaControllerCompat mediaController = MediaControllerCompat.getMediaController(MediaPlayerActivity.this);

 
// Display the initial state
 
MediaMetadataCompat metadata = mediaController.getMetadata();
 
PlaybackStateCompat pbState = mediaController.getPlaybackState();

 
// Register a Callback to stay in sync
  mediaController
.registerCallback(controllerCallback);
}
}

TransportControls yöntemleri, hizmetinizin medya oturumuna geri çağırmalar gönderir. Buna karşılık gelen bir anahtar kelime Her kontrol için MediaSessionCompat.Callback yöntemi.

Medya oturumuyla senkronize olun

Kullanıcı arayüzü, medya oturumunun mevcut durumunu, PlaybackState ve Metadata tarafından açıklanan şekilde görüntülemelidir. Aktarım denetimlerini oluşturduğunuzda, oturumun geçerli durumunu alabilir, kullanıcı arayüzünüzde görüntüleyebilir, duruma ve kullanılabilir işlemlerine bağlı olarak aktarım denetimlerini etkinleştirebilir ve devre dışı bırakabilirsiniz.

Durumu veya meta verileri her değiştiğinde medya oturumundan geri çağırma almak için bir MediaControllerCompat.Callback:

KotlinJava
private var controllerCallback = object : MediaControllerCompat.Callback() {

   
override fun onMetadataChanged(metadata: MediaMetadataCompat?) {}

   
override fun onPlaybackStateChanged(state: PlaybackStateCompat?) {}
}
MediaControllerCompat.Callback controllerCallback =
 
new MediaControllerCompat.Callback() {
   
@Override
   
public void onMetadataChanged(MediaMetadataCompat metadata) {}

   
@Override
   
public void onPlaybackStateChanged(PlaybackStateCompat state) {}
 
};

Aktarım denetimlerini oluştururken geri çağırmayı kaydedin (buildTransportControls() yöntemine bakın) ve etkinlik durduğunda kaydını silin (etkinliğin onStop() yaşam döngüsü yönteminde).

Medya oturumu kaldırıldığında bağlantıyı kes

Medya oturumu geçersiz hale gelirse, onSessionDestroyed() geri arama yapılır. Bu durumda oturum işlevsel hale gelemez MediaBrowserService kullanım süresi içinde tekrarlanır. İşlevler çalışmaya devam edebilir, kullanıcı göremez veya kontrol edemezMediaBrowser bir medya oturumundan oynatmanın en iyi yoludur.

Bu nedenle, oturum kaldırıldığında Telefon ederek MediaBrowserService disconnect(). Bu, tarayıcı hizmetinde bağlı istemci olmamasını imha edilebilir İşletim Sistemi. MediaBrowserService uygulamasına daha sonra yeniden bağlanmanız gerekirse (örneğin, uygulamanızın medya uygulamasıyla kalıcı bir bağlantıyı sürdürmesi gerekiyorsa) Eskisini yeniden kullanmak yerine MediaBrowser için yeni bir örnek oluşturun.

Aşağıdaki kod snippet'inde, medya oturumu silindiğinde tarayıcı hizmetiyle bağlantısı kesilir:

KotlinJava
private var controllerCallback = object : MediaControllerCompat.Callback() {
   
override fun onSessionDestroyed() {
      mediaBrowser
.disconnect()
     
// maybe schedule a reconnection using a new MediaBrowser instance
   
}
}
MediaControllerCompat.Callback controllerCallback =
 
new MediaControllerCompat.Callback() {
   
@Override
   
public void onSessionDestroyed() {
      mediaBrowser
.disconnect();
     
// maybe schedule a reconnection using a new MediaBrowser instance
   
}
 
};