Fitur gambar-dalam-gambar (PIP) untuk perangkat genggam Android memungkinkan pengguna mengubah ukuran aplikasi dengan aktivitas yang sedang berlangsung ke dalam jendela kecil. PIP sangat berguna untuk aplikasi video karena konten terus diputar sementara pengguna bebas melakukan tindakan lainnya. Pengguna dapat memanipulasi posisi jendela ini melalui SystemUI dan berinteraksi dengan aplikasi yang sedang dalam gambar-dalam-gambar dengan (hingga tiga) tindakan yang disediakan aplikasi.
PIP memerlukan persetujuan eksplisit dari aplikasi yang mendukungnya dan bekerja berdasarkan per aktivitas. (Satu aplikasi dapat memiliki beberapa aktivitas, hanya satu yang ada di PIP.) Aktivitas meminta untuk memasukkan gambar-dalam-gambar 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 memperluasnya. Di PIP, aktivitas berada dalam status jeda, namun dirender dan tidak secara langsung menerima input sentuhan atau fokus jendela. Hanya satu tugas yang dapat dimasukkan ke dalam PIP dalam satu waktu.
Informasi lebih lanjut tersedia di dokumentasi Gambar-dalam-gambar Pengembang Android.
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-jendela layar terpisah, PIP memungkinkan beberapa aktivitas berjalan di layar secara bersamaan. Oleh karena itu, perangkat harus memiliki CPU dan RAM yang cukup untuk mendukung kasus penggunaan ini.
Penerapan
Sebagian besar manajemen siklus hidup aktivitas dilakukan dalam sistem antara ActivityManager
dan WindowManager
. Implementasi referensi UI ada dalam paket SystemUI
.
Modifikasi pada sistem tidak boleh memengaruhi perilaku intrinsiknya seperti yang ditentukan oleh pengujian Compatibility Test Suite (CTS) . Logika sistem untuk PIP terutama berkisar pada pengelolaan tugas dan aktivitas dalam tumpukan yang "disematkan". Berikut ini ikhtisar singkat kelas:
-
ActivityRecord
: melacak status gambar-dalam-gambar setiap aktivitas. Untuk mencegah pengguna memasukkan PIP dalam keadaan tertentu, seperti dari layar kunci atau selama VR, tambahkan kasus kecheckEnterPictureInPictureState()
. -
ActivityManagerService
: antarmuka utama dari aktivitas untuk meminta memasukkan PIP dan antarmuka untuk panggilan dariWindowManager
danSystemUI
untuk mengubah status aktivitas PIP. -
ActivityStackSupervisor
: dipanggil dariActivityManagerService
untuk memindahkan tugas masuk atau keluar dari tumpukan yang disematkan, memperbaruiWindowManager
seperlunya. -
PinnedStackWindowController
: antarmukaWindowManager
dariActivityManager
. -
PinnedStackController
: melaporkan perubahan dalam sistem keSystemUI
, seperti IME yang ditampilkan/disembunyikan, rasio aspek diubah, atau tindakan diubah. -
BoundsAnimationController
: menganimasikan jendela aktivitas PIP sedemikian rupa sehingga tidak memicu perubahan konfigurasi saat mengubah ukuran. -
PipSnapAlgorithm
: kelas bersama yang digunakan di sistem dan SystemUI yang mengontrol perilaku gertakan jendela PIP di dekat tepi layar.
Referensi SystemUI
menyediakan implementasi PIP lengkap yang mendukung penyajian tindakan khusus kepada pengguna dan manipulasi umum, seperti perluasan dan pemberhentian. Produsen perangkat dapat memanfaatkan perubahan ini, selama perubahan tersebut tidak memengaruhi perilaku intrinsik seperti yang ditentukan oleh CDD. Berikut ini ikhtisar singkat kelas:
-
PipManager
: komponenSystemUI
yang dimulai denganSystemUI
. -
PipTouchHandler
: pengendali sentuh, yang mengontrol gerakan yang memanipulasi PIP. Ini hanya digunakan ketika konsumen input untuk PIP aktif (lihatInputConsumerController
). Isyarat baru dapat ditambahkan di sini. -
PipMotionHelper
: kelas kenyamanan yang melacak posisi PIP, dan wilayah yang diperbolehkan di layar. Panggilan keActivityManagerService
untuk memperbarui atau menganimasikan posisi dan ukuran PIP. -
PipMenuActivityController
: memulai aktivitas yang menunjukkan tindakan yang disediakan oleh aktivitas yang saat ini ada di PIP. Aktivitas ini adalah aktivitas tugas-tumpangan, dan menghilangkan konsumen masukan yang tumpang tindih agar menjadi interaktif. -
PipMenuActivity
: implementasi untuk aktivitas menu. -
PipMediaController
: pendengar yang memperbaruiSystemUI
ketika sesi media berubah sedemikian rupa sehingga mungkin memengaruhi tindakan default pada PIP. -
PipNotificationController
: pengontrol yang memastikan bahwa notifikasi aktif saat pengguna menggunakan fitur PIP. -
PipDismissViewController
: hamparan yang ditampilkan kepada pengguna saat mereka mulai berinteraksi dengan PIP untuk menunjukkan bahwa PIP dapat ditutup.
Penempatan bawaan
Ada berbagai sumber daya 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
, seperti yang ditentukan oleh CTS dan CDD. -
config_pictureInPictureSnapMode
: perilaku gertakan seperti yang didefinisikan 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 pada tingkat per aplikasi melalui pengaturan sistem. Implementasi perangkat harus mematuhi pemeriksaan ini ketika suatu aktivitas meminta untuk masuk ke mode gambar-dalam-gambar.
Pengujian
Untuk menguji implementasi PIP, jalankan semua pengujian terkait gambar-dalam-gambar yang ditemukan dalam pengujian CTS sisi host pada /cts/hostsidetests/services/activitymanager
, khususnya di ActivityManagerPinnedStackTests.java
.