テレビでマルチタスク

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() を呼び出します。以前のバージョンの 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
        }
}

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 コンポーネントをオーバーレイすることがあります。これを軽減するために、アプリがオーバーレイすべきでない重要な UI コンポーネントを特定するために使用できる keep-clear API があります。システム コンポーネントがカバーされないようにするために、 PIP ウィンドウの位置を変更します

Keep-Clear

ビューをオーバーレイしないように指定するには、次の例のように XML レイアウトで preferKeepClear を使用します。

<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 の領域を指定できます。Flutter、Jetpack Compose、WebView など、View をネイティブに使用しない UI には、リージョンをクリアしておく必要があるサブセクションがある場合があります。この API はそのような場合に使用できます。

使用タイプ

アプリは、ピクチャー イン ピクチャー モードの主要な使用方法に対応する com.google.android.tv.pip.categoryメタデータ値属性を宣言する必要があります。android:supportsPictureInPicture="true" を設定している <activity> は、以下の表の関連する値を使用してこの属性を宣言する必要があります。

これらのカテゴリに該当しない使用方法(特にメディア コンテンツの再生)は、テレビのピクチャー イン ピクチャー モードでは許可されません。

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

複数の値は縦棒(|)で区切ります。次に例を示します。

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