تتيح ميزة صورة داخل صورة (PIP) للأجهزة المحمولة التي تعمل بنظام Android للمستخدمين تغيير حجم التطبيق الذي يتضمن نشاطًا مستمرًا في نافذة صغيرة. يعد PIP مفيدًا بشكل خاص لتطبيقات الفيديو لأن المحتوى يستمر في التشغيل بينما يكون المستخدم حرًا في تنفيذ إجراءات أخرى. يمكن للمستخدمين التعامل مع موضع هذه النافذة من خلال SystemUI والتفاعل مع التطبيق الموجود حاليًا في صورة داخل صورة باستخدام (ما يصل إلى ثلاثة) إجراءات يوفرها التطبيق.
يتطلب تطبيق PIP اشتراكًا صريحًا من التطبيقات التي تدعمه ويعمل على أساس كل نشاط. (يمكن أن يحتوي التطبيق الواحد على أنشطة متعددة، واحد منها فقط في صورة داخل صورة.) تطلب الأنشطة إدخال صورة داخل صورة عن طريق استدعاء enterPictureInPictureMode()
، وتلقي عمليات رد الاتصال للنشاط في شكل onPictureInPictureModeChanged()
.
تتيح طريقة setPictureInPictureParams()
للأنشطة التحكم في نسبة العرض إلى الارتفاع الخاصة بها أثناء وجودها في صورة داخل صورة (PIP) والإجراءات المخصصة، مما يسمح للمستخدمين بالتفاعل مع النشاط دون الحاجة إلى توسيعه. في PIP، يكون النشاط في حالة توقف مؤقت، ولكن يتم عرضه، ولا يتلقى مباشرة إدخال اللمس أو تركيز النافذة. يمكن أن تكون هناك مهمة واحدة فقط في صورة داخل صورة (PIP) في المرة الواحدة.
يتوفر المزيد من المعلومات في وثائق صورة داخل صورة لمطور Android.
متطلبات الجهاز
لدعم PIP، قم بتمكين ميزة نظام PackageManager#FEATURE_PICTURE_IN_PICTURE
في /android/frameworks/base/core/java/android/content/pm/PackageManager.java
. يجب أن تحتوي الأجهزة التي تدعم PIP على شاشة أكبر من 220dp عند أصغر عرض لها. على غرار النوافذ المتعددة المنقسمة على الشاشة، تسمح ميزة PIP بتشغيل أنشطة متعددة على الشاشة في نفس الوقت. لذلك، يجب أن تحتوي الأجهزة على وحدة معالجة مركزية وذاكرة وصول عشوائي كافية لدعم حالة الاستخدام هذه.
تطبيق
تتم معظم إدارة دورة حياة النشاط في النظام بين ActivityManager
و WindowManager
. يوجد تطبيق واجهة المستخدم المرجعية في حزمة SystemUI
.
يجب ألا تؤثر التعديلات على النظام على سلوكه الجوهري كما هو محدد في اختبارات مجموعة اختبار التوافق (CTS) . يدور منطق النظام لـ PIP بشكل أساسي حول إدارة المهام والأنشطة داخل المكدس "المثبت". فيما يلي نظرة عامة سريعة على الفصل:
-
ActivityRecord
: يتتبع حالة الصورة داخل الصورة لكل نشاط. لمنع المستخدمين من إدخال صورة داخل صورة (PIP) في ظروف معينة، مثل شاشة القفل أو أثناء الواقع الافتراضي، أضف حالات إلىcheckEnterPictureInPictureState()
. -
ActivityManagerService
: الواجهة الأساسية من النشاط لطلب إدخال PIP والواجهة للمكالمات منWindowManager
وSystemUI
لتغيير حالة نشاط PIP. -
ActivityStackSupervisor
: يتم استدعاؤه منActivityManagerService
لنقل المهام داخل أو خارج المكدس المثبت، وتحديثWindowManager
حسب الضرورة. -
PinnedStackWindowController
: واجهةWindowManager
منActivityManager
. -
PinnedStackController
: يُبلغ عن التغييرات في النظام إلىSystemUI
، مثل إظهار/إخفاء محرر أسلوب الإدخال (IME)، أو تغيير نسبة العرض إلى الارتفاع، أو تغيير الإجراءات. -
BoundsAnimationController
: يقوم بتحريك نوافذ نشاط PIP بطريقة لا تؤدي إلى تغيير التكوين أثناء تغيير الحجم. -
PipSnapAlgorithm
: فئة مشتركة تستخدم في كل من النظام وSystemUI التي تتحكم في سلوك الالتقاط لنافذة PIP بالقرب من حواف الشاشة.
يوفر SystemUI
المرجعي تطبيقًا كاملاً لـ PIP الذي يدعم تقديم الإجراءات المخصصة للمستخدمين والمعالجة العامة، مثل التوسيع والرفض. يمكن لمصنعي الأجهزة الاعتماد على هذه التغييرات، طالما أنها لا تؤثر على السلوكيات الجوهرية كما هو محدد بواسطة CDD. فيما يلي نظرة عامة سريعة على الفصل:
-
PipManager
: مكونSystemUI
الذي يبدأ باستخدامSystemUI
. -
PipTouchHandler
: معالج اللمس، الذي يتحكم في الإيماءات التي تتعامل مع PIP. يتم استخدام هذا فقط عندما يكون مستهلك الإدخال لـ PIP نشطًا (راجعInputConsumerController
). يمكن إضافة إيماءات جديدة هنا. -
PipMotionHelper
: فئة ملائمة تتتبع موضع PIP والمنطقة المسموح بها على الشاشة. يتم الاتصال بـActivityManagerService
لتحديث أو تحريك موضع وحجم PIP. -
PipMenuActivityController
: يبدأ نشاطًا يعرض الإجراءات التي يوفرها النشاط الموجود حاليًا في PIP. هذا النشاط هو نشاط تراكب المهام، ويزيل مستهلك الإدخال المتراكب للسماح له بأن يكون تفاعليًا. -
PipMenuActivity
: تنفيذ نشاط القائمة. -
PipMediaController
: المستمع الذي يقوم بتحديثSystemUI
عندما تتغير جلسة الوسائط بطريقة قد تؤثر على الإجراءات الافتراضية في PIP. -
PipNotificationController
: وحدة التحكم التي تضمن أن يكون الإشعار نشطًا أثناء استخدام المستخدم لميزة PIP. -
PipDismissViewController
: التراكب الذي يظهر للمستخدمين عند بدء التفاعل مع PIP للإشارة إلى أنه يمكن رفضه.
الموضع الافتراضي
هناك العديد من موارد النظام التي تتحكم في الموضع الافتراضي لـ PIP:
-
config_defaultPictureInPictureGravity
: عدد الجاذبية الذي يتحكم في الزاوية لوضع PIP، مثلBOTTOM|RIGHT
. -
config_defaultPictureInPictureScreenEdgeInsets
: الإزاحات من جوانب الشاشة لوضع PIP. -
config_pictureInPictureDefaultSizePercent
وconfig_pictureInPictureDefaultAspectRatio
: يتحكم مزيج النسبة المئوية لعرض الشاشة ونسبة العرض إلى الارتفاع في حجم PIP. يجب ألا يكون حجم PIP الافتراضي المحسوب أصغر من@dimen/default_minimal_size_pip_resizable_task
، كما هو محدد بواسطة CTS وCDD. -
config_pictureInPictureSnapMode
: سلوك الالتقاط كما هو محدد فيPipSnapAlgorithm
.
يجب ألا تغير تطبيقات الأجهزة الحد الأدنى والحد الأقصى لنسب العرض إلى الارتفاع المحددة في CDD وCTS.
الأذونات
تتيح "عملية التطبيق" لكل حزمة ( OP_PICTURE_IN_PICTURE
) في AppOpsManager
( main/core/java/android/app/AppOpsManager.java
) للمستخدمين التحكم في PIP على مستوى كل تطبيق من خلال إعدادات النظام. تحتاج تطبيقات الجهاز إلى احترام هذا التحقق عندما يطلب أحد الأنشطة الدخول إلى وضع صورة داخل صورة.
اختبارات
لاختبار تطبيقات PIP، قم بتشغيل كافة الاختبارات المتعلقة بالصورة داخل الصورة الموجودة في اختبارات CTS من جانب المضيف ضمن /cts/hostsidetests/services/activitymanager
، وخاصة في ActivityManagerPinnedStackTests.java
.