TV giriş hizmeti, medya akış kaynağını temsil eder ve medya içeriğinizi geleneksel, TV yayını tarzında kanal ve program şeklinde sunmanıza olanak tanır. TV giriş hizmetiyle ebeveyn denetimleri, program rehberi bilgileri ve içerik derecelendirmeleri sağlayabilirsiniz. TV giriş hizmeti, Android sistemi TV uygulamasıyla çalışır. Bu uygulama, nihai olarak TV'de kanal içeriğini kontrol edip sunar. Sistem TV uygulaması, cihaz için özel olarak geliştirilmiştir ve üçüncü taraf uygulamaları tarafından değiştirilemez. TV Giriş Çerçevesi (TIF) mimarisi ve bileşenleri hakkında daha fazla bilgi için TV Giriş Çerçevesi bölümüne bakın.
TIF Tamamlayıcı Kitaplığı'nı kullanarak TV giriş hizmeti oluşturma
TIF Tamamlayıcı Kitaplığı, yaygın TV giriş hizmeti özelliklerinin genişletilebilir uygulamalarını sağlayan bir çerçevedir. Yalnızca OEM'ler tarafından Android 5.0 (API düzeyi 21) ile Android 7.1 (API düzeyi 25) arası kanallar oluşturmak için kullanılmalıdır.
Projenizi güncelleme
TIF Tamamlayıcı Kitaplığı, androidtv-sample-inputs deposundaki OEM'ler tarafından eski kullanım için kullanılabilir. Kitaplığın bir uygulamaya nasıl ekleneceğini gösteren örnek için bu depoya bakın.
Manifest'te TV giriş hizmetinizi bildirme
Uygulamanız, sistemin uygulamanıza erişmek için kullandığı TvInputService
uyumlu bir hizmet sağlamalıdır. TIF Tamamlayıcı Kitaplığı, özelleştirebileceğiniz varsayılan bir TvInputService
uygulaması sağlayan BaseTvInputService
sınıfını sağlar. Bir BaseTvInputService
alt sınıfı oluşturun ve manifest dosyanızdaki alt sınıfı bir hizmet olarak bildirin.
Manifest bildiriminde, hizmetin TV girişini sisteme bağlamasına izin vermek için BIND_TV_INPUT
iznini belirtin. Bir sistem hizmeti, bağlamayı gerçekleştirir ve BIND_TV_INPUT
iznine sahiptir.
Sistem TV uygulaması, istekleri TvInputManager
arayüzü üzerinden TV giriş hizmetlerine gönderir.
Hizmet bildiriminize, niyetle gerçekleştirilecek işlem olarak TvInputService
değerini belirten bir intent filtresi ekleyin. Ayrıca hizmet meta verilerini ayrı bir XML kaynağı olarak bildirin. Hizmet bildirimi, intent filtresi ve hizmet meta veri bildirimi aşağıdaki örnekte gösterilmiştir:
<service android:name=".rich.RichTvInputService" android:label="@string/rich_input_label" android:permission="android.permission.BIND_TV_INPUT"> <!-- Required filter used by the system to launch our account service. --> <intent-filter> <action android:name="android.media.tv.TvInputService" /> </intent-filter> <!-- An XML file which describes this input. This provides pointers to the RichTvInputSetupActivity to the system/TV app. --> <meta-data android:name="android.media.tv.input" android:resource="@xml/richtvinputservice" /> </service>
Hizmet meta verilerini ayrı bir XML dosyasında tanımlayın. Hizmet meta veri XML dosyası, TV girişinin ilk yapılandırmasını ve kanal taramasını açıklayan bir kurulum arayüzü içermelidir. Meta veri dosyasında, kullanıcıların içerik kaydedip kaydedemeyeceğini belirten bir işaret de bulunmalıdır. Uygulamanızda içerik kaydetmeyi destekleme hakkında daha fazla bilgi için İçerik kaydetmeyi destekleme bölümüne bakın.
Hizmet meta veri dosyası, uygulamanızın XML kaynakları dizininde bulunur ve manifest'te beyan ettiğiniz kaynağın adıyla eşleşmelidir. Önceki örnekte yer alan manifest girişlerini kullanarak res/xml/richtvinputservice.xml
adresinde XML dosyasını aşağıdaki içerikle oluşturursunuz:
<?xml version="1.0" encoding="utf-8"?> <tv-input xmlns:android="http://schemas.android.com/apk/res/android" android:canRecord="true" android:setupActivity="com.example.android.sampletvinput.rich.RichTvInputSetupActivity" />
Kanalları tanımlama ve kurulum etkinliğinizi oluşturma
TV giriş hizmetiniz, kullanıcıların sistem TV uygulaması üzerinden eriştiği en az bir kanal tanımlamalıdır. Kanallarınızı sistem veritabanına kaydetmeli ve sistemin uygulamanız için bir kanal bulamadığında çağıracağı bir kurulum etkinliği sağlamalısınız.
Öncelikle, uygulamanızın verileri, kullanıcının yararlanabileceği kanalları ve programları içeren sistem Elektronik Programlama Kılavuzu'ndan (EPG) okuması ve yazması için etkinleştirin. Uygulamanızın bu işlemleri gerçekleştirmesini sağlamak ve cihaz yeniden başlatıldıktan sonra EPG ile senkronize etmek için aşağıdaki öğeleri uygulama manifestinize ekleyin:
<uses-permission android:name="com.android.providers.tv.permission.WRITE_EPG_DATA" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED "/>
Uygulamanızın Google Play Store'da Android TV'de içerik kanalları sağlayan bir uygulama olarak göründüğünden emin olmak için aşağıdaki öğeyi ekleyin:
<uses-feature android:name="android.software.live_tv" android:required="true" />
Ardından, EpgSyncJobService
sınıfını genişleten bir sınıf oluşturun. Bu soyut sınıf, sistem veritabanında kanallar oluşturan ve güncelleyen bir iş hizmeti oluşturmayı kolaylaştırır.
Alt sınıfınızda, getChannels()
içinde kanallarınızın tam listesini oluşturun ve döndürün. Kanallarınız bir XMLTV dosyasından geliyorsa XmlTvParser
sınıfını kullanın. Aksi takdirde, kanalları Channel.Builder
sınıfını kullanarak programatik olarak oluşturun.
Sistem, her kanal için kanalda belirli bir zaman aralığında görüntülenebilecek bir program listesine ihtiyaç duyduğunda getProgramsForChannel()
özelliğini çağırır. Kanal için Program
nesnelerin listesini döndürün. Bir XMLTV dosyasından program almak için XmlTvParser
sınıfını kullanın veya Program.Builder
sınıfını kullanarak programları programlı bir şekilde oluşturun.
Her Program
nesnesi için programın video türü gibi program bilgilerini ayarlamak üzere bir InternalProviderData
nesnesi kullanın. Kanalın döngü halinde tekrar etmesini istediğiniz sınırlı sayıda programınız varsa programınızla ilgili bilgileri ayarlarken InternalProviderData.setRepeatable()
yöntemini true
değeriyle kullanın.
İş hizmetini uyguladıktan sonra uygulama manifest dosyanıza ekleyin:
<service android:name=".sync.SampleJobService" android:permission="android.permission.BIND_JOB_SERVICE" android:exported="true" />
Son olarak, bir kurulum etkinliği oluşturun. Kurulum etkinliğiniz, kanal ve program verilerini senkronize etmek için bir yöntem sağlamalıdır. Bunu yapmanın bir yolu da kullanıcının etkinlikteki kullanıcı arayüzü üzerinden bunu yapmasıdır. Ayrıca, etkinlik başladığında uygulamanın bu işlemi otomatik olarak yapmasını da sağlayabilirsiniz. Kurulum etkinliğinin kanal ve program bilgilerini senkronize etmesi gerektiğinde, uygulama iş hizmetini başlatmalıdır:
Kotlin
val inputId = getActivity().intent.getStringExtra(TvInputInfo.EXTRA_INPUT_ID) EpgSyncJobService.cancelAllSyncRequests(getActivity()) EpgSyncJobService.requestImmediateSync( getActivity(), inputId, ComponentName(getActivity(), SampleJobService::class.java) )
Java
String inputId = getActivity().getIntent().getStringExtra(TvInputInfo.EXTRA_INPUT_ID); EpgSyncJobService.cancelAllSyncRequests(getActivity()); EpgSyncJobService.requestImmediateSync(getActivity(), inputId, new ComponentName(getActivity(), SampleJobService.class));
İş hizmetini senkronize etmek için requestImmediateSync()
yöntemini kullanın. Kullanıcının senkronizasyonun tamamlanmasını beklemesi gerekir; bu nedenle istek sürenizi nispeten kısa tutmalısınız.
İş hizmetinin arka planda kanal ve program verilerini düzenli olarak senkronize etmesini sağlamak için setUpPeriodicSync()
yöntemini kullanın:
Kotlin
EpgSyncJobService.setUpPeriodicSync( context, inputId, ComponentName(context, SampleJobService::class.java) )
Java
EpgSyncJobService.setUpPeriodicSync(context, inputId, new ComponentName(context, SampleJobService.class));
TIF Tamamlayıcı Kitaplığı, kanal verilerinin milisaniye cinsinden süresini belirtmenize olanak tanıyan ek bir requestImmediateSync()
aşırı yükleme yöntemi sunar. Varsayılan yöntem bir saatlik
kanal verilerini senkronize eder.
TIF Tamamlayıcı Kitaplığı, senkronize edilecek kanal verilerinin süresini ve periyodik senkronizasyonun ne sıklıkta gerçekleşmesi gerektiğini belirtmenize olanak tanıyan ek bir setUpPeriodicSync()
aşırı yükleme yöntemini de sağlar. Varsayılan yöntem, her 12 saatte bir 48 saatlik kanal verilerini senkronize eder.
Kanal verileri ve EPG hakkında daha fazla bilgi için Kanal verileriyle çalışma bölümüne bakın.
İnce ayar isteklerini ve medya oynatmayı ele alma
Bir kullanıcı belirli bir kanalı seçtiğinde sistem TV uygulaması, istenen kanalı ayarlamak ve içeriği oynatmak için uygulamanız tarafından oluşturulan bir Session
kullanır. TIF Tamamlayıcı Kitaplığı, sistemden gelen kanal ve oturum çağrılarını işlemek için genişletebileceğiniz çeşitli sınıflar sunar.
BaseTvInputService
alt sınıfınız, ayar isteklerini işleyen oturumlar oluşturur. onCreateSession()
yöntemini geçersiz kılın, BaseTvInputService.Session
sınıfından uzatılmış bir oturum oluşturun ve yeni oturumunuzda super.sessionCreated()
yöntemini çağırın. Aşağıdaki örnekte onCreateSession()
, BaseTvInputService.Session
uzantısına sahip bir RichTvInputSessionImpl
nesnesi döndürür:
Kotlin
override fun onCreateSession(inputId: String): Session = RichTvInputSessionImpl(this, inputId).apply { setOverlayViewEnabled(true) }
Java
@Override public final Session onCreateSession(String inputId) { RichTvInputSessionImpl session = new RichTvInputSessionImpl(this, inputId); session.setOverlayViewEnabled(true); return session; }
Kullanıcı, kanallarınızdan birini izlemeye başlamak için sistemin TV uygulamasını kullandığında sistem, oturumunuzun onPlayChannel()
yöntemini çağırır. Program oynatılmaya başlamadan önce herhangi bir özel kanal başlatma işlemi yapmanız gerekiyorsa bu yöntemi geçersiz kılın.
Daha sonra sistem, o anda planlanmış programı edinir ve program bilgileri ile başlangıç zamanını milisaniye cinsinden belirterek oturumunuzun onPlayProgram()
yöntemini çağırır. Programı oynatmaya başlamak için TvPlayer
arayüzünü kullanın.
Medya oynatıcı kodunuz, belirli oynatma etkinliklerini işlemek için TvPlayer
işlemini uygulamalıdır. TvPlayer
sınıfı, BaseTvInputService
uygulamanızı karmaşık hale getirmeden zaman değiştirme denetimleri gibi özellikleri yönetir.
Oturumunuzun getTvPlayer()
yönteminde, TvPlayer
politikasını uygulayan medya oynatıcınızı döndürün.
TV Giriş Hizmeti örnek uygulaması, ExoPlayer kullanan bir medya oynatıcı uygular.
TV giriş çerçevesini kullanarak TV giriş hizmeti oluşturma
TV giriş hizmetiniz TIF Tamamlayıcı Kitaplığı'nı kullanamıyorsa aşağıdaki bileşenleri uygulamanız gerekir:
TvInputService
, TV girişi için uzun süreli ve arka planda kullanılabilirlik sağlarTvInputService.Session
, TV giriş durumunu korur ve barındırma uygulamasıyla iletişim kurarTvContract
, TV girişinde kullanılabilen kanalları ve programları açıklarTvContract.Channels
, bir TV kanalı hakkındaki bilgileri temsil ederTvContract.Programs
, program adı ve başlangıç zamanı gibi verilerle bir TV programını tanımlarTvTrackInfo
bir ses, video veya altyazı parçasını temsil ederTvContentRating
bir içerik derecelendirmesini tanımlar, özel içerik derecelendirmesi şemalarına olanak tanırTvInputManager
, sistem TV uygulamasına bir API sağlayıp TV girişleri ve uygulamalarla olan etkileşimi yönetir
Ayrıca aşağıdakileri yapmanız gerekir:
- TV giriş hizmetinizi, manifest'te TV giriş hizmetinizi bildirme bölümünde açıklandığı gibi manifest dosyasında tanımlayın.
- Hizmet meta veri dosyasını oluşturun.
- Kanal ve program bilgilerinizi oluşturup kaydedin.
- Kurulum etkinliğinizi oluşturun.
TV giriş hizmetinizi tanımlayın
Hizmetiniz için TvInputService
sınıfının süresini uzatırsınız. TvInputService
uygulaması, bağlı bir hizmettir. Burada sistem hizmeti ona bağlanan istemcidir. Uygulamanız gereken hizmet yaşam döngüsü yöntemleri Şekil 1'de gösterilmiştir.
onCreate()
yöntemi, sistem odaklı işlemleri işlemek için kullanıcı arayüzü iş parçacığından ayrı bir işlem iş parçacığı sağlayan HandlerThread
özelliğini başlatır ve başlatır. Aşağıdaki örnekte onCreate()
yöntemi, CaptioningManager
öğesini başlatır ve ACTION_BLOCKED_RATINGS_CHANGED
ile ACTION_PARENTAL_CONTROLS_ENABLED_CHANGED
işlemlerini işlemeye hazırlar. Bu işlemler, kullanıcı ebeveyn denetimi ayarlarını değiştirdiğinde ve engellenen derecelendirmeler listesinde bir değişiklik olduğunda tetiklenen sistem amaçlarını açıklar.
Kotlin
override fun onCreate() { super.onCreate() handlerThread = HandlerThread(javaClass.simpleName).apply { start() } dbHandler = Handler(handlerThread.looper) handler = Handler() captioningManager = getSystemService(Context.CAPTIONING_SERVICE) as CaptioningManager setTheme(android.R.style.Theme_Holo_Light_NoActionBar) sessions = mutableListOf<BaseTvInputSessionImpl>() val intentFilter = IntentFilter().apply { addAction(TvInputManager.ACTION_BLOCKED_RATINGS_CHANGED) addAction(TvInputManager.ACTION_PARENTAL_CONTROLS_ENABLED_CHANGED) } registerReceiver(broadcastReceiver, intentFilter) }
Java
@Override public void onCreate() { super.onCreate(); handlerThread = new HandlerThread(getClass() .getSimpleName()); handlerThread.start(); dbHandler = new Handler(handlerThread.getLooper()); handler = new Handler(); captioningManager = (CaptioningManager) getSystemService(Context.CAPTIONING_SERVICE); setTheme(android.R.style.Theme_Holo_Light_NoActionBar); sessions = new ArrayList<BaseTvInputSessionImpl>(); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(TvInputManager .ACTION_BLOCKED_RATINGS_CHANGED); intentFilter.addAction(TvInputManager .ACTION_PARENTAL_CONTROLS_ENABLED_CHANGED); registerReceiver(broadcastReceiver, intentFilter); }

Şekil 1.TvInputService yaşam döngüsü.
Engellenen içerikle çalışma ve ebeveyn denetimi sağlama hakkında daha fazla bilgi için
İçeriği kontrol etme bölümüne bakın. TV giriş hizmetinizde gerçekleştirmek isteyebileceğiniz sistem odaklı diğer işlemler için TvInputManager
bölümünü inceleyin.
TvInputService
, oynatıcı durumu değişikliklerini işlemek için Handler.Callback
uygulayan bir TvInputService.Session
oluşturur. onSetSurface()
ile TvInputService.Session
, video içeriğiyle Surface
ayarlar. Video oluşturmak için Surface
ile çalışma hakkında daha fazla bilgi almak isterseniz Oynatıcıyı yüzeyle entegre etme bölümüne bakın.
Kullanıcı bir kanal seçtiğinde TvInputService.Session
, onTune()
etkinliğini işler ve sistem TV uygulamasına içerik ve içerik meta verilerindeki değişiklikleri bildirir. Bu notify()
yöntemleri bu eğitimin ilerleyen bölümlerinde
İçeriği Kontrol Etme ve Kanal seçimini işleme konularında açıklanmıştır.
Kurulum etkinliğinizi tanımlama
Sistem TV uygulaması, TV girişiniz için tanımladığınız kurulum etkinliğiyle çalışır. Kurulum etkinliği zorunludur ve sistem veritabanı için en az bir kanal kaydı sağlamalıdır. Sistem TV uygulaması, TV girişi için bir kanal bulamadığında kurulum etkinliğini çağırır.
Kurulum etkinliği, Kanal verilerini oluşturma ve güncelleme adlı bir sonraki derste gösterildiği gibi, kanalların TV girişi aracılığıyla kullanıma sunulduğu TV uygulamasına sistemi açıklar.