Di tag aktivitas file AndroidManifest.xml, lakukan hal berikut:
- Tambahkan
supportsPictureInPicturedan tetapkan ketrueuntuk mendeklarasikan bahwa Anda akan menggunakan picture-in-picture (PiP) di aplikasi. - Tambahkan
configChangesdan tetapkan keorientation|screenLayout|screenSize|smallestScreenSizeuntuk menentukan bahwa aktivitas Anda menangani perubahan konfigurasi tata letak. Dengan cara ini, aktivitas Anda tidak akan diluncurkan kembali saat perubahan tata letak terjadi selama transisi mode PiP.
<activity
android:name=".SnippetsActivity"
android:exported="true"
android:supportsPictureInPicture="true"
android:configChanges="orientation|screenLayout|screenSize|smallestScreenSize"
android:theme="@style/Theme.Snippets">
Dalam kode Compose, lakukan hal berikut:
- Tambahkan ekstensi ini di
Context. Anda akan menggunakan ekstensi ini beberapa kali di sepanjang panduan untuk mengakses aktivitas.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") }
Menambahkan PiP saat keluar dari aplikasi untuk versi sebelum Android 12
Untuk menambahkan PiP untuk versi sebelum Android 12, gunakan addOnUserLeaveHintProvider. Ikuti
langkah-langkah berikut untuk menambahkan PiP untuk versi sebelum Android 12:
- Tambahkan gerbang versi sehingga kode ini hanya diakses di versi O hingga R.
- Gunakan
DisposableEffectdenganContextsebagai kunci. - Di dalam
DisposableEffect, tentukan perilaku saatonUserLeaveHintProviderdipicu menggunakan lambda. Di lambda, panggilenterPictureInPictureMode()difindActivity()dan teruskanPictureInPictureParams.Builder().build(). - Tambahkan
addOnUserLeaveHintListenermenggunakanfindActivity()dan teruskan lambda. - Di
onDispose, tambahkanremoveOnUserLeaveHintListenermenggunakanfindActivity()dan teruskan 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") }
Menambahkan PiP saat keluar dari aplikasi untuk Android 12 ke atas
Setelah Android 12, PictureInPictureParams.Builder ditambahkan melalui
pengubah yang diteruskan ke pemutar video aplikasi.
- Buat
modifierdan panggilonGloballyPositioneddi dalamnya. Koordinat tata letak akan digunakan pada langkah berikutnya. - Buat variabel untuk
PictureInPictureParams.Builder(). - Tambahkan pernyataan
ifuntuk memeriksa apakah SDK adalah S atau yang lebih baru. Jika demikian, tambahkansetAutoEnterEnabledke builder dan tetapkan ketrueuntuk memasuki mode PiP saat menggeser. Hal ini memberikan animasi yang lebih lancar daripada melaluienterPictureInPictureMode. - Gunakan
findActivity()untuk meneleponsetPictureInPictureParams(). Panggilbuild()padabuilderdan teruskan.
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)
Menggunakan setAspectRatio untuk menetapkan rasio aspek jendela PiP
Untuk menyetel rasio aspek jendela PiP, Anda dapat memilih rasio aspek tertentu atau menggunakan lebar dan tinggi ukuran video pemutar. Jika Anda
menggunakan pemutar media3, pastikan pemutar tidak null dan ukuran video
pemutar tidak sama dengan VideoSize.UNKNOWN sebelum menetapkan rasio
aspek.
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)
Jika Anda menggunakan pemutar kustom, tetapkan rasio aspek pada tinggi dan lebar pemutar menggunakan sintaksis khusus untuk pemutar Anda. Perlu diketahui bahwa jika ukuran pemutar diubah selama inisialisasi, dan jika berada di luar batas valid rasio aspek, aplikasi Anda akan error. Anda mungkin perlu menambahkan pemeriksaan terkait kapan rasio aspek dapat dihitung, mirip dengan cara yang dilakukan untuk pemutar media3.