TV에서 멀티태스킹

Android 14 (API 수준 34)에서는 picture-in-picture (PiP) API가 추가되었습니다. PIP 모드일 때 이 지원은 Android 8.0 (API 수준 26)에서 도입되었으며 Android TV에서 지원되며 Android 이전 Google TV에서는 전혀 지원되지 않음 13. TV용 멀티태스킹은 PIP 모드를 사용하여 화면에 공존할 개별 앱(하나는 완전히 실행됨) 두 번째 PIP 모드로 실행 중인 화면 현재 두 모드 중 하나에서 실행되는 앱에 대한 서로 다른 요구사항이 있습니다.

기본 동작은 PIP 앱이 전체 화면 앱을 오버레이하는 것입니다. 이것은 표준 Android PIP 모드 동작과 매우 동일합니다.

멀티태스킹을 통합할 때 애플리케이션은 사용 유형 TV 앱 품질 가이드라인을 준수해야 합니다.

PIP 모드로 앱 실행

Android 14 (API 수준 34) 이상을 실행하는 TV 기기의 경우 PIP로 앱을 실행합니다. enterPictureInPictureMode() 호출 이전 실행 TV 기기 Android 버전은 PIP 모드를 지원하지 않습니다.

다음은 입력 버튼을 위한 로직을 구현하는 방법의 예입니다. PIP 모드:

Kotlin

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    pictureInPictureButton.visibility =
        if (requireActivity().packageManager.hasSystemFeature(FEATURE_PICTURE_IN_PICTURE)) {
            pictureInPictureButton.setOnClickListener {
                val aspectRatio = Rational(view.width, view.height)
                val params = PictureInPictureParams.Builder()
                    .setAspectRatio(aspectRatio)
                    .build()
                val result = requireActivity().enterPictureInPictureMode(params)
            }
            View.VISIBLE
        } else {
            View.GONE
        }
}

자바

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    if (requireActivity().getPackageManager().hasSystemFeature(FEATURE_PICTURE_IN_PICTURE)) {
        pictureInPictureButton.setVisibility(View.VISIBLE);
        pictureInPictureButton.setOnClickListener(v -> {
            Rational aspectRatio = new Rational(view.getWidth(), view.getHeight());
            PictureInPictureParams params = new PictureInPictureParams.Builder()
                    .setAspectRatio(aspectRatio)
                    .setTitle("My Streaming App")
                    .setSubtitle("My On-Demand Content")
                    .build();
            Boolean result = requireActivity().enterPictureInPictureMode(params);
        });
    } else {
        pictureInPictureButton.setVisibility(View.GONE);
    }
}

기기에 시스템 기능이 있는 경우에만 작업이 추가됩니다. FEATURE_PICTURE_IN_PICTURE 또한 작업이 트리거되면 PIP 모드의 가로세로 비율은 진행 중인 동영상의 가로세로 비율과 일치하도록 합니다.

사용자에게 정보를 제공하기 위해 제목부제목을 추가해야 합니다. PIP의 일반적인 용도를 알 수 있습니다.

PIP 모드에서 실행되는 앱과 공존

앱이 전체 화면 앱으로 실행되는 경우 다른 앱에 맞게 PIP 모드에서 실행되는 앱

API-명확성

경우에 따라 PIP 앱이 화면 내부의 중요한 UI 구성요소를 전체 화면 앱 이 문제를 완화하기 위해 앱에서 UI 구성요소를 식별할 수 있습니다. 시스템 이러한 구성 요소를 덮어버리지 않도록 PIP 창 위치를 변경합니다.

유지-지우기

뷰를 오버레이하지 않도록 지정하려면 다음과 같이 preferKeepClear를 사용합니다. XML 레이아웃을 사용해야 합니다.

<TextView
    android:id="@+id/important_text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:preferKeepClear="true"
    android:text="@string/app_name"/>

setPreferKeepClear()를 사용하여 프로그래매틱 방식으로 이 작업을 실행할 수도 있습니다.

Kotlin

private lateinit var binding: MyLayoutBinding

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    binding = MyLayoutBinding.inflate(layoutInflater)
    setContentView(binding.root)
    binding.importantText.isPreferKeepClear = true
}

자바

private MyLayoutBinding binding;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    binding = MyLayoutBinding.inflate(getLayoutInflater());
    setContentView(binding.getRoot());
    binding.importantText.setPreferKeepClear(true);
}

View 전체를 삭제할 필요는 없지만 그것의 일부일 뿐입니다. setPreferKeepClearRects()는 다음과 같은 용도로 사용할 수 있습니다. 오버레이하면 안 되는 View의 영역을 지정합니다. 사용하지 않는 UI Flutter, Jetpack Compose, WebView와 같은 View는 기본적으로 영역을 명확히 해야 하는 하위 섹션이 있습니다. 이러한 경우에 이 API를 사용할 수 있습니다.

사용 유형

앱에서 다음의 메타데이터 값 속성을 선언해야 합니다. 기본 유형에 해당하는 com.google.android.tv.pip.category 또는 PIP 모드의 사용 유형입니다. 설정된 모든 <activity> android:supportsPictureInPicture="true"는 이 속성을 해당 값을 선택합니다.

이러한 카테고리에 속하지 않는 사용 유형, 특히 TV의 PIP 모드에서 허용되지 않습니다.

설명
"communication" 영상 통화 또는 음성 통화와 같은 통신 사용 사례
"smartHome" 스마트 홈 통합(예: 연결된 초인종 또는 베이비 모니터)
"health" 피트니스 추적 또는 건강 모니터링과 같은 건강 사용 사례
"ticker" 실시간 스포츠 점수 또는 뉴스 및 주식 티커와 같은 티커 사용 사례입니다.

값이 여러 개인 경우 세로 막대 (|)로 구분합니다. 예를 들면 다음과 같습니다.

<meta-data android:name="com.google.android.tv.pip.category" android:value="smartHome|health" />