کنترل های پخش را به برنامه خود اضافه کنید

یک برنامه در حال پخش رسانه به اجزای رابط کاربری برای نمایش رسانه و کنترل پخش نیاز دارد. کتابخانه Media3 شامل یک ماژول UI است که شامل تعدادی مؤلفه رابط کاربری است. برای وابستگی به ماژول UI وابستگی زیر را اضافه کنید:

کاتلین

implementation("androidx.media3:media3-ui:1.4.1")

شیار

implementation "androidx.media3:media3-ui:1.4.1"

مهم‌ترین مؤلفه PlayerView است، نمایی برای پخش رسانه‌ها. PlayerView ویدیو، تصاویر، زیرنویس‌ها و آلبوم هنری را در حین پخش و همچنین کنترل‌های پخش را نمایش می‌دهد.

PlayerView یک روش setPlayer برای پیوست کردن و جدا کردن (با پاس کردن null ) نمونه های پخش کننده دارد.

PlayerView

PlayerView می تواند برای پخش ویدئو، تصویر و صدا استفاده شود. این ویدئو و زیرنویس را در مورد پخش ویدئو، نقشه های بیتی برای پخش تصویر ارائه می کند و می تواند آثار هنری موجود به عنوان ابرداده در فایل های صوتی را نمایش دهد. می توانید آن را مانند هر مؤلفه رابط کاربری دیگری در فایل های طرح بندی خود قرار دهید. به عنوان مثال، PlayerView می توان با XML زیر اضافه کرد:

<androidx.media3.ui.PlayerView
    android:id="@+id/player_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:show_buffering="when_playing"
    app:show_shuffle_button="true"/>

قطعه بالا نشان می دهد که PlayerView چندین ویژگی را ارائه می دهد. از این ویژگی ها می توان برای سفارشی کردن رفتار نما و همچنین ظاهر و احساس آن استفاده کرد. اکثر این ویژگی ها دارای متدهای تنظیم کننده متناظر هستند که می توان از آنها برای سفارشی کردن نما در زمان اجرا استفاده کرد. PlayerView Javadoc این ویژگی ها و روش های تنظیم کننده را با جزئیات بیشتری فهرست می کند.

هنگامی که نمای در فایل layout اعلام شد، می توان آن را در متد onCreate فعالیت جستجو کرد:

کاتلین

override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  // ...
  playerView = findViewById(R.id.player_view)
}

جاوا

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  // ...
  playerView = findViewById(R.id.player_view);
}

هنگامی که یک پخش کننده مقداردهی اولیه شد، می توان آن را با فراخوانی setPlayer به view متصل کرد:

کاتلین

// Instantiate the player.
val player = ExoPlayer.Builder(context).build()
// Attach player to the view.
playerView.player = player
// Set the media item to be played.
player.setMediaItem(mediaItem)
// Prepare the player.
player.prepare()

جاوا

// Instantiate the player.
player = new ExoPlayer.Builder(context).build();
// Attach player to the view.
playerView.setPlayer(player);
// Set the media item to be played.
player.setMediaItem(mediaItem);
// Prepare the player.
player.prepare();

نوع سطح را انتخاب کنید

ویژگی surface_type PlayerView به شما امکان می دهد نوع سطح مورد استفاده برای پخش ویدیو را تعیین کنید. علاوه بر مقادیر spherical_gl_surface_view (که یک مقدار ویژه برای پخش ویدیوی کروی است) و video_decoder_gl_surface_view (که برای رندر ویدیو با استفاده از رندرهای افزونه است)، مقادیر مجاز عبارتند از surface_view ، texture_view و none . اگر نما فقط برای پخش صدا است، برای جلوگیری از ایجاد یک سطح نباید از none استفاده کرد زیرا انجام این کار می تواند گران باشد.

اگر نما برای پخش معمولی ویدیو است، باید از surface_view یا texture_view استفاده شود. SurfaceView مزایای زیادی نسبت به TextureView برای پخش ویدیو دارد:

  • مصرف برق به طور قابل توجهی در بسیاری از دستگاه ها کاهش می یابد .
  • زمان‌بندی دقیق‌تر فریم، در نتیجه پخش فیلم روان‌تر می‌شود.
  • پشتیبانی از خروجی ویدیوی HDR با کیفیت بالاتر در دستگاه های توانمند.
  • پشتیبانی از خروجی ایمن هنگام پخش محتوای محافظت شده با DRM.
  • توانایی ارائه محتوای ویدیویی با وضوح کامل نمایشگر در دستگاه‌های Android TV که لایه رابط کاربری را ارتقا می‌دهند.

بنابراین SurfaceView باید در صورت امکان بر TextureView ترجیح داده شود. TextureView باید فقط در صورتی استفاده شود که SurfaceView نیازهای شما را برآورده نکند. یک مثال در جایی است که قبل از Android 7.0 (سطح API 24)، انیمیشن های صاف یا پیمایش سطح ویدیو مورد نیاز است، همانطور که در یادداشت های زیر توضیح داده شده است. برای این مورد، ترجیح داده می‌شود که TextureView فقط زمانی استفاده شود که SDK_INT کمتر از 24 باشد (Android 7.0) و در غیر این صورت SurfaceView .

ناوبری D-pad در Android TV

کنترل از راه دور Android TV دارای یک کنترل D-pad است که دستوراتی را ارسال می کند که به عنوان رویداد کلیدی در dispatchKeyEvent(KeyEvent) Activity شما می رسد. این موارد باید به نمای بازیکن واگذار شوند:

کاتلین

override fun dispatchKeyEvent(event: KeyEvent?): Boolean{
  return playerView.dispatchKeyEvent(event!!) || super.dispatchKeyEvent(event)
}

جاوا

@Override
public boolean dispatchKeyEvent(KeyEvent event) {
  return playerView.dispatchKeyEvent(event) || super.dispatchKeyEvent(event);
}

درخواست فوکوس برای نمای پخش کننده برای پیمایش کنترل های پخش و رد کردن تبلیغات مهم است. درخواست تمرکز در onCreate Activity را در نظر بگیرید:

کاتلین

override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  // ...
  playerView.requestFocus()
  // ...
}

جاوا

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // ...
    playerView.requestFocus();
    // ...
}

اگر از Compose در Android TV استفاده می‌کنید، باید AndroidView قابل تمرکز کنید و رویداد را با انتقال پارامتر اصلاح‌کننده به AndroidView بر این اساس واگذار کنید:

AndroidView(
  modifier = modifier
    .focusable()
    .onKeyEvent { playerView.dispatchKeyEvent(it.nativeKeyEvent) },
  factory = { playerView }
)

موارد قابل ترسیم را لغو کنید

PlayerView از PlayerControlView برای نمایش کنترل های پخش و نوار پیشرفت استفاده می کند. نقشه‌هایی که توسط PlayerControlView استفاده می‌شوند، می‌توانند توسط نقشه‌هایی با همان نام‌های تعریف‌شده در برنامه شما لغو شوند. برای لیستی از نقشه های کنترلی که می توان آنها را نادیده گرفت، به PlayerControlView Javadoc مراجعه کنید.

سفارشی سازی بیشتر

در مواردی که سفارشی‌سازی فراتر از آنچه در بالا توضیح داده شد مورد نیاز است، انتظار داریم که توسعه‌دهندگان برنامه به جای استفاده از موارد ارائه شده توسط ماژول UI Media3، اجزای رابط کاربری خود را پیاده‌سازی کنند.