MediaRouter'a genel bakış

Uygulamanızda MediaRouter çerçevesini kullanmak için bir örnek almalısınız MediaRouter nesnesinin durumunu ve bir Yönlendirme etkinliklerini dinleyecek MediaRouter.Callback nesne. Bir medya rotası üzerinden gönderilen içerik, rotanın ilişkili MediaRouteProvider (birkaç özel durum hariç, (ör. Bluetooth çıkış cihazı). Şekil 1'de üst düzey bir görünüm Sınıflar arasında geçiş yapın.

Şekil 1. Uygulamalar tarafından kullanılan önemli medya yönlendiricisi sınıflarına genel bakış.

Not: Uygulamanızın şunları desteklemesini istiyorsanız: Google Cast cihazları, Cast SDK'sını kullanmalısınız. ve uygulamanızı Yayın göndereni olarak derleyin. Şuradaki talimatları uygulayın: Cast dokümanları yerine doğrudan MediaRouter çerçevesini kullanın.

Medya yönlendirme düğmesi

Android uygulamaları, medya yönlendirmeyi kontrol etmek için bir medya yönlendirme düğmesi kullanmalıdır. MediaRouter çerçevesi düğme için kullanıcıların yönlendirmeyi tanıyıp kullanmasına yardımcı olan standart bir arayüz sağlar kullanılabilir olduğu zamandır. Medya rotası düğmesi genellikle sitenizin sağ tarafına yerleştirilir. uygulamanızın işlem çubuğunu kullanın.

Şekil 2. Medya yönlendirme düğmesi işlem çubuğu.

Kullanıcı medya yönlendirme düğmesine bastığında, kullanılabilir medya yolları Şekil 3'te gösterildiği gibi bir listede görünür.

Şekil 3. Medya yönlendirme düğmesine basıldıktan sonra gösterilen kullanılabilir medya rotalarının listesi.

Medya yönlendirme düğmesi oluşturmak için şu adımları izleyin:

  1. AppCompatActivity kullanma
  2. Medya yönlendirme düğmesi menü öğesini tanımla
  3. MediaRouteSelector oluşturma
  4. Medya yönlendirme düğmesini işlem çubuğuna ekleme
  5. Etkinliğinizin yaşam döngüsünde MediaRouter.Callback yöntemlerini oluşturun ve yönetin

Bu bölümde ilk dört adım açıklanmaktadır. Bir sonraki bölümde, geri çağırma yöntemleri açıklanmaktadır.

AppCompatActivity kullanma

Medya yönlendirici çerçevesini bir etkinlikte kullandığınızda, AppCompatActivity içinden etkinliği içe aktarın ve androidx.appcompat.app paketi. Etikete androidx.appcompat:appcompat ve androidx.mediarouter:mediarouter destek kitaplıklarını ekleyin. Destek kitaplığı ekleme hakkında daha fazla bilgi için projenize eklemek için Android Jetpack'i kullanmaya başlama bölümüne bakın.

Dikkat: androidx özelliğini kullandığınızdan emin olun ve medya yönlendiricisi çerçevesinin uygulanmasını sağlar. Eski android.media paketini kullanmayın.

Medya yolu düğmesi için menü öğesini tanımlayan bir xml dosyası oluşturun. Öğenin işlemi MediaRouteActionProvider sınıfı olmalıdır. Aşağıda örnek bir dosya verilmiştir:

// myMediaRouteButtonMenuItem.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto"
      >

    <item android:id="@+id/media_route_menu_item"
        android:title="@string/media_route_menu_title"
        app:actionProviderClass="androidx.mediarouter.app.MediaRouteActionProvider"
        app:showAsAction="always"
    />
</menu>

MediaRouteSelector oluşturma

Medya yönlendirme düğmesi menüsünde görünen rotalar, MediaRouteSelector ile belirlenir. AppCompatActivity tarihinden itibaren etkinliğinizin süresini uzatın ve MediaRouteSelector.Builder çağrısıyla etkinlik oluşturulduğunda seçiciyi oluşturun. gösterildiği gibi onCreate() yönteminden aşağıda verilen kod örneğine bakalım. Seçicinin bir sınıf değişkenine kaydedildiğini ve izin verilen rota türlerinin belirtildiğini unutmayın MediaControlIntent nesne ekleyerek:

Kotlin

class MediaRouterPlaybackActivity : AppCompatActivity() {

    private var mSelector: MediaRouteSelector? = null

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

        // Create a route selector for the type of routes your app supports.
        mSelector = MediaRouteSelector.Builder()
                // These are the framework-supported intents
                .addControlCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK)
                .build()
    }
}

Java

public class MediaRouterPlaybackActivity extends AppCompatActivity {
    private MediaRouteSelector mSelector;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Create a route selector for the type of routes your app supports.
        mSelector = new MediaRouteSelector.Builder()
                // These are the framework-supported intents
                .addControlCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK)
                .build();
    }
}

Çoğu uygulamada CATEGORY_REMOTE_PLAYBACK gereken rota türü. Bu rota türü, uygulamanızı çalıştıran cihazı uzaktan kumanda olarak değerlendirir. Bağlı alıcı cihaz; tüm içerik verisi alma, kod çözme ve oynatma işlemlerini gerçekleştirir. Google Cast'i destekleyen, aşağıdaki gibi uygulamalar bu şekildedir: Chromecast, iş.

Bazı üreticiler, "ikincil çıkış" adı verilen özel yönlendirme seçeneğini desteklemektedir. Bu yönlendirme sayesinde, medya uygulaması video veya müziği doğrudan seçilen uzak alıcı cihazın ekranına ve/veya hoparlörlere alır, oluşturur ve yayınlar. Kablosuz özellikli müzik sistemlerine veya video ekranlarına içerik göndermek için ikincil çıkış kullanın. Keşif ve deneyim özelliklerinin bu cihazları seçtiğinizde, CATEGORY_LIVE_AUDIO veya CATEGORY_LIVE_VIDEO kontrol kategorilerini MediaRouteSelector'a taşır. Ayrıca kendi Presentation iletişim kutunuzu oluşturup yönetmeniz gerekir.

Medya yönlendirme düğmesini işlem çubuğuna ekleme

Medya rota menüsü ve MediaRouteSelector tanımlanmış olduğunda, artık bir etkinliğe medya rota düğmesi ekleyebilirsiniz. Seçenek eklemek için etkinliklerinizin her birinde onCreateOptionsMenu() yöntemini geçersiz kılın tıklayın.

Kotlin

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    super.onCreateOptionsMenu(menu)

    // Inflate the menu and configure the media router action provider.
    menuInflater.inflate(R.menu.sample_media_router_menu, menu)

    // Attach the MediaRouteSelector to the menu item
    val mediaRouteMenuItem = menu.findItem(R.id.media_route_menu_item)
    val mediaRouteActionProvider =
            MenuItemCompat.getActionProvider(mediaRouteMenuItem) as MediaRouteActionProvider

    // Attach the MediaRouteSelector that you built in onCreate()
    selector?.also(mediaRouteActionProvider::setRouteSelector)

    // Return true to show the menu.
    return true
}

Java

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);

    // Inflate the menu and configure the media router action provider.
    getMenuInflater().inflate(R.menu.sample_media_router_menu, menu);

    // Attach the MediaRouteSelector to the menu item
    MenuItem mediaRouteMenuItem = menu.findItem(R.id.media_route_menu_item);
    MediaRouteActionProvider mediaRouteActionProvider =
            (MediaRouteActionProvider)MenuItemCompat.getActionProvider(
            mediaRouteMenuItem);
    // Attach the MediaRouteSelector that you built in onCreate()
    mediaRouteActionProvider.setRouteSelector(selector);

    // Return true to show the menu.
    return true;
}

Uygulamanızda işlem çubuğunu kullanma hakkında daha fazla bilgi için İşlem Çubuğu'nu inceleyin geliştirici kılavuzuna.

Ayrıca, medya yönlendirme düğmesini MediaRouteButton olarak ekleyebilirsiniz. görünüm. setRouteSelector() yöntemini kullanarak düğmeye bir MediaRouteSelector eklemeniz gerekir. Bkz. Google Cast Tasarımı Kontrol Listesi ziyaret edin.

MediaRouter geri çağırmaları

Aynı cihazda çalışan tüm uygulamalar tek bir MediaRouter örneğini ve rotalarını paylaşır (uygulamanın MediaRouteSelector'a göre uygulama başına filtrelenir). Her etkinlik MediaRouter ile iletişim kurar kendi MediaRouter.Callback uygulamasını kullanarak yöntemlerine göz atın. Kullanıcı bir rota seçtiğinde, değiştirdiğinde veya bağlantısını kestiğinde, MediaRouter geri çağırma yöntemlerini çağırır.

Geri çağırmada, hakkında bilgi almak için geçersiz kılabileceğiniz çeşitli yöntemler vardır. yönlendirme etkinlikleri. En azından, MediaRouter.Callback sınıfını uygulamanız geçersiz kılınmalıdır onRouteSelected() ve onRouteUnselected().

MediaRouter paylaşılan bir kaynak olduğundan, uygulamanızın MediaRouter geri çağırmalarını yönetmesi gerekir yanıt olarak aşağıda verilmiştir:

  • Etkinlik oluşturulduğunda (onCreate(Bundle)) MediaRouter öğesine işaret eden bir işaretçiyi alıp uygulamanın kullanım süresi boyunca basılı tutun.
  • Etkinlik görünür hale geldiğinde MediaRouter'a geri çağırma ekleyin (onStart()) ve gizlendiğinde bunları ayırın (onStop()).

Aşağıdaki kod örneğinde, geri çağırma nesnesini oluşturup kaydetme MediaRouter örneği ve geri çağırmaların nasıl yönetileceği. onStart() öğesine geri çağırma eklerken CALLBACK_FLAG_REQUEST_DISCOVERY işaretinin kullanıldığına dikkat edin. Bu, MediaRouteSelector'ın medya rotası düğmenizin Mevcut rotaların listesi.

Kotlin

class MediaRouterPlaybackActivity : AppCompatActivity() {

    private var mediaRouter: MediaRouter? = null
    private var mSelector: MediaRouteSelector? = null

    // Variables to hold the currently selected route and its playback client
    private var mRoute: MediaRouter.RouteInfo? = null
    private var remotePlaybackClient: RemotePlaybackClient? = null

    // Define the Callback object and its methods, save the object in a class variable
    private val mediaRouterCallback = object : MediaRouter.Callback() {

        override fun onRouteSelected(router: MediaRouter, route: MediaRouter.RouteInfo) {
            Log.d(TAG, "onRouteSelected: route=$route")
            if (route.supportsControlCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK)) {
                // Stop local playback (if necessary)
                // ...

                // Save the new route
                mRoute = route

                // Attach a new playback client
                remotePlaybackClient =
                    RemotePlaybackClient(this@MediaRouterPlaybackActivity, mRoute)

                // Start remote playback (if necessary)
                // ...
            }
        }

        override fun onRouteUnselected(
                router: MediaRouter,
                route: MediaRouter.RouteInfo,
                reason: Int
        ) {
            Log.d(TAG, "onRouteUnselected: route=$route")
            if (route.supportsControlCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK)) {

                // Changed route: tear down previous client
                mRoute?.also {
                    remotePlaybackClient?.release()
                    remotePlaybackClient = null
                }

                // Save the new route
                mRoute = route

                when (reason) {
                    MediaRouter.UNSELECT_REASON_ROUTE_CHANGED -> {
                        // Resume local playback (if necessary)
                        // ...
                    }
                }
            }
        }
    }


    // Retain a pointer to the MediaRouter
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // Get the media router service.
        mediaRouter = MediaRouter.getInstance(this)
        ...
    }

    // Use this callback to run your MediaRouteSelector to generate the
    // list of available media routes
    override fun onStart() {
        mSelector?.also { selector ->
            mediaRouter?.addCallback(selector, mediaRouterCallback,
                    MediaRouter.CALLBACK_FLAG_REQUEST_DISCOVERY)
        }
        super.onStart()
    }

    // Remove the selector on stop to tell the media router that it no longer
    // needs to discover routes for your app.
    override fun onStop() {
        mediaRouter?.removeCallback(mediaRouterCallback)
        super.onStop()
    }
    ...
}

Java

public class MediaRouterPlaybackActivity extends AppCompatActivity {
    private MediaRouter mediaRouter;
    private MediaRouteSelector mSelector;

    // Variables to hold the currently selected route and its playback client
    private MediaRouter.RouteInfo mRoute;
    private RemotePlaybackClient remotePlaybackClient;

    // Define the Callback object and its methods, save the object in a class variable
    private final MediaRouter.Callback mediaRouterCallback =
            new MediaRouter.Callback() {

        @Override
        public void onRouteSelected(MediaRouter router, RouteInfo route) {
            Log.d(TAG, "onRouteSelected: route=" + route);

            if (route.supportsControlCategory(
                MediaControlIntent.CATEGORY_REMOTE_PLAYBACK)){
                // Stop local playback (if necessary)
                // ...

                // Save the new route
                mRoute = route;

                // Attach a new playback client
                remotePlaybackClient = new RemotePlaybackClient(this, mRoute);

                // Start remote playback (if necessary)
                // ...
            }
        }

        @Override
        public void onRouteUnselected(MediaRouter router, RouteInfo route, int reason) {
            Log.d(TAG, "onRouteUnselected: route=" + route);

            if (route.supportsControlCategory(
                MediaControlIntent.CATEGORY_REMOTE_PLAYBACK)){

                // Changed route: tear down previous client
                if (mRoute != null && remotePlaybackClient != null) {
                    remotePlaybackClient.release();
                    remotePlaybackClient = null;
                }

                // Save the new route
                mRoute = route;

                if (reason != MediaRouter.UNSELECT_REASON_ROUTE_CHANGED) {
                    // Resume local playback  (if necessary)
                    // ...
                }
            }
        }
    }


    // Retain a pointer to the MediaRouter
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Get the media router service.
        mediaRouter = MediaRouter.getInstance(this);
        ...
    }

    // Use this callback to run your MediaRouteSelector to generate the list of available media routes
    @Override
    public void onStart() {
        mediaRouter.addCallback(mSelector, mediaRouterCallback,
                MediaRouter.CALLBACK_FLAG_REQUEST_DISCOVERY);
        super.onStart();
    }

    // Remove the selector on stop to tell the media router that it no longer
    // needs to discover routes for your app.
    @Override
    public void onStop() {
        mediaRouter.removeCallback(mediaRouterCallback);
        super.onStop();
    }
    ...
}

Medya yönlendirici çerçevesi ayrıca MediaRouteDiscoveryFragment sınıfıdır. Bu segmentte ekleme ve bir etkinlik için geri çağırmayı kaldırmak.

Not: Müzik çalma uygulaması yazıyor ve uygulamanın çalmasını istiyorsanız arka plandayken müzik dinlemek için bir Service oluşturmanız gerekir ve hizmetin yaşam döngüsü geri çağırmaları aracılığıyla medya yönlendiricisi çerçevesini çağırın.

Uzaktan oynatma rotasını kontrol etme

Uzaktan oynatma rotası seçtiğinizde uygulamanız uzaktan kumanda görevi görür. Rotanın diğer ucundaki cihaz tüm içerik verisi alma, kod çözme ve oynatma işlevlerini yerine getirir. Uygulamanızın kullanıcı arayüzündeki kontroller, alıcı cihazla iletişim kurmak için RemotePlaybackClient nesne algılandı.

RemotePlaybackClient sınıfı, ek yöntemler sağlar. kontrol edebilirsiniz. RemotePlaybackClient sınıfındaki önemli oynatma yöntemlerinden bazıları şunlardır:

  • play() — Belirli bir şarkıyı çal medya dosyası (Uri ile belirtilir).
  • pause() — Duraklat şu anda medya parçası çalıyor.
  • resume() — Devam et bir duraklatma komutundan sonra mevcut parçanın çalınması
  • seek() — Belirli bir yere git geçerli parçadaki en yüksek konumdur.
  • release() — Şunları ortadan kaldırın: uzaktan oynatma cihazı arasında bağlantı kurma.

Hesabınızda sağladığınız oynatma kontrollerine işlem eklemek için bu yöntemleri kullanabilirsiniz. uygulamasını indirin. Bu yöntemlerin çoğu, mevcut dönüşüm işlemlerini izleyebilmeniz için bir geri çağırma nesnesi eklemenize oynatma görevinin veya kontrol isteğinin ilerleme durumunu gösterir.

RemotePlaybackClient sınıfı, iletilerin sıraya alınmasını da destekler. medya sırasının oynatılması ve yönetimi için birden fazla medya öğesi kullanabilirsiniz.

Örnek kod

Android BasicMediaRouter ve MediaRouter örnekler, MediaRouter API'nin kullanımını da gösterir.