추천 채널에 콘텐츠 표시

Android TV 홈 화면 또는 홈 화면 은 권장 콘텐츠를 채널 및 프로그램 테이블로 표시하는 UI를 제공 합니다 . 각 행은 채널입니다. 채널에는 해당 채널에서 사용할 수있는 모든 프로그램의 카드가 있습니다.


TV 홈 화면

이 문서는 홈 화면에 채널과 프로그램을 추가하고, 콘텐츠를 업데이트하고, 사용자 작업을 처리하고, 사용자에게 최상의 경험을 제공하는 방법을 보여줍니다. (API에 대해 더 자세히 알고 싶다면 홈 화면 코드 랩을 시도 하고 I / O 2017 Android TV 세션을 시청하십시오 .)

참고 : 추천 채널은 Android 8.0 (API 레벨 26) 이상에서만 사용할 수 있습니다. Android 8.0 (API 레벨 26) 이상에서 실행되는 앱에 대한 권장 사항을 제공하려면이 코드를 사용해야합니다. 이전 버전의 Android에서 실행되는 앱에 대한 권장 사항을 제공하려면 앱에서 추천 행을 대신 사용해야합니다 .

홈 스크린 UI


앱은 새로운 채널을 만들고 채널에서 프로그램을 추가, 제거 및 업데이트하고 채널에서 프로그램의 순서를 제어 할 수 있습니다. 예를 들어 앱은 '새로운 기능'이라는 채널을 만들고 새로 사용 가능한 프로그램에 대한 카드를 보여줄 수 있습니다.

앱은 채널이 홈 화면에 표시되는 순서를 제어 할 수 없습니다. 앱이 새 채널을 만들면 홈 스크린이 채널 목록의 맨 아래에 채널을 추가합니다. 사용자는 채널을 재정렬, 숨기기 및 표시 할 수 있습니다.

다음 채널보기

홈 화면에 나타나는 첫 번째 채널에는 '다음보기'라는 라벨이 지정됩니다. 시스템은이 채널을 생성하고 유지 관리합니다. 앱에서이 채널을 이동, 제거 또는 숨길 수 없습니다. 이 채널에 프로그램을 추가 할 수 있습니다. 예를 들어 사용자가 재미 있다고 표시하거나 중간에 시청을 중단 한 프로그램 또는 사용자가보고있는 콘텐츠와 관련된 프로그램 (예 : 프로그램의 다음 시즌 또는 다음 에피소드) .

앱 채널

앱에서 만드는 채널은 모두 다음 라이프 사이클을 따릅니다.

  1. 사용자가 앱의 채널을 검색하여 홈 화면에 추가하도록 요청합니다.
  2. 앱이 채널을 생성하고 채널에 추가합니다 TvProvider(이 시점에서는 채널이 표시되지 않음).
  3. 앱이 시스템에 채널을 표시하도록 요청합니다.
  4. 시스템에서 사용자에게 새 채널을 승인하도록 요청합니다.
  5. 새 채널이 홈 화면의 마지막 행에 나타납니다.

기본 채널

앱에서 사용자가 홈 화면에 추가 할 수있는 모든 채널을 제공 할 수 있습니다. 사용자는 일반적으로 홈 스크린에 나타나기 전에 각 채널을 선택하고 승인해야합니다. 모든 앱에는 하나의 기본 채널 을 만들 수있는 옵션이 있습니다. 기본 채널은 홈 화면에 자동으로 나타나기 때문에 특별합니다. 사용자는 명시 적으로 요청할 필요가 없습니다.

선결 요건


Android TV 홈 화면은 Android TvProviderAPI를 사용하여 앱에서 만드는 채널과 프로그램을 관리합니다. 공급자의 데이터에 액세스하려면 앱의 매니페스트에 다음 권한을 추가하십시오.

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

TvProvider지원 라이브러리는 쉽게 공급자를 사용 할 수 있습니다. build.gradle파일 의 종속성에 추가 하십시오.

compile 'com.android.support:support-tv-provider:27.0.0'

채널과 프로그램을 사용하려면 프로그램에 다음과 같은 지원 라이브러리 가져 오기를 포함해야합니다.

import android.support.media.tv.Channel;
import android.support.media.tv.TvContractCompat;
import android.support.media.tv.ChannelLogoUtils;
import android.support.media.tv.PreviewProgram;
import android.support.media.tv.WatchNextProgram;

채널


앱에서 만드는 첫 번째 채널이 기본 채널이됩니다. 기본 채널이 홈 화면에 자동으로 나타납니다. 사용자가 만든 다른 모든 채널은 홈 화면에 나타나기 전에 사용자가 선택하고 수락해야합니다.

채널 만들기

앱이 포 그라운드에서 실행될 때만 새로 추가 된 채널을 표시하도록 시스템에 요청해야합니다. 이렇게하면 사용자가 다른 앱을 실행하는 동안 채널 추가 승인 대화 상자가 앱에 표시되지 않습니다. 백그라운드에서 실행 중일 때 채널을 추가하려고하면 활동의 onActivityResult()메소드가 상태 코드를 반환합니다 RESULT_CANCELED.

채널을 만들려면 다음 단계를 따르십시오.

  1. 채널 빌더를 만들고 속성을 설정하십시오.

    Channel.Builder builder = new Channel.Builder();
    // Every channel you create must have the type `TYPE_PREVIEW`
    builder
    .setType(TvContractCompat.Channels.TYPE_PREVIEW)
           
    .setDisplayName("Channel Name")
           
    .setAppLinkIntentUri(uri);

    채널 유형은이어야합니다 TYPE_PREVIEW필요에 따라 더 많은 속성 을 추가하십시오 .

  2. 제공자에게 채널을 삽입하십시오.

    Uri channelUri = context.getContentResolver().insert(
     
    TvContractCompat.Channels.CONTENT_URI, builder.build().toContentValues());

    채널에 프로그램을 나중에 추가하려면 채널 ID를 저장해야합니다. 반환 된 URI에서 채널 ID를 추출합니다.

    long channelId = ContentUris.parseId(channelUri);

  3. 채널 로고를 추가해야합니다. 용도 Uri또는 Bitmap:

    // Choose one or the other
    storeChannelLogo
    (Context context, long channelId, Uri logoUri); // also works if logoUri is a URL
    storeChannelLogo
    (Context context, long channelId, Bitmap logo);

    로고 아이콘은 80dp x 80dp 여야하며 불투명해야합니다. 원형 마스크 아래에 표시됩니다.

    TV 홈 화면 아이콘 마스크

  4. 기본 채널 만들기 (선택 사항) :

    앱이 첫 번째 채널을 만들면 기본 채널로 만들어 사용자 작업없이 바로 홈 화면에 나타낼 수 있습니다 .

    TvContractCompat.requestChannelBrowsable(context, channelId);

    사용자가 만든 다른 모든 채널은 사용자가 명시 적으로 선택 하지 않으면 표시되지 않습니다 .

채널 업데이트 중

채널을 업데이트하는 것은 채널을 만드는 것과 매우 유사합니다.

다른 Channel.Builder속성을 사용 하여 변경할 속성을 설정하십시오.

를 사용하여 ContentResolver채널을 업데이트하십시오. 채널을 처음 추가 할 때 저장 한 채널 ID를 사용하십시오.

context.getContentResolver().update(TvContractCompat.buildChannelUri(channelId),
    builder
.build().toContentValues(), null, null);

채널의 로고를 업데이트하려면를 사용하십시오 storeChannelLogo().

채널 삭제하기

context.getContentResolver().delete(TvContractCompat.buildChannelUri(channelId), null, null);

프로그램


앱 채널에 프로그램 추가하기

만들기 PreviewProgram.Builder및 해당 특성을 설정 하십시오 .

PreviewProgram.Builder builder = new PreviewProgram.Builder();
builder
.setChannelId(channelId)  
       
.setType(TvContractCompat.PreviewPrograms.TYPE_CLIP)
       
.setTitle("Title")
       
.setDescription("Program description")
       
.setPosterArtUri(uri)
       
.setIntentUri(uri)
       
.setInternalProviderId(appProgramId);

프로그램 유형에 따라 더 많은 특성을 추가하십시오. (각 유형의 프로그램에서 사용할 수있는 속성을 보려면 아래 표를 참조하십시오 .)

공급자를 프로그램에 삽입하십시오.

Uri programUri = context.getContentResolver().insert(TvContractCompat.PreviewPrograms.CONTENT_URI,
      builder
.build().toContentValues());

나중에 참조 할 수 있도록 프로그램 ID를 검색하십시오.

long programId = ContentUris.parseId(programUri);

다음 채널보기에 프로그램 추가

다음 채널보기에 프로그램을 삽입하는 것은 프로그램을 자신의 채널에 삽입하는 것과 같습니다. 4 종류의 프로그램이 있습니다. 적절한 유형을 선택하십시오.

유형노트
WATCH_NEXT_TYPE_CONTINUE사용자가 콘텐츠를 보는 중간에 앱을 중지 할 때 앱에 의해 삽입됩니다.
WATCH_NEXT_TYPE_NEXT사용자가보고있는 시리즈에서 다음 사용 가능한 프로그램을 제안하기 위해 앱에 삽입되었습니다. 예를 들어, 사용자가 시리즈의 에피소드 3을보고있는 경우 앱은 다음에 에피소드 4를 시청할 것을 제안 할 수 있습니다.
WATCH_NEXT_TYPE_NEW새 콘텐츠를 사용할 수있을 때 앱에 의해 삽입됩니다 (시리즈 또는 새 시즌의 새 에피소드). 예를 들어 사용자가 시리즈에서 5 번 에피소드를보고 있고 6 번을 시청할 수있게됩니다.
WATCH_NEXT_TYPE_WATCHLIST사용자가 특정 프로그램을 저장하겠다고 표시하면 시스템이나 앱에 의해 삽입됩니다.

다음을 사용하십시오 WatchNextProgram.Builder:

WatchNextProgram.Builder builder = new WatchNextProgram.Builder();
builder
.setType(TvContractCompat.WatchNextPrograms.TYPE_CLIP)
       
.setWatchNextType(TvContractCompat.WatchNextPrograms.WATCH_NEXT_TYPE_CONTINUE)
       
.setLastEngagementTimeUtcMillis(time)
       
.setTitle("Title")
       
.setDescription("Program description")
       
.setPosterArtUri(uri)
       
.setIntentUri(uri)
       
.setInternalProviderId(appProgramId);

Uri watchNextProgramUri = context.getContentResolver()
       
.insert(TvContractCompat.WatchNextPrograms.CONTENT_URI, builder.build().toContentValues());

사용 TvContractCompat.buildWatchNextProgramUri(long watchNextProgramId)만들기 위해 Uri당신이 시계 다음 프로그램을 업데이트해야합니다.

사용자가 Watch Next 채널에 프로그램을 추가하면 시스템은 채널에 프로그램을 복사합니다. 그것은 TvContractCompat.ACTION_PREVIEW_PROGRAM_ADDED_TO_WATCH_NEXT프로그램이 추가되었음을 앱에 알리기 위한 의도 를 보냅니다 인 텐트에는 복사 된 프로그램 ID와 다음 채널보기 채널에서 프로그램 용으로 생성 된 프로그램 ID가 포함됩니다.

프로그램 업데이트

프로그램의 정보를 변경할 수 있습니다. 예를 들어 영화 대여 가격을 업데이트하거나 사용자가 시청 한 프로그램의 양을 보여주는 진행률 막대를 업데이트 할 수 있습니다.

를 사용하여 PreviewProgram.Builder변경해야하는 속성을 설정 한 다음 getContentResolver().update프로그램을 업데이트하기 위해 호출 하십시오. 프로그램을 처음 추가 할 때 저장 한 프로그램 ID를 지정하십시오.

context.getContentResolver().update(TvContractCompat.buildPreviewProgramUri(programId),
    builder
.build().toContentValues(), null, null);

프로그램 삭제하기

context.getContentResolver().delete(TvContractCompat.buildPreviewProgramUri(programId), null, null);

사용자 작업 처리


앱을 사용하면 채널을 표시하고 추가 할 수있는 UI를 제공하여 사용자가 콘텐츠를 쉽게 찾을 수 있습니다. 앱이 홈 화면에 표시된 후에도 채널과의 상호 작용을 처리해야합니다.

채널 발견 및 추가

앱에서 채널을 선택하고 추가 할 수있는 UI 요소 (예 : 채널 추가를 요청하는 버튼)를 제공 할 수 있습니다. 사용자가 특정 채널을 요청하면이 코드를 실행하여 홈 화면 UI에 추가 할 수있는 권한을 얻습니다.

Intent intent = new Intent(TvContractCompat.ACTION_REQUEST_CHANNEL_BROWSABLE);
intent
.putExtra(TvContractCompat.EXTRA_CHANNEL_ID, channelId);
try {
   activity
.startActivityForResult(intent, 0);
} catch (ActivityNotFoundException e) {
 
// handle error
}

시스템은 사용자에게 채널 승인을 요청하는 대화 상자를 표시합니다. onActivityResult활동 의 방법 ( Activity.RESULT_CANCELED또는 Activity.RESULT_OK에서 요청의 결과를 처리하십시오 .

Android TV 홈 화면 이벤트

사용자가 앱에서 게시 한 프로그램 / 채널과 상호 작용하면 홈 화면에서 앱에 인 텐트를 전송합니다.

  • 홈 스크린은 Uri사용자가 채널의 로고를 선택할 때 채널의 APP_LINK_INTENT_URI 속성에 저장된 앱을 앱으로 보냅니다 앱은 기본 UI 또는 선택한 채널과 관련된보기를 시작해야합니다.
  • 홈 화면은 Uri사용자가 프로그램을 선택할 때 프로그램의 INTENT_URI 속성에 저장된 것을 앱에 보냅니다 앱에서 선택한 콘텐츠를 재생해야합니다.
  • 사용자는 더 이상 프로그램에 관심이없고 홈 화면의 UI에서 제거하려고 함을 나타낼 수 있습니다. 시스템은 UI에서 프로그램을 제거하고 프로그램의 ID와 함께 프로그램을 소유 한 앱에 인 텐트 (android.media.tv.ACTION_PREVIEW_PROGRAM_BROWSABLE_DISABLED 또는 android.media.tv.ACTION_WATCH_NEXT_PROGRAM_BROWSABLE_DISABLED)를 보냅니다. 앱은 프로 바이더로부터 프로그램을 삭제해야하고 다시 삽입해서는 안됩니다.

Uris홈 화면이 사용자 상호 작용을 위해 보내는 모든 것에 대한 인 텐트 필터를 만들어야합니다 예 :

<receiver
   
android:name=".WatchNextProgramRemoved"
   
android:enabled="true"
   
android:exported="true">
   
<intent-filter>
       
<action android:name="android.media.tv.ACTION_WATCH_NEXT_PROGRAM_BROWSABLE_DISABLED" />
   
</intent-filter>
</receiver>

모범 사례


  • 앱은 기본 채널을 삽입하고 가능한 한 빨리 사용자에게 콘텐츠를 제공해야합니다. 앱을 설치 한 후 시스템이 전송 BroadcastReceiver하는 android.media.tv.action.INITIALIZE_PROGRAMS"wakeup"인 텐트를 수신 하는 장치 를 추가하여이 작업을 수행 할 수 있습니다 드물 긴하지만 사용자가 앱을 시작하면 앱에서 '깨우기'브로드 캐스트를 수신 할 수 있습니다. 코드에서 기본 채널을 두 번 이상 추가하면 안됩니다.
  • 앱이 포 그라운드에 있지 않고 채널이나 프로그램을 업데이트해야하는 경우에는 JobScheduler을 사용 하여 작업을 예약하십시오 ( JobScheduler 및 JobService 참조 ).
  • 앱이 오작동하는 경우 시스템에서 앱의 제공자 권한을 취소 할 수 있습니다 (예 : 데이터로 제공자를 지속적으로 스팸하는 경우). 보안 예외를 처리하려면 try-catch 절을 사용하여 공급자에 액세스하는 코드를 래핑해야합니다.
  • 프로그램 및 채널을 업데이트하기 전에 공급자에게 데이터를 업데이트하고 조정해야하는 데이터를 쿼리하십시오. 예를 들어 사용자가 UI에서 제거하려는 프로그램을 업데이트 할 필요가 없습니다. 기존 데이터를 쿼리 한 다음 채널 승인을 요청한 후 공급자에 데이터를 삽입 / 업데이트하는 백그라운드 작업을 사용하십시오. 앱이 시작될 때와 앱이 데이터를 업데이트해야 할 때마다이 작업을 실행할 수 있습니다.

     try (Cursor cursor =
              context
    .getContentResolver()
                     
    .query(
                             
    TvContractCompat.buildChannelUri(channelId),
                             
    null,
                             
    null,
                             
    null,
                             
    null)) {
         
    if (cursor != null && cursor.moveToNext()) {
             
    Channel channel = Channel.fromCursor(cursor);
             
    if (channel.isBrowsable()) {
                 
    //update channel's programs
             
    }
         
    }
     
    }
  • 모든 이미지 (로고, 아이콘, 내용 이미지)에 대해 고유 한 Uris를 사용하십시오. 이미지를 업데이트 할 때 다른 Uri를 사용해야합니다. 모든 이미지가 캐싱됩니다. 이미지를 변경할 때 Uri를 변경하지 않으면 이전 이미지가 계속 나타납니다.

  • WHERE 절은 허용되지 않으며 WHERE 절을 사용하여 공급자에 대한 호출은 보안 예외를 throw합니다.

이전 버전과의 호환성


속성


이 절에서는 채널 및 프로그램 속성을 별도로 설명합니다.

채널 속성

모든 채널에 대해 다음 속성을 지정해야합니다.

속성노트
유형로 설정됩니다 TYPE_PREVIEW.
DISPLAY_NAME채널 이름으로 설정하십시오.
APP_LINK_INTENT_URI사용자가 채널의 로고를 선택하면 시스템은 채널과 관련된 컨텐츠를 제공하는 활동을 시작하기위한 의도를 보냅니다. 이 액티비티의 인 텐트 필터에 사용 된 Uri에이 애트리뷰트를 설정한다.

또한 채널에는 내부 앱 사용을 위해 예약 된 6 개의 입력란이 있습니다. 이 입력란은 앱이 채널을 내부 데이터 구조에 매핑하는 데 도움이되는 키 또는 기타 값을 저장하는 데 사용할 수 있습니다.

  • INTERNAL_PROVIDER_ID
  • INTERNAL_PROVIDER_DATA
  • INTERNAL_PROVIDER_FLAG1
  • INTERNAL_PROVIDER_FLAG2
  • INTERNAL_PROVIDER_FLAG3
  • INTERNAL_PROVIDER_FLAG4

프로그램 속성

비디오 프로그램 속성

비디오 프로그램의 속성은 프로그램 유형에 따라 다릅니다. 비디오 프로그램은 다음 유형 중 하나 일 수 있습니다.

  • TYPE_MOVIE
  • TYPE_TV_SERIES
  • TYPE_TV_SEASON
  • TYPE_TV_EPISODE
  • TYPE_CLIP
  • TYPE_EVENT
  • TYPE_CHANNEL

속성은 두 개의 그룹, 즉 필수 속성과 선택적 속성에 속합니다.

필수 동영상 속성

모든 유형의 비디오 프로그램에 대해 다음 속성을 지정해야합니다.

  • INTENT_URI
  • CHANNEL_ID
  • 표제
  • POSTER_ART_ASPECT_RATIO
  • POSTER_ART_URI

이러한 속성은 일부 유형의 비디오 프로그램에 필요하며 다른 속성에는 선택적입니다. 속성이 선택 사항 인 경우 괄호로 묶습니다.

속성영화TV 시리즈TV 시즌TV 에피소드클립행사채널
CONTENT_RATING(✔)(✔)(✔)
DURATION_MILLIS(✔)
EPISODE_DISPLAY_NUMBER
SEASON_DISPLAY_NUMBER
선택적 비디오 속성

이러한 선택적 속성은 프로그램 유형에 따라 사용할 수 있습니다.

속성영화TV 시리즈TV 시즌TV 에피소드클립행사채널
저자
유효성
CANONICAL_GENRE
EPISODE_TITLE
INTERACTION_COUNT
INTERACTION_TYPE
INTERNAL_PROVIDER_ID
ITEM_COUNT
살고 있다
LOGO_URI
가격을 제시하다
PREVIEW_VIDEO_URI
출시일
REVIEW_RATING
REVIEW_RATING_STYLE
간단한 설명
STARTING_PRICE
THUMBNAIL_ASPECT_RATIO
THUMBNAIL_URI
VIDEO_HEIGHT
VIDEO_WIDTH
무게
이미지 미리보기

미리보기 이미지에 권장되는 크기는 다음과 같습니다.

종횡비신장
16:9272dp153dp
3:2229.5dp153dp
4:3204dp153dp
1:1153dp153dp
2:3102dp153dp

최상의 품질을 얻으려면 미리보기 비디오가 16 : 9 또는 4 : 3이고 위의 표에 지정된 크기 이상이어야합니다. 로고는 또한 최상의 사용자 경험을 위해 불투명해야합니다.

VIDEO_WIDTH 및 VIDEO_HEIGHT를 사용하여 정확한 미리보기 비디오 크기를 지정할 수 있습니다.

오디오 프로그램 속성

오디오 프로그램의 속성은 프로그램 유형에 따라 다릅니다. 오디오 프로그램은 다음 유형 중 하나 일 수 있습니다.

  • TYPE_TRACK
  • TYPE_ALBUM
  • TYPE_ARTIST
  • TYPE_PLAYLIST
  • TYPE_STATION

속성은 두 개의 그룹, 즉 필수 속성과 선택적 속성에 속합니다.

필수 오디오 속성

모든 유형의 오디오 프로그램에 대해 다음 속성을 지정해야합니다.

  • INTENT_URI
  • CHANNEL_ID
  • POSTER_ART_URI
  • POSTER_ART_ASPECT_RATIO
  • 표제

또한 DURATION_MILLIS오디오 트랙에 필요합니다.

선택적 오디오 속성

이러한 선택적 속성은 프로그램 유형에 따라 사용할 수 있습니다.

속성선로앨범예술가재생 목록
저자
유효성
INTERACTION_COUNT
INTERACTION_TYPE
INTERNAL_PROVIDER_ID
살고 있다
LOGO_URI
가격을 제시하다
PREVIEW_VIDEO_URI
출시일
간단한 설명
STARTING_PRICE
THUMBNAIL_ASPECT_RATIO
THUMBNAIL_URI
VIDEO_HEIGHT
VIDEO_WIDTH
무게

다음 프로그램 속성보기

다음 비디오보기 채널에 오디오 또는 비디오 프로그램을 추가 할 때 오디오 / 비디오의 필수 및 선택 속성 외에도 다음 속성을 포함해야합니다.

속성노트
WATCH_NEXT_TYPE다음 채널보기 프로그램 유형 중 하나를 선택하십시오 .
LAST_ENGAGEMENT_TIME_UTC_MILLIS사용자 / 앱이 마지막으로 프로그램에 참여한 시간입니다.
LAST_PLAYBACK_POSITION_MILLISWATCH_NEXT_TYPE_CONTINUE에만 필요합니다.
DURATION_MILLISWATCH_NEXT_TYPE_CONTINUE에만 필요합니다.

https://developer.android.com/training/tv/discovery/recommendations-channel.html

+ Recent posts