Fitur picture-in-picture (PIP) untuk perangkat genggam Android memungkinkan pengguna mengubah ukuran aplikasi dengan aktivitas yang sedang berlangsung menjadi jendela kecil. PIP sangat berguna untuk aplikasi video karena konten terus diputar saat pengguna bebas melakukan tindakan lain. Pengguna dapat memanipulasi posisi jendela ini melalui SystemUI dan berinteraksi dengan aplikasi yang saat ini berada dalam picture-in-picture dengan (hingga tiga) tindakan yang disediakan aplikasi.
PIP memerlukan keikutsertaan eksplisit dari aplikasi yang mendukungnya dan berfungsi berdasarkan per aktivitas. (Satu aplikasi dapat memiliki beberapa aktivitas, hanya satu
di antaranya yang berada dalam PIP.) Aktivitas meminta untuk masuk ke picture-in-picture dengan memanggil
enterPictureInPictureMode()
, dan menerima callback aktivitas dalam
bentuk onPictureInPictureModeChanged()
.
Metode setPictureInPictureParams()
memungkinkan aktivitas mengontrol rasio aspeknya saat berada dalam PIP dan tindakan kustom, yang memungkinkan pengguna berinteraksi dengan aktivitas tanpa harus meluaskannya. Dalam PIP, aktivitas berada dalam status dijeda, tetapi dirender, dan tidak menerima input sentuh atau fokus jendela secara langsung.
Hanya satu tugas yang dapat berada dalam PIP pada satu waktu.
Informasi selengkapnya tersedia di dokumentasi Picture-in-picture Android Developer.
Persyaratan perangkat
Untuk mendukung PIP, aktifkan fitur sistem
PackageManager#FEATURE_PICTURE_IN_PICTURE
di
/android/frameworks/base/core/java/android/content/pm/PackageManager.java
.
Perangkat yang mendukung PIP harus memiliki layar yang lebih besar dari 220dp pada lebar terkecilnya. Mirip dengan multi-aplikasi layar terpisah, PIP memungkinkan beberapa
aktivitas berjalan di layar secara bersamaan. Oleh karena itu, perangkat harus memiliki CPU dan RAM yang memadai untuk mendukung kasus penggunaan ini.
Implementasi
Sebagian besar pengelolaan siklus proses aktivitas dilakukan dalam sistem antara
ActivityManager
dan WindowManager
.
Penerapan UI referensi ada di paket SystemUI
.
Modifikasi pada sistem tidak boleh memengaruhi perilaku intrinsiknya sebagaimana ditentukan oleh pengujian Compatibility Test Suite (CTS). Logika sistem untuk PIP terutama berkisar pada pengelolaan tugas dan aktivitas dalam stack "disematkan". Berikut ringkasan singkat kelasnya:
ActivityRecord
: melacak status picture-in-picture setiap aktivitas. Untuk mencegah pengguna memasuki PIP dalam keadaan tertentu, seperti dari layar kunci atau selama VR, tambahkan kasus kecheckEnterPictureInPictureState()
.ActivityManagerService
: antarmuka utama dari aktivitas untuk meminta masuk ke PIP dan antarmuka untuk panggilan dariWindowManager
danSystemUI
untuk mengubah status aktivitas PIP.ActivityStackSupervisor
: dipanggil dariActivityManagerService
untuk memindahkan tugas ke dalam atau ke luar stack yang disematkan, memperbaruiWindowManager
sesuai kebutuhan.PinnedStackWindowController
: antarmukaWindowManager
dariActivityManager
.PinnedStackController
: melaporkan perubahan dalam sistem keSystemUI
, seperti IME ditampilkan/disembunyikan, rasio aspek diubah, atau tindakan diubah.BoundsAnimationController
: menganimasikan jendela aktivitas PIP dengan cara yang tidak memicu perubahan konfigurasi saat mengubah ukuran.PipSnapAlgorithm
: class bersama yang digunakan di sistem dan SystemUI yang mengontrol perilaku penempelan jendela PIP di dekat tepi layar.
Referensi SystemUI
memberikan penerapan lengkap PIP yang mendukung penyajian tindakan
kustom kepada pengguna dan manipulasi umum, seperti perluasan dan penutupan.
Produsen perangkat dapat membangun perubahan ini, selama tidak memengaruhi
perilaku intrinsik sebagaimana ditentukan oleh CDD. Berikut ringkasan singkat kelasnya:
PipManager
: komponenSystemUI
yang dimulai denganSystemUI
.PipTouchHandler
: pengendali sentuh, yang mengontrol gestur yang memanipulasi PIP. Ini hanya digunakan saat konsumen input untuk PIP aktif (lihatInputConsumerController
). Gestur baru dapat ditambahkan di sini.PipMotionHelper
: class praktis yang melacak posisi PIP, dan region yang diizinkan di layar. Panggilan melaluiActivityManagerService
untuk memperbarui atau menganimasikan posisi dan ukuran PIP.PipMenuActivityController
: memulai aktivitas yang menampilkan tindakan yang disediakan oleh aktivitas yang saat ini berada dalam PIP. Aktivitas ini adalah aktivitas overlay tugas, dan menghapus konsumen input yang di-overlay untuk memungkinkannya menjadi interaktif.PipMenuActivity
: penerapan untuk aktivitas menu.PipMediaController
: pemroses yang memperbaruiSystemUI
saat sesi media berubah dengan cara yang dapat memengaruhi tindakan default di PIP.PipNotificationController
: pengontrol yang memastikan bahwa notifikasi aktif saat pengguna menggunakan fitur PIP.PipDismissViewController
: overlay yang ditampilkan kepada pengguna saat mereka mulai berinteraksi dengan PIP untuk menunjukkan bahwa PIP dapat ditutup.
Penempatan default
Ada berbagai resource sistem yang mengontrol penempatan default PIP:
config_defaultPictureInPictureGravity
: bilangan bulat gravitasi, yang mengontrol sudut untuk menempatkan PIP, sepertiBOTTOM|RIGHT
.config_defaultPictureInPictureScreenEdgeInsets
: offset dari sisi layar untuk menempatkan PIP.config_pictureInPictureDefaultSizePercent
danconfig_pictureInPictureDefaultAspectRatio
: kombinasi persentase lebar layar dan rasio aspek mengontrol ukuran PIP. Ukuran PIP default yang dihitung tidak boleh lebih kecil dari@dimen/default_minimal_size_pip_resizable_task
, sebagaimana ditentukan oleh CTS dan CDD.config_pictureInPictureSnapMode
: perilaku penyesuaian seperti yang ditentukan dalamPipSnapAlgorithm
.
Implementasi perangkat tidak boleh mengubah rasio aspek minimum dan maksimum yang ditentukan dalam CDD dan CTS.
Izin
"Operasi aplikasi" per paket
(OP_PICTURE_IN_PICTURE
) di AppOpsManager
(main/core/java/android/app/AppOpsManager.java
), memungkinkan
pengguna mengontrol PIP di tingkat per aplikasi melalui setelan sistem.
Implementasi perangkat harus mematuhi pemeriksaan ini saat aktivitas meminta untuk
masuk ke mode picture-in-picture.
Pengujian
Untuk menguji penerapan PIP, jalankan semua pengujian terkait picture-in-picture yang ditemukan di
pengujian CTS sisi host di bagian /cts/hostsidetests/services/activitymanager
,
terutama di ActivityManagerPinnedStackTests.java
.