في علامة النشاط لملف AndroidManifest.xml، اتّبِع الخطوات التالية:
- أضِف
supportsPictureInPictureواضبطه علىtrueللإشارة إلى أنّك ستستخدم ميزة "نافذة ضمن النافذة" في تطبيقك. - أضِف
configChangesواضبطه علىorientation|screenLayout|screenSize|smallestScreenSizeلتحديد أنّ نشاطك يتعامل مع تغييرات ضبط التنسيق. بهذه الطريقة، لا تتم إعادة تشغيل نشاطك عند حدوث تغييرات في التنسيق أثناء الانتقال إلى وضع "نافذة ضمن النافذة".
<activity
android:name=".SnippetsActivity"
android:exported="true"
android:supportsPictureInPicture="true"
android:configChanges="orientation|screenLayout|screenSize|smallestScreenSize"
android:theme="@style/Theme.Snippets">
في رمز Compose، اتّبِع الخطوات التالية:
- يمكنك إضافة هذه الإضافة على
Context. ستستخدم هذه الإضافة عدة مرات خلال الدليل للوصول إلى النشاط.internal fun Context.findActivity(): ComponentActivity { var context = this while (context is ContextWrapper) { if (context is ComponentActivity) return context context = context.baseContext } throw IllegalStateException("Picture in picture should be called in the context of an Activity") }
إضافة ميزة PiP عند مغادرة التطبيق لإصدارات Android الأقدم من Android 12
لإضافة ميزة "نافذة ضمن النافذة" في الإصدارات الأقدم من Android 12، استخدِم addOnUserLeaveHintProvider. اتّبِع الخطوات التالية لإضافة ميزة "نافذة ضمن النافذة" في الإصدارات السابقة من Android 12:
- أضِف حاجزًا للإصدارات بحيث لا يمكن الوصول إلى هذا الرمز إلا في الإصدارات من O إلى R.
- استخدِم
DisposableEffectمعContextكمفتاح. - داخل
DisposableEffect، حدِّد سلوكonUserLeaveHintProviderعند تفعيله باستخدام دالة lambda. في دالة lambda، استدعِenterPictureInPictureMode()فيfindActivity()ومرِّرPictureInPictureParams.Builder().build(). - أضِف
addOnUserLeaveHintListenerباستخدامfindActivity()وأدخِل دالة lambda. - في
onDispose، أضِفremoveOnUserLeaveHintListenerباستخدامfindActivity()ومرِّر دالة lambda.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && Build.VERSION.SDK_INT < Build.VERSION_CODES.S ) { val context = LocalContext.current DisposableEffect(context) { val onUserLeaveBehavior = Runnable { context.findActivity() .enterPictureInPictureMode(PictureInPictureParams.Builder().build()) } context.findActivity().addOnUserLeaveHintListener( onUserLeaveBehavior ) onDispose { context.findActivity().removeOnUserLeaveHintListener( onUserLeaveBehavior ) } } } else { Log.i("PiP info", "API does not support PiP") }
إضافة ميزة "نافذة ضمن النافذة" عند مغادرة التطبيق لإصدارات Android 12 والإصدارات الأحدث
في الإصدارات الأحدث من Android 12، تتم إضافة PictureInPictureParams.Builder من خلال مُعدِّل يتم تمريره إلى مشغّل الفيديو في التطبيق.
- أنشئ
modifierواستدعِonGloballyPositionedفيه. سيتم استخدام إحداثيات التخطيط في خطوة لاحقة. - أنشِئ متغيّرًا لـ
PictureInPictureParams.Builder(). - أضِف عبارة
ifللتحقّق مما إذا كانت حزمة SDK هي S أو إصدار أحدث. في هذه الحالة، أضِفsetAutoEnterEnabledإلى أداة الإنشاء واضبطها علىtrueللدخول إلى وضع "نافذة ضمن النافذة" عند التمرير السريع. يوفّر ذلك حركة أكثر سلاسة من الانتقال إلىenterPictureInPictureMode. - استخدِم
findActivity()للاتصال بـ "setPictureInPictureParams()". اتصِل بـ "build()" على الرقمbuilderومرِّر المكالمة.
val pipModifier = modifier.onGloballyPositioned { layoutCoordinates -> val builder = PictureInPictureParams.Builder() if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { builder.setAutoEnterEnabled(true) } context.findActivity().setPictureInPictureParams(builder.build()) } VideoPlayer(pipModifier)
استخدِم setAspectRatio لضبط نسبة العرض إلى الارتفاع في نافذة "نافذة ضمن النافذة"
لضبط نسبة العرض إلى الارتفاع لنافذة "نافذة ضمن النافذة"، يمكنك اختيار نسبة عرض إلى ارتفاع معيّنة أو استخدام عرض وارتفاع حجم الفيديو في المشغّل. إذا كنت تستخدم مشغّل media3، تأكَّد من أنّ المشغّل ليس فارغًا وأنّ حجم الفيديو في المشغّل لا يساوي VideoSize.UNKNOWN قبل ضبط نسبة العرض إلى الارتفاع.
val context = LocalContext.current val pipModifier = modifier.onGloballyPositioned { layoutCoordinates -> val builder = PictureInPictureParams.Builder() if (shouldEnterPipMode && player != null && player.videoSize != VideoSize.UNKNOWN) { val sourceRect = layoutCoordinates.boundsInWindow().toAndroidRectF().toRect() builder.setSourceRectHint(sourceRect) builder.setAspectRatio( Rational(player.videoSize.width, player.videoSize.height) ) } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { builder.setAutoEnterEnabled(shouldEnterPipMode) } context.findActivity().setPictureInPictureParams(builder.build()) } VideoPlayer(pipModifier)
إذا كنت تستخدم مشغّل فيديو مخصّصًا، اضبط نسبة العرض إلى الارتفاع على ارتفاع المشغّل وعرضه باستخدام البنية المحدّدة لمشغّل الفيديو. يُرجى العِلم أنّه في حال تغيير حجم المشغّل أثناء الإعداد، سيتعطّل تطبيقك إذا تجاوز الحدود الصالحة لنسبة العرض إلى الارتفاع. قد تحتاج إلى إضافة عمليات تحقّق حول وقت احتساب نسبة العرض إلى الارتفاع، على غرار ما يتم في مشغّل media3.