2025 年 3 月 27 日より、AOSP のビルドとコントリビューションには aosp-main
ではなく android-latest-release
を使用することをおすすめします。詳細については、AOSP の変更をご覧ください。
ピクチャー イン ピクチャー
コレクションでコンテンツを整理
必要に応じて、コンテンツの保存と分類を行います。
Android モバイル デバイスのピクチャー イン ピクチャー(PIP)機能を使用すると、ユーザーは、アクティビティが進行中のアプリの表示サイズを変更して、小さなウィンドウで表示できます。PIP は、ユーザーが他の操作を自由に行う間もコンテンツを再生し続けるため、動画アプリには特に便利です。ユーザーは、このウィンドウの位置を SystemUI を介して操作し、アプリが提供するアクション(最大 3 つ)でピクチャー イン ピクチャー内にあるアプリを操作できます。
PIP は、PIP をサポートするアプリから明示的にオプトインする必要があり、アクティビティごとに機能します。1 つのアプリに複数のアクティビティを含めることができ、そのうちの 1 つのみが PIP になります。アクティビティは enterPictureInPictureMode()
を呼び出してピクチャー イン ピクチャーの開始を要求し、onPictureInPictureModeChanged()
の形式でアクティビティのコールバックを受け取ります。
setPictureInPictureParams()
メソッドを使用すると、アクティビティは PIP やカスタム アクションの実行中でもアスペクト比を制御できるので、ユーザーはアクティビティを拡張せずに操作できます。PIP では、アクティビティは一時停止状態(ただしレンダリングは行われている)なので、タップ入力またはウィンドウ フォーカスを直接受け取りません。PIP では一度に 1 つのタスクのみを実行できます。
詳細については、Android デベロッパー向けのピクチャー イン ピクチャーのドキュメントをご覧ください。
端末の要件
PIP をサポートするには、/android/frameworks/base/core/java/android/content/pm/PackageManager.java
の PackageManager#FEATURE_PICTURE_IN_PICTURE
のシステム機能を有効化します。PIP をサポートするデバイスの画面の最小幅は 220 dp より大きくする必要があります。分割画面のマルチウィンドウと同様に、PIP では複数のアクティビティを画面上で同時に実行できます。したがって、デバイスには、このユースケースをサポートするために十分な CPU と RAM が必要です。
実装
アクティビティのライフサイクル管理のほとんどは、ActivityManager
と WindowManager
の間のシステムで行われます。参照 UI の実装は SystemUI
パッケージにあります。
互換性テストスイート(CTS)テストで定義されるとおり、システムに修正を加えることで、本来備わっている動作に影響を及ぼすことはありません。PIP のシステム ロジックは、主に「固定済み」のスタック内のタスクとアクティビティの管理を中心に行われます。簡単なクラスの概要は次のとおりです。
ActivityRecord
: 各アクティビティのピクチャー イン ピクチャーの状態を追跡します。ロック画面や VR の使用中などの特定の状況でユーザーが PIP を使用できないようにするには、checkEnterPictureInPictureState()
にケースを追加します。
ActivityManagerService
: PIP の開始を要求するアクティビティからのメインのインターフェースと、WindowManager
と SystemUI
から呼び出し、PIP アクティビティの状態を変更するためのインターフェース。
ActivityStackSupervisor
: ActivityManagerService
から呼び出され、固定されたスタック内外にタスクを移動し、必要に応じて WindowManager
を更新します。
PinnedStackWindowController
: ActivityManager
からの WindowManager
インターフェース。
PinnedStackController
: IME の表示 / 非表示、アスペクト比の変更、アクションの変更など、システムの変更を SystemUI
に報告します。
BoundsAnimationController
: サイズ変更中に構成の変更をトリガーしない方法で PIP アクティビティ ウィンドウをアニメーション化します。
PipSnapAlgorithm
: 画面の端近くの PIP ウィンドウのスナップ動作をコントロールするシステムと SystemUI の両方で使用される共有クラス。
リファレンス SystemUI
は、ユーザーへのカスタム操作の表示や、拡張や解除などの一般的な操作をサポートする PIP の完全な実装を提供します。デバイスのメーカーは、CDD で定義されているとおり、本来の動作に影響を与えない限り、これらの変更に基づいてビルドできます。簡単なクラスの概要は次のとおりです。
PipManager
: SystemUI
で始まる SystemUI
コンポーネント。
PipTouchHandler
: PIP の操作をコントロールするタップハンドラ。これは、PIP の入力コンシューマが有効な場合にのみ使用されます(InputConsumerController
をご覧ください)。新しい操作はここに追加できます。
PipMotionHelper
: PIP の位置と画面上の許容範囲を追跡する便利なクラス。ActivityManagerService
を呼び出し、PIP の位置とサイズを更新またはアニメーション化します。
PipMenuActivityController
: 現在の PIP 内のアクティビティから提供されたアクションを表示するアクティビティを開始します。このアクティビティは、タスク オーバーレイ アクティビティであり、オーバーレイ入力コンシューマを削除してインタラクティブにします。
PipMenuActivity
: メニュー アクティビティの実装。
PipMediaController
: PIP でのデフォルトのアクションに影響する可能性のあるメディア セッションの変更が行われたときに SystemUI
を更新するリスナー。
PipNotificationController
: ユーザーが PIP 機能を使用しているときに通知が有効になるようにするコントローラ。
PipDismissViewController
: ユーザーが PIP の操作を開始したときに非表示にできることを示すためにユーザーに表示されるオーバーレイ。
デフォルトの配置
PIP のデフォルトの配置をコントロールする各種システム リソースは次のとおりです。
config_defaultPictureInPictureGravity
: BOTTOM|RIGHT
など、PIP を配置する角をコントロールする重力整数。
config_defaultPictureInPictureScreenEdgeInsets
: PIP を配置する画面の両側からのオフセット。
config_pictureInPictureDefaultSizePercent
と config_pictureInPictureDefaultAspectRatio
: PIP のサイズを制御する画面の幅の割合とアスペクト比の組み合わせ。計算されたデフォルトの PIP サイズは、CTS と CDD で定義されるとおり、@dimen/default_minimal_size_pip_resizable_task
より小さくしないでください。
config_pictureInPictureSnapMode
: PipSnapAlgorithm
で定義されているようなスナップ動作。
デバイスの実装では、CDD と CTS で定義されている最大と最小のアスペクト比を変更しないでください。
権限
AppOpsManager
(main/core/java/android/app/AppOpsManager.java
)のパッケージごとの「アプリ操作」(OP_PICTURE_IN_PICTURE
)により、ユーザーはシステム設定を介して PIP をアプリ単位で制御できます。デバイスの実装では、アクティビティがピクチャー イン ピクチャー モードに切り替わることを要求するとき、このチェックを尊重する必要があります。
テスト
PIP 実装をテストするには、/cts/hostsidetests/services/activitymanager
の下の(特に ActivityManagerPinnedStackTests.java
にある)ホスト側 CTS テスト内のピクチャー イン ピクチャー関連テストをすべて実行します。
このページのコンテンツやコードサンプルは、コンテンツ ライセンスに記載のライセンスに従います。Java および OpenJDK は Oracle および関連会社の商標または登録商標です。
最終更新日 2025-03-26 UTC。
[[["わかりやすい","easyToUnderstand","thumb-up"],["問題の解決に役立った","solvedMyProblem","thumb-up"],["その他","otherUp","thumb-up"]],[["必要な情報がない","missingTheInformationINeed","thumb-down"],["複雑すぎる / 手順が多すぎる","tooComplicatedTooManySteps","thumb-down"],["最新ではない","outOfDate","thumb-down"],["翻訳に関する問題","translationIssue","thumb-down"],["サンプル / コードに問題がある","samplesCodeIssue","thumb-down"],["その他","otherDown","thumb-down"]],["最終更新日 2025-03-26 UTC。"],[],[],null,["# Picture-in-picture\n\nThe picture-in-picture (PIP) feature for Android handheld devices lets users resize an app with an\nongoing activity into a small window. PIP is especially useful for video apps because content\ncontinues to play while the user is free to perform other actions. Users can manipulate this\nwindow's position through the SystemUI and interact with the application currently\nin picture-in-picture with (up to three) app-provided actions.\n\n\nPIP requires explicit opt-in from applications that support it and works on a\nper-activity basis. (A single application can have multiple activities, only one\nof which is in PIP.) Activities request to enter picture-in-picture by calling\n`enterPictureInPictureMode()`, and receive activity callbacks in the\nform of `onPictureInPictureModeChanged()`.\n\n\nThe `setPictureInPictureParams()` method lets activities control their\naspect ratio while in PIP and custom actions, which allow users to interact with\nthe activity without having to expand it. In PIP, the activity is in a paused,\nbut rendering, state and doesn't directly receive touch input or window focus.\nOnly a single task can be in PIP at a time.\n\n\nMore information is available in the Android Developer\n[Picture-in-picture](https://developer.android.com/training/tv/playback/picture-in-picture.html)\ndocumentation.\n\nDevice requirements\n-------------------\n\n\nTo support PIP, enable the\n`PackageManager#FEATURE_PICTURE_IN_PICTURE` system feature in\n[/android/frameworks/base/core/java/android/content/pm/PackageManager.java](https://android.googlesource.com/platform/frameworks/base/+/android16-release/core/java/android/content/pm/PackageManager.java).\nDevices that support PIP must have a screen that is larger than 220dp at its\nsmallest width. Similar to split screen multi-window, PIP allows multiple\nactivities to run on-screen at the same time. Therefore, devices should have\nsufficient CPU and RAM to support this use case.\n\nImplementation\n--------------\n\n\nMost of the activity lifecycle management is done in system between\n[ActivityManager](https://android.googlesource.com/platform/frameworks/base/+/android16-release/services/core/java/com/android/server/am/) and [WindowManager](https://android.googlesource.com/platform/frameworks/base/+/android16-release/services/core/java/com/android/server/wm/).\nThe reference UI implementation is in the [SystemUI](https://android.googlesource.com/platform/frameworks/base/+/android16-release/packages/SystemUI/)\npackage.\n\n\nModifications to the system should not affect its intrinsic behavior as defined\nby the [Compatibility Test Suite (CTS) tests](#cts-tests).\nThe system logic for PIP mainly revolves around the management of tasks and\nactivities within the \"pinned\" stack. Here is a quick class overview:\n\n- **`ActivityRecord`:** tracks each activity's picture-in-picture state. To prevent users from entering PIP in certain circumstances, such as from the lock screen or during VR, add cases to `checkEnterPictureInPictureState()`.\n- **`ActivityManagerService`:** the primary interface from the activity to request entering PIP and the interface to calls from `WindowManager` and `SystemUI` to change the PIP activity state.\n- **`ActivityStackSupervisor`:** called from the `ActivityManagerService` to move tasks in or out of the pinned stack, updating the `WindowManager` as necessary.\n- **`PinnedStackWindowController`:** the `WindowManager` interface from `ActivityManager`.\n- **`PinnedStackController`:** reports changes in the system to `SystemUI`, such as IME shown/hidden, aspect ratio changed, or actions changed.\n- **`BoundsAnimationController`:** animates the PIP activity windows in a way that does not trigger a configuration change while resizing.\n- **`PipSnapAlgorithm`:** a shared class used in both the system and SystemUI that controls the snapping behaviour of the PIP window near the edges of the screen.\n\n\nThe reference [SystemUI](https://android.googlesource.com/platform/frameworks/base/+/android16-release/packages/SystemUI/)\nprovides a complete implementation of PIP that supports presenting custom\nactions to users and general manipulation, such as expansion and dismissal.\nDevice manufacturers can build upon these changes, as long as they do not affect\nthe intrinsic behaviours as defined by the CDD. Here is a quick class\noverview:\n\n- **`PipManager`:** the `SystemUI` component that is started with `SystemUI`.\n- **`PipTouchHandler`:** the touch handler, which controls the gestures that manipulate the PIP. This is only used while the input consumer for the PIP is active (see `InputConsumerController`). New gestures can be added here.\n- **`PipMotionHelper`:** a convenience class that tracks the PIP position, and allowable region on-screen. Calls through to `ActivityManagerService` to update or animate the position and size of the PIP.\n- **`PipMenuActivityController`:** starts an activity that shows the actions provided by the activity currently in PIP. This activity is a task-overlay activity, and removes the overlaying input consumer to allow it to be interactive.\n- **`PipMenuActivity`:** the implementation for the menu activity.\n- **`PipMediaController`:** the listener that updates `SystemUI` when the media session changes in a way that might affect the default actions on the PIP.\n- **`PipNotificationController`:** the controller that ensures that a notification is active while a user is using the PIP feature.\n- **`PipDismissViewController`:** the overlay shown to users when they start interacting with the PIP to indicate that it can be dismissed.\n\nDefault placement\n-----------------\n\n\nThere are various system resources that control the default placement of the\nPIP:\n\n- **`config_defaultPictureInPictureGravity`:** the [gravity](https://developer.android.com/reference/android/view/Gravity.html) integer, which controls the corner to place the PIP, such as `BOTTOM|RIGHT`.\n- **`config_defaultPictureInPictureScreenEdgeInsets`:** the offsets from the sides of the screen to place the PIP.\n- **`config_pictureInPictureDefaultSizePercent` and\n `config_pictureInPictureDefaultAspectRatio`:** the combination of percentage of the screen width and the aspect ratio controls the size of the PIP. The computed default PIP size should not be smaller than `@dimen/default_minimal_size_pip_resizable_task`, as defined by CTS and the CDD.\n- **`config_pictureInPictureSnapMode`:** the snapping behaviour as defined in `PipSnapAlgorithm`.\n\n\nDevice implementations should not change the minimum and maximum aspect ratios\nthat are defined in the CDD and CTS.\n\nPermissions\n-----------\n\n\nThe per-package \"application operation\"\n(`OP_PICTURE_IN_PICTURE`) in `AppOpsManager`\n(`main/core/java/android/app/AppOpsManager.java`), lets\nusers to control PIP on a per-application level through the system settings.\nDevice implementations need to respect this check when an activity requests to\nenter picture-in-picture mode.\n\nTesting\n-------\n\n\nTo test PIP implementations, run all picture-in-picture related tests found in\nthe host-side CTS tests under [/cts/hostsidetests/services/activitymanager](https://android.googlesource.com/platform/cts/+/android16-release/hostsidetests/services/activitymanager/src/android/server/cts),\nparticularly in `ActivityManagerPinnedStackTests.java`."]]