テレビでマルチタスク

Android 14(API レベル 34)では、 マルチタスクを可能にするピクチャー イン ピクチャー(PIP)API。PIP Android 8.0(API レベル 26)で導入されましたが、 Android TV では対応していますが、Android より前の Google TV ではまったく対応していません。 13.テレビのマルチタスクは PIP モードを使用して、 別々のアプリを画面上に共存させることができます もう 1 つは PIP モードで実行されています他にも 要件が異なる場合があります

デフォルトの動作では、PIP アプリは全画面アプリにオーバーレイします。これは、 標準のAndroid のピクチャー イン ピクチャーの動作とほぼ同じです。

マルチタスクを統合する場合、アプリはその 使用タイプ テレビアプリの品質に関するガイドラインに準拠していること。

アプリを PIP モードで実行する

Android 14(API レベル 34)以降を搭載している TV デバイスの場合は、アプリを PIP で実行します。 モードにするには enterPictureInPictureMode() を呼び出します。それ以前搭載されたテレビデバイス 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
        }
}

Java

@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 モードで動作するアプリです。

Keep-clear API

場合によっては、PIP アプリが重要な UI コンポーネントを クリックします。これを軽減するために、アプリが使用できる状態維持の API があります。 オーバーレイすべきでない重要な UI コンポーネントを識別するために使用します。システム コンポーネントがカバーされないようにするために、 PIP ウィンドウの位置を変更します

Keep-Clear

ビューをオーバーレイしないように指定するには、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
}

Java

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: プライマリ タイプまたは ピクチャー イン ピクチャー モードの用途のタイプ。すでに設定されている <activity> android:supportsPictureInPicture="true" では、この属性を 該当する値を下表から選びます。

これらのカテゴリに当てはまらない使用タイプ(特に テレビのピクチャー イン ピクチャー モードではメディア コンテンツを再生できません。

説明
communication ビデオ通話や音声通話などの通信のユースケース。
smartHome スマートホームとの統合(コネクテッド ドアホンやベビーモニターなど)。
health フィットネス トラッキングや健康管理など、健康に関するユースケース。
ticker スポーツのライブスコアや、ニュースや株価のティッカーなどのティッカーのユースケース。

複数の値を指定する場合は、縦棒(|)で区切ります。次に例を示します。

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