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.
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.
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.
Medya yönlendirme düğmesi oluşturmak için şu adımları izleyin:
- AppCompatActivity kullanma
- Medya yönlendirme düğmesi menü öğesini tanımla
- MediaRouteSelector oluşturma
- Medya yönlendirme düğmesini işlem çubuğuna ekleme
- 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 yönlendirme düğmesi menü öğesini tanımla
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.