Android TV 채널 만들기

생방송 TV 프로그램 및 기타 연속 채널 기반 콘텐츠를 보는 것은 TV 경험의 중요한 부분입니다. 사용자는 채널 탐색을 통해 TV에서 프로그램을 선택하고 시청하는 데 익숙합니다. TV 입력 프레임 워크는 TV 프로그래밍 가이드에서 비디오 또는 음악 컨텐트를 게시하기위한 채널을 만듭니다.

참고 : TV 입력 프레임 워크는 Android 시스템 TV 앱의 채널을 만드는 데 OEM에서 사용하기위한 것입니다. Android 5.0 (API 레벨 21)에서 Android 7.1 (API 레벨 25)을 통해서만 지원됩니다. 타사 앱은 Android TV 홈 화면 API를 사용하여 콘텐츠 채널을 구축해야합니다. 자세한 내용  TV 콘텐츠 추천 을 참조하십시오.

TV 입력 프레임 워크는 HDMI 포트 및 내장 튜너와 같은 하드웨어 소스 및 인터넷을 통해 스트리밍 된 비디오와 같은 소프트웨어 소스에서 라이브 비디오 컨텐츠를 수신하고 재생하는 통일 된 방법을 제공합니다.

이 프레임 워크를 통해 개발자는 TV 입력 서비스를 구현하여 라이브 TV 입력 소스를 정의 할 수 있습니다. 이 서비스는 TV 공급자에게 채널 및 프로그램 목록을 게시합니다. TV 장치의 라이브 TV 앱은 TV 공급자로부터 사용 가능한 채널 및 프로그램 목록을 가져 와서 사용자에게 표시합니다. 사용자가 특정 채널을 선택하면, 라이브 TV 앱은 TV 입력 관리자를 통해 연관된 TV 입력 서비스에 대한 세션을 생성하고, TV 입력 서비스에 요청 된 채널을 튜닝하고, 사용자가 제공 한 디스플레이 표면으로 콘텐츠를 재생하도록 지시한다 TV 앱.

그림 1. TV 입력 프레임 워크의 기능적 다이어그램

TV 입력 프레임 워크는 다양한 라이브 TV 입력 소스에 대한 액세스를 제공하고 사용자가 콘텐츠를 검색,보고 및 감상 할 수 있도록 단일 사용자 인터페이스에서 함께 가져올 수 있도록 설계되었습니다. 콘텐츠 용 TV 입력 서비스를 구축하면 TV 장치에서 더 쉽게 액세스 할 수 있습니다.

TV 입력 서비스 샘플 앱을 사용해보십시오 .

토픽

TV 입력 서비스 개발시스템 TV 앱과 함께 작동하는 TV 입력 서비스를 개발하는 방법에 대해 알아보십시오.채널 데이터로 작업시스템의 채널 및 프로그램 데이터를 설명하는 방법을 익히십시오.사용자 상호 작용 관리오버레이를 표시하고, 콘텐츠 가용성을 관리하고, 콘텐츠 선택을 처리하는 방법에 대해 알아보십시오.시간 이동 지원TV 입력 서비스에서 시간 이동을 지원하는 방법에 대해 알아보십시오.콘텐츠 레코딩 지원TV 입력 서비스에서 콘텐츠 레코딩을 지원하는 방법에 대해 알아보십시오.

 

https://developer.android.com/training/tv/tif

 

TIF를 사용한 샘플 Android TV 채널 앱 (TV 입력)

이 앱은 TIF (TV Input Framework)를 사용하여 Android TV 용 라이브 TV 채널 앱을 제작하는 방법을 보여줍니다. 샘플은 일단 설치되면 기본 TV 앱 (예 : 라이브 채널 앱)에서 인식되고 실행되는 서비스입니다.

소개

샘플 앱은 하나의 TV 입력으로 구성됩니다. MP4 동영상, HLS 스트림 및 MPEG-DASH 스트림으로 구성된 4 개 채널로 다양한 장르로 구성됩니다. 동영상 파일은 Google Cloud Storage에서 제공됩니다.

참조 및 개발자 가이드

TIF 도우미 라이브러리

이 응용 프로그램은 TIF 도우미 라이브러리를 사용합니다 . 라이브러리의 소스 코드가 library디렉토리에 있습니다. 프로젝트에서이 라이브러리를 사용하려면 디렉토리를 복사하거나 다음과 같은 Gradle 종속성을 사용하십시오.

compile 'com.google.android.libraries.tv:companionlibrary:0.4.1'

사전 요구 사항

시작하기

하나 이상의 TV 입력 서비스 또는 HDMI1과 같은 실제 입력이 없으면 라이브 채널 앱이 집 화면의 앱에 표시되지 않습니다.

TV 입력을 설정하려면,

  • 라이브 채널 앱 시작
  • 검색을 클릭하여 채널을 검색하고 추가하십시오.
  • 또는 라이브 채널 앱에서,
    • 최근 채널을 가져 오려면 ENTER를 클릭하십시오.
    • TV 옵션을 입력하려면 아래쪽을 클릭하십시오.
    • 채널 소스를 오른쪽 클릭하고 선택하십시오.
    • 서식있는 입력을 선택하려면 아래쪽을 클릭하고 선택하려면 Enter를 클릭하십시오.
    • 채널 추가를 클릭하여 MP4 동영상, HLS 스트림 및 MPEG-DASH 스트림의 채널을 추가하십시오.
  • 샘플 채널을 시청하려면 간단히 UP과 DOWN을 전환하여 채널을 전환하십시오
  • 채널 소스 -> 서식있는 입력 -> 설정을 방문하여 입력 설정에 대한 모의 옵션을 확인하십시오.

스크린 샷

 

지원하다

특허

Apache 2.0 라이센스에 따른 라이센스. 자세한 내용은 LICENSE 파일을 참조하십시오.

기부금을 어떻게 내는가?

CONTRIBUTING.md의 단계를 읽고 따르십시오.

주의

이 샘플에서 사용 된 이미지 / 비디오는 블렌더 재단이 저작권이나 크리에이티브 커먼즈 라이센스하에 공유 한 것입니다.

  • 코끼리의 꿈 : (c) 저작권 2006, 블렌더 재단 / 네덜란드 미디어 아트 인스티튜트 / www.elephantsdream.org
  • Sintel : (c) 저작권 Blender Foundation | www.sintel.org
  • 눈물의 강철 : (CC) 블렌더 파운데이션 | mango.blender.org
  • Big Buck Bunny : (c) copyright 2008, 블렌더 파운데이션 / www.bigbuckbunny.org

 

https://github.com/googlesamples/androidtv-sample-inputs

 

googlesamples/androidtv-sample-inputs

Sample Channel App (TV Input Service) on Android TV using TIF - googlesamples/androidtv-sample-inputs

github.com

https://developer.android.com/reference/android/media/tv/package-summary.html

 

android.media.tv  |  Android Developers

Content and code samples on this page are subject to the licenses described in the Content License. Java is a registered trademark of Oracle and/or its affiliates.

developer.android.com

Develop a TV input service

A TV input service represents a media stream source, and lets you present your media content in a linear, broadcast TV fashion as channels and programs. With a TV input service, you can provide parental controls, program guide information, and content ratings. The TV input service works with the Android system TV app. This app ultimately controls and presents channel content on the TV. The system TV app is developed specifically for the device and immutable by third-party apps. For more information about the TV Input Framework (TIF) architecture and its components, see TV Input Framework.

Create a TV input service using the TIF Companion Library

The TIF Companion Library is a framework that provides extensible implementations of common TV input service features. Use the TIF Companion Library to quickly and easily create your own TV input service that follows best practices for Android TV.

Update your project

To get started using the TIF Companion Library, add the following to your app’s build.gradle file:

compile 'com.google.android.libraries.tv:companionlibrary:0.2'

 

The TIF Companion Library is not currently part of the Android framework. It is distributed as a Gradle dependency through jcenter, not with the Android SDK. Check jcenter to find the latest version of the tif-companion library.

Declare your TV input service in the manifest

Your app must provide a TvInputService-compatible service that the system uses to access your app. The TIF Companion Library provides the BaseTvInputService class, which provides a default implementation of TvInputService that you can customize. Create a subclass of BaseTvInputService, and declare the subclass in your manifest as a service.

Within the manifest declaration, specify the BIND_TV_INPUT permission to allow the service to connect the TV input to the system. A system service performs the binding and has the BIND_TV_INPUT permission. The system TV app sends requests to TV input services via the TvInputManager interface.

In your service declaration, include an intent filter that specifies TvInputService as the action to perform with the intent. Also declare the service metadata as a separate XML resource. The service declaration, intent filter, and service metadata declaration are shown in the following example:

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

 

Define the service metadata in a separate XML file. The service metadata XML file must include a setup interface that describes the TV input's initial configuration and channel scan. The metadata file should also contain a flag stating whether or not users are able to record content. For more information on how to support recording content in your app, see TV recording.

The service metadata file is located in the XML resources directory for your app and must match the name of the resource you declared in the manifest. Using the manifest entries from the previous example, you would create the XML file at res/xml/richtvinputservice.xml, with the following contents:

<?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" />

 

Define channels and create your setup activity

Your TV input service must define at least one channel that users access via the system TV app. You should register your channels in the system database, and provide a setup activity that the system invokes when it cannot find a channel for your app.

First, enable your app to read from and write to the system Electronic Programming Guide (EPG), whose data includes channels and programs available to the user. To enable your app to perform these actions, and sync with the EPG after device restart, add the following elements to your app manifest:

<uses-permission android:name="com.android.providers.tv.permission.READ_EPG_DATA" />
<uses-permission android:name="com.android.providers.tv.permission.WRITE_EPG_DATA" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED "/>

 

Add the following element to ensure that your app shows up in the Google Play Store as an app that provides content channels in Android TV:

<uses-feature
   
android:name="android.software.live_tv"
   
android:required="true" />

 

Next, create a class which extends the EpgSyncJobService class. This abstract class makes it easy to create a job service that creates and updates channels in the system database.

In your subclass, create and return your full list of channels in getChannels(). If your channels come from an XMLTV file, use the XmlTvParser class. Otherwise generate channels programmatically using the Channel.Builder class.

For each channel, the system calls getProgramsForChannel() when it needs a list of programs that can be viewed within a given time window on the channel. Return a list of Program objects for the channel. Use the XmlTvParserclass to obtain programs from an XMLTV file, or generate them programmatically using the Program.Builder class.

For each Program object, use an InternalProviderData object to set program information such as the program's video type. If you only have a limited number of programs that you want the channel to repeat in a loop, use theInternalProviderData.setRepeatable() method with a value of true when setting information about your program.

After you've implemented the job service, add it to your app manifest:

<service
   
android:name=".sync.SampleJobService"
   
android:permission="android.permission.BIND_JOB_SERVICE"
   
android:exported="true" />

 

Finally, create a setup activity. Your setup activity should provide a way to sync channel and program data. One way to do this is for the user to do it via the UI in the activity. You might also have the app do it automatically when the activity starts. When the setup activity needs to sync channel and program info, the app should start the job service:

KOTLINJAVA

val inputId = getActivity().intent.getStringExtra(TvInputInfo.EXTRA_INPUT_ID)
EpgSyncJobService.cancelAllSyncRequests(getActivity())
EpgSyncJobService.requestImmediateSync(
        getActivity
(),
        inputId
,
       
ComponentName(getActivity(), SampleJobService::class.java)
)

 

Use the requestImmediateSync() method to sync the job service. The user must wait for the sync to finish, so you should keep your request period relatively short.

Use the setUpPeriodicSync() method to have the job service periodically sync channel and program data in the background:

KOTLINJAVA

EpgSyncJobService.setUpPeriodicSync(
        context
,
        inputId
,
       
ComponentName(context, SampleJobService::class.java)
)

 

The TIF Companion Library provides an additional overloaded method of requestImmediateSync() that lets you specify the duration of channel data to sync in milliseconds. The default method syncs one hour's worth of channel data.

The TIF Companion Library also provides an additional overloaded method of setUpPeriodicSync() that lets you specify the duration of channel data to sync, and how often the periodic sync should occur. The default method syncs 48 hours of channel data every 12 hours.

For more details about channel data and the EPG, see Work with channel data.

Handle tuning requests and media playback

When a user selects a specific channel, the system TV app uses a Session, created by your app, to tune to the requested channel and play content. The TIF Companion Library provides several classes you can extend to handle channel and session calls from the system.

Your BaseTvInputService subclass creates sessions which handle tuning requests. Override theonCreateSession() method, create a session extended from the BaseTvInputService.Session class, and callsuper.sessionCreated() with your new session. In the following example, onCreateSession() returns aRichTvInputSessionImpl object that extends BaseTvInputService.Session:

KOTLINJAVA

override fun onCreateSession(inputId: String): Session =
       
RichTvInputSessionImpl(this, inputId).apply {
            setOverlayViewEnabled
(true)
       
}

 

When the user uses the system TV app to start viewing one of your channels, the system calls your session's onPlayChannel() method. Override this method if you need to do any special channel initialization before the program starts playing.

The system then obtains the currently scheduled program and calls your session's onPlayProgram() method, specifying the program information and start time in milliseconds. Use the TvPlayer interface to start playing the program.

Your media player code should implement TvPlayer to handle specific playback events. The TvPlayer class handles features like time-shifting controls without adding complexity to your BaseTvInputService implementation.

In your session's getTvPlayer() method, return your media player that implements TvPlayer. The TV Input Service sample app implements a media player that uses ExoPlayer.

Create a TV input service using the TV input framework

If your TV input service can't use the TIF Companion Library, you need to implement the following components:

  • TvInputService provides long-running and background availability for the TV input
  • TvInputService.Session maintains the TV input state and communicates with the hosting app
  • TvContract describes the channels and programs available to the TV input
  • TvContract.Channels represents information about a TV channel
  • TvContract.Programs describes a TV program with data such as program title and start time
  • TvTrackInfo represents an audio, video, or subtitle track
  • TvContentRating describes a content rating, allows for custom content rating schemes
  • TvInputManager provides an API to the system TV app and manages the interaction with TV inputs and apps

You also need to do the following:

  1. Declare your TV input service in the manifest, as described in Declare your TV input service in the manifest.
  2. Create the service metadata file.
  3. Create and register your channel and program information.
  4. Create your setup activity.

Define your TV input service

Figure 1.TvInputService lifecycle.

For your service, you extend the TvInputService class. A TvInputServiceimplementation is a bound service where the system service is the client that binds to it. The service life cycle methods you need to implement are illustrated in figure 1.

The onCreate() method initializes and starts the HandlerThread which provides a process thread separate from the UI thread to handle system-driven actions. In the following example, the onCreate() method initializes the CaptioningManager and prepares to handle the ACTION_BLOCKED_RATINGS_CHANGED and ACTION_PARENTAL_CONTROLS_ENABLED_CHANGED actions. These actions describe system intents fired when the user changes the parental control settings, and when there is a change on the list of blocked ratings.

KOTLINJAVA

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)
}

 

See Control content for more information about working with blocked content and providing parental control. See TvInputManager for more system-driven actions that you may want to handle in your TV input service.

The TvInputService creates a TvInputService.Session that implements Handler.Callback to handle player state changes. With onSetSurface(), the TvInputService.Session sets the Surface with the video content. See Integrate player with surface for more information about working with Surface to render video.

The TvInputService.Session handles the onTune() event when the user selects a channel, and notifies the system TV app for changes in the content and content metadata. These notify() methods are described in Control Contentand Handle track selection further in this training.

Define your setup activity

The system TV app works with the setup activity you define for your TV input. The setup activity is required and must provide at least one channel record for the system database. The system TV app invokes the setup activity when it cannot find a channel for the TV input.

The setup activity describes to the system TV app the channels made available through the TV input, as demonstrated in the next lesson, Create and update channel data.

Additional references

 

https://developer.android.com/training/tv/tif/tvinput.html

 

Develop a TV input service  |  Android Developers

A TV input service represents a media stream source, and lets you present your media content in a linear, broadcast TV fashion as channels and programs. With a TV input service, you can provide parental controls, program guide information, and content rati

developer.android.com

 

+ Recent posts