TV giriş hizmeti, bir medya akış kaynağını temsil eder ve medya içeriğinizi TV modasını doğrusal, kanallar ve programlar halinde yayınlamaya odaklanıyor. TV giriş hizmetiyle şunları sağlayabilirsiniz: ebeveyn denetimleri, program rehberi bilgileri ve içerik derecelendirmeleri TV giriş hizmeti çalışıyor yapabilirsiniz. Bu uygulama, nihayetinde kanal içeriğini kontrol eder ve sunar TV'de. Sistem TV uygulaması, cihaz için özel olarak geliştirilmiştir ve üçüncü taraf uygulamalar tarafından sağlanıyor. TV Giriş Çerçevesi (TIF) hakkında daha fazla bilgi hakkında daha fazla bilgi edinmek için TV Girişi Çerçevesi.
TIF Tamamlayıcı Kitaplığı'nı kullanarak TV giriş hizmeti oluşturma
TIF Tamamlayıcı Kitaplığı, bir kullanıcı tarafından oluşturulan Yaygın TV giriş hizmeti özelliklerinin uygulamaları. OEM'ler tarafından aşağıdaki amaçlarla kullanılmak üzere tasarlanmıştır: kanallar.
Projenizi güncelleyin
TIF Tamamlayıcı Kitaplığı, OEM'lerin eski kullanımına yönelik androidtv-ornek-girişleri depodur. Kitaplığı bir uygulamaya nasıl ekleyeceğinizle ilgili örnek için ilgili depoya göz atın.
TV giriş hizmetinizi manifest dosyasında bildirin
Uygulamanız TvInputService
uyumlu bir tarayıcı sağlamalıdır
bir hizmetten yararlanırsınız. TIF
Tamamlayıcı Kitaplık, BaseTvInputService
sınıfını sağlar.
TvInputService
öğesinin varsayılan uygulamasını sağlar
bunları özelleştirebilirsiniz. BaseTvInputService
alt sınıfı oluşturun,
ve manifest dosyanızdaki alt sınıfı hizmet olarak bildirin.
Manifest bildiriminde
BIND_TV_INPUT
izni
hizmeti kullanmasını öneririm. Sistem hizmeti
bağlama işlemini gerçekleştirir ve
BIND_TV_INPUT
izni.
Sistem TV uygulaması, istekleri TV giriş hizmetlerine gönderir
TvInputManager
arayüzü üzerinden.
Hizmet beyanınıza şunu belirten bir intent filtresi ekleyin:
TvInputService
isteyebilirsiniz. Ayrıca, hizmet meta verilerini ayrı bir XML kaynağı olarak bildirin. İlgili içeriği oluşturmak için kullanılan
hizmet bildirimi, amaç filtresi ve hizmet meta veri beyanı gösteriliyor
aşağıdaki örnekte:
<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 kimliğini açıklayan bir kurulum arayüzü içermelidir. ilk yapılandırma ve kanal tarama. Meta veri dosyası ayrıca Kullanıcıların içerik kaydedip kaydedemeyeceğini belirten bir işaret. Daha fazla uygulamanızda içerik kaydetmeyi nasıl destekleyeceğiniz hakkında bilgiler için İçerik kaydını destekleyin.
Hizmet meta veri dosyası, XML kaynakları dizininde bulunur.
ve
manifest'ini kullanabilirsiniz. Önceki örnekteki manifest girişlerini kullanarak
XML dosyasını res/xml/richtvinputservice.xml
konumunda
şu içerikler:
<?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şilebilir. Kanallarınızı kaydetmeniz gerekir. sistem veritabanını yükleyebilir ve sistemin uygulamanız için bir kanal bulamadığında çağrı yapar.
İlk olarak, uygulamanızın Elektronik sistemden okuma ve sisteme yazmasını sağlayın Verileri, mevcut kanalları ve programları içeren Programlama Rehberi (EPG) kullanıcıya gösterir. Uygulamanızın bu işlemleri gerçekleştirmesini ve EPG, cihaz yeniden başlatıldıktan sonra uygulama manifestinize aşağıdaki öğeleri 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 şurada görünmesini sağlamak için aşağıdaki öğeyi ekleyin: Google Play Store, Android TV'de içerik kanalları sağlayan bir uygulama olarak:
<uses-feature android:name="android.software.live_tv" android:required="true" />
Sonra, EpgSyncJobService
öğesini genişleten bir sınıf oluşturun
sınıfını kullanır. Bu soyut sınıf, geliştirebileceğiniz bir iş hizmeti
sistem veritabanında kanallar oluşturur ve günceller.
Alt sınıfınızda, kanallarınızın tam listesini şurada oluşturun ve döndürün:
getChannels()
Kanallarınız bir XMLTV dosyasından geliyorsa
XmlTvParser
sınıfını kullanma. Aksi takdirde
kanalları programatik olarak Channel.Builder
sınıfını kullanarak izler.
Sistem, her kanal için getProgramsForChannel()
yöntemini çağırır.
belirli bir zaman diliminde görüntülenebilecek programların listesine ihtiyaç duyduğunda
teşekkür ederiz. Şu öğe için Program
nesne listesini döndürün:
yardımcı olur. Şu kaynaktan program almak için XmlTvParser
sınıfını kullanın:
XMLTV dosyası oluşturabilir veya
Program.Builder
sınıf.
Her Program
nesnesi için bir
Şunun gibi program bilgilerini ayarlamak için InternalProviderData
nesnesi:
programın video türünü seçin. Sınırlı sayıda izlemek istediğiniz
kanalın bir döngü içinde tekrarlanmasını istiyorsanız
Şu değere sahip InternalProviderData.setRepeatable()
yöntemi:
Programınızla ilgili bilgileri ayarlarken true
.
İş hizmetini uyguladıktan sonra, uygulama manifestinize ekleyin:
<service android:name=".sync.SampleJobService" android:permission="android.permission.BIND_JOB_SERVICE" android:exported="true" />
Son olarak, kurulum etkinliği oluşturun. Kurulum etkinliğiniz senkronize edebilirsiniz. Bunu yapmanın bir yolu da kullanıcının kullanıcı arayüzü üzerinden. Uygulamanın bunu otomatik olarak da yapmasını sağlayabilirsiniz. Etkinlik başladığında. Kurulum etkinliğinin kanal ve ayar verilerini 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));
Senkronizasyon için requestImmediateSync()
yöntemini kullanın
iş hizmetine dahil oluyor. Kullanıcının senkronizasyonun tamamlanmasını beklemesi gerektiğinden
talep sürenizi nispeten kısa tutun.
İş hizmetinden yararlanmak için setUpPeriodicSync()
yöntemini kullanın
Kanal ve program verilerini arka planda düzenli aralıklarla senkronize edin:
Kotlin
EpgSyncJobService.setUpPeriodicSync( context, inputId, ComponentName(context, SampleJobService::class.java) )
Java
EpgSyncJobService.setUpPeriodicSync(context, inputId, new ComponentName(context, SampleJobService.class));
TIF Tamamlayıcı Kitaplığı,
Süreyi belirtebileceğiniz requestImmediateSync()
milisaniye cinsinden senkronize edilecek kanal verileri. Varsayılan yöntem, bir saat içindeki
ne kadarının olduğunu öğreneceksiniz.
TIF Tamamlayıcı Kitaplığı,
Süreyi belirtebileceğiniz setUpPeriodicSync()
senkronize edilecek kanal verileri ve düzenli senkronizasyonun ne sıklıkta yapılması gerektiği. İlgili içeriği oluşturmak için kullanılan
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ışın.
Ayarlama isteklerini ve medya oynatmayı işleme
Kullanıcı belirli bir kanalı seçtiğinde sistem TV uygulaması
İstenen kanalı ayarlamak için uygulamanız tarafından oluşturulan Session
ve içerikleri oynatın. TIF Tamamlayıcı Kitaplığı,
kanal ve oturum çağrılarını sistemden yönetmek için genişletebileceğiniz sınıfları.
BaseTvInputService
alt sınıfınız, aşağıdakileri içeren oturumlar oluşturur:
ayarlama istekleri. Geçersiz kıl
onCreateSession()
yöntemi,
BaseTvInputService.Session
sınıfını ve
Yeni oturumunuzda super.sessionCreated()
. Sonraki
örneğin, onCreateSession()
şunu döndürür:
Uzanan RichTvInputSessionImpl
nesne
BaseTvInputService.Session
:
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 görüntülemeye başlamak için sistem TV uygulamasını kullandığında
sistem, oturumunuzun onPlayChannel()
yöntemini çağırır. Geçersiz kıl
Bu yöntemden önce özel bir kanal başlatma işlemi gerçekleştirmeniz,
program oynatılmaya başlar.
Ardından sistem, o sırada planlanmış olan programı alır ve sizi
oturumun onPlayProgram()
yöntemi, programı belirtir
bilgileri ve başlangıç zamanını milisaniye cinsinden ayarlayın. Şunu kullanın:
TvPlayer
arayüzü ile programı oynatmaya başlayın.
Medya oynatıcı kodunuzda TvPlayer
uygulanmalıdır
belirli oynatma etkinlikleri olabilir. TvPlayer
sınıfı özellikleri işler.
gibi zaman kaydırma kontrolleri gibi, zaman kaydırma kontrolleri gibi
BaseTvInputService
uygulanması.
Oturumunuzun getTvPlayer()
yönteminde şunu döndürün:
TvPlayer
uygulayan medya oynatıcınız. İlgili içeriği oluşturmak için kullanılan
TV Giriş Hizmeti örnek uygulaması,
ExoPlayer'ı seçin.
TV giriş çerçevesini kullanarak bir TV giriş hizmeti oluşturma
TV giriş hizmetiniz TIF Tamamlayıcı Kitaplığı'nı kullanamıyorsa şunları yapmanız gerekir: aşağıdaki bileşenleri uygulamak için:
TvInputService
, şunlar için uzun süreli ve arka planda kullanılabilirlik sağlar: TV girişiTvInputService.Session
, TV giriş durumunu korur ve iletişim kurar barındırma uygulamasıylaTvContract
, TV'de kullanılabilen kanalları ve programları açıklar. girişTvContract.Channels
, bir TV kanalıyla ilgili bilgileri temsil ederTvContract.Programs
, program gibi verilere sahip bir TV programını tanımlar başlık ve başlangıç zamanıTvTrackInfo
bir ses, video veya altyazı parçasını temsil ederTvContentRating
bir içerik derecelendirmesini tanımlar ve özel içeriğe izin verir derecelendirme şemalarıTvInputManager
, sistem TV uygulamasına bir API sağlar ve TV girişleri ve uygulamalarla etkileşim
Ayrıca aşağıdakileri de yapmanız gerekir:
- TV giriş hizmetinizi manifest dosyasında şu şekilde tanımlayın: TV giriş hizmetinizi manifesto içinde yeniden etkinleştirilmelidir.
- 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ı uzatıyorsunuz. CEVAP
TvInputService
uygulaması,
sistem hizmetinin, çalıştığı bağlı hizmet
ona bağlı olan istemcidir. Hizmet yaşam döngüsü yöntemleri
Şekil 1'de gösterilmiştir.
onCreate()
yöntemi başlatılır ve
Kullanıcı arayüzü iş parçacığından farklı bir işlem iş parçacığı sağlayan HandlerThread
sistem odaklı işlemler yapma. Aşağıdaki örnekte, onCreate()
yöntemi, CaptioningManager
öğesini başlatır ve
ACTION_BLOCKED_RATINGS_CHANGED
ve ACTION_PARENTAL_CONTROLS_ENABLED_CHANGED
işlem. Bu
İşlemler, kullanıcı ebeveyn denetimi ayarlarını değiştirdiğinde tetiklenen sistem amaçlarını açıklar
Engellenen puanlar listesinde değişiklik olduğunda.
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); }
![](https://developer.android.com/static/images/tv/tvinput-life.png?authuser=0000&hl=tr)
Şekil 1.TvInputService yaşam döngüsü.
Bkz.
Engellenen içerikle çalışma ve güvenli içerik sağlama hakkında daha fazla bilgi için içeriği kontrol edin
ebeveyn denetimi Aşağıdaki sistem odaklı işlemler için TvInputManager
politikasına bakın:
bunu TV giriş hizmetiniz için yapabilirsiniz.
TvInputService
,
Handler.Callback
özelliğini uygulayan TvInputService.Session
kullanabilirsiniz. Entegre
onSetSurface()
,
TvInputService.Session
, Surface
öğesini
video içeriği. Oynatıcıyı yüzeye entegre etme bölümüne bakın.
Surface
ile çalışma hakkında daha fazla bilgi edinin.
TvInputService.Session
,
onTune()
Kullanıcı bir kanal seçtiğinde ve içerikteki değişiklikler konusunda sistem TV uygulamasını bilgilendirdiğinde ve
içerik meta verileridir. Bu notify()
yöntemleri şurada açıklanmıştır:
İçeriği kontrol etme ve Parça seçimini yönetme
daha fazla bilgi edineceksiniz.
Kurulum etkinliğinizi tanımlama
Sistem TV uygulaması, TV girişiniz için tanımladığınız kurulum etkinliğiyle çalışır. İlgili içeriği oluşturmak için kullanılan kurulum etkinliği gereklidir ve sistem veritabanı için en az bir kanal kaydı sağlamalıdır. İlgili içeriği oluşturmak için kullanılan sistem TV uygulaması, TV girişi için bir kanal bulamadığında kurulum etkinliğini çağırır.
Kurulum etkinliği, kanalların TV üzerinden kullanılabilir hale getirdiği sistem TV uygulamasını açıklar. bir sonraki derste gösterildiği gibi, Oluşturma ve kanal verilerini güncelleyebilirsiniz.