TV giriş hizmeti geliştirme

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şi
  • TvInputService.Session, TV giriş durumunu korur ve iletişim kurar barındırma uygulamasıyla
  • TvContract, TV'de kullanılabilen kanalları ve programları açıklar. giriş
  • TvContract.Channels, bir TV kanalıyla ilgili bilgileri temsil eder
  • TvContract.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 eder
  • TvContentRating 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:

  1. TV giriş hizmetinizi manifest dosyasında şu şekilde tanımlayın: TV giriş hizmetinizi manifesto içinde yeniden etkinleştirilmelidir.
  2. Hizmet meta veri dosyasını oluşturun.
  3. Kanal ve program bilgilerinizi oluşturup kaydedin.
  4. 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);
}

Ş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.

Ek referanslar