با Media Player شروع کنید

این سند مفاهیم اساسی را که باید قبل از کار با مدیا پلیر با آنها آشنا باشید، معرفی می‌کند.

کلاس‌های صدا و تصویر

کلاس‌های زیر صدا و تصویر را در چارچوب اندروید پخش می‌کنند:

  • MediaPlayer : این کلاس API اصلی برای پخش صدا و تصویر است.
  • AudioManager : این کلاس منابع صوتی و خروجی صدا را در یک دستگاه مدیریت می‌کند.

اعلامیه‌های آشکار

قبل از شروع توسعه برنامه خود با استفاده از MediaPlayer، مطمئن شوید که مانیفست شما دارای اعلان‌های مناسب برای استفاده از ویژگی‌های مرتبط است.

  • مجوز اینترنت: اگر از MediaPlayer برای پخش محتوای مبتنی بر شبکه استفاده می‌کنید، برنامه شما باید درخواست دسترسی به شبکه را داشته باشد.

    <uses-permission android:name="android.permission.INTERNET" />
    
  • مجوز قفل بیدارباش: اگر برنامه پخش‌کننده شما نیاز دارد که از کم‌نور شدن صفحه یا به خواب رفتن پردازنده جلوگیری کند، یا از متدهای MediaPlayer.setScreenOnWhilePlaying(boolean) یا MediaPlayer.setWakeMode(android.content.Context, int) استفاده کند، باید این مجوز را درخواست کنید.

    <uses-permission android:name="android.permission.WAKE_LOCK" />
    

استفاده از کلاس MediaPlayer

کلاس MediaPlayer یک جزء ضروری از چارچوب رسانه است. یک شیء از این کلاس می‌تواند صدا و تصویر را با حداقل تنظیمات دریافت، رمزگشایی و پخش کند. MediaPlayer از چندین منبع رسانه‌ای پشتیبانی می‌کند، از جمله:

  • منابع محلی
  • URI های داخلی، مانند موردی که ممکن است از یک Content Resolver دریافت کنید
  • URL های خارجی (پخش جریانی)

برای مشاهده فهرستی از فرمت‌های رسانه‌ای که اندروید پشتیبانی می‌کند، به صفحه فرمت‌های رسانه‌ای پشتیبانی‌شده مراجعه کنید.

نمونه‌هایی از کار با منابع صوتی

در اینجا مثالی از نحوه پخش صوتی که به عنوان یک منبع خام محلی (ذخیره شده در دایرکتوری res/raw/ برنامه شما) در دسترس است، آورده شده است:

کاتلین

var mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1)
mediaPlayer.start() // no need to call prepare(); create() does that for you

جاوا

MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1);
mediaPlayer.start(); // no need to call prepare(); create() does that for you

در این حالت، یک منبع «خام» فایلی است که سیستم سعی نمی‌کند آن را به روش خاصی تجزیه کند. با این حال، محتوای این منبع نباید صدای خام باشد. بلکه باید یک فایل رسانه‌ای به درستی کدگذاری و قالب‌بندی شده در یکی از قالب‌های پشتیبانی شده باشد.

و در اینجا نحوه‌ی پخش از طریق یک URI که به صورت محلی در سیستم موجود است (که مثلاً از طریق یک Content Resolver به دست آورده‌اید) آمده است:

کاتلین

val myUri: Uri = .... // initialize Uri here
val mediaPlayer = MediaPlayer().apply {
    setAudioAttributes(
        AudioAttributes.Builder()
            .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
            .setUsage(AudioAttributes.USAGE_MEDIA)
            .build()
    )
    setDataSource(applicationContext, myUri)
    prepare()
    start()
}

جاوا

Uri myUri = ....; // initialize Uri here
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioAttributes(
    new AudioAttributes.Builder()
        .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
        .setUsage(AudioAttributes.USAGE_MEDIA)
        .build()
);
mediaPlayer.setDataSource(getApplicationContext(), myUri);
mediaPlayer.prepare();
mediaPlayer.start();

پخش از یک URL از راه دور با استفاده از HTTP streaming به این شکل است:

کاتلین

val url = "http://........" // your URL here
val mediaPlayer = MediaPlayer().apply {
    setAudioAttributes(
        AudioAttributes.Builder()
            .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
            .setUsage(AudioAttributes.USAGE_MEDIA)
            .build()
    )
    setDataSource(url)
    prepare() // might take long! (for buffering, etc)
    start()
}

جاوا

String url = "http://........"; // your URL here
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioAttributes(
    new AudioAttributes.Builder()
        .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
        .setUsage(AudioAttributes.USAGE_MEDIA)
        .build()
);
mediaPlayer.setDataSource(url);
mediaPlayer.prepare(); // might take long! (for buffering, etc)
mediaPlayer.start();

استفاده از آماده‌سازی ناهمزمان برای بهبود عملکرد

هنگام استفاده از MediaPlayer ، عملکرد را در نظر داشته باشید. برای مثال، فراخوانی تابع prepare() می‌تواند مدت زمان زیادی برای اجرا طول بکشد، زیرا ممکن است شامل واکشی و رمزگشایی داده‌های رسانه باشد. بنابراین، مانند هر متدی که ممکن است مدت زمان زیادی برای اجرا طول بکشد، هرگز آن را از نخ رابط کاربری برنامه خود فراخوانی نکنید . انجام این کار باعث می‌شود رابط کاربری تا زمان بازگشت متد، پاسخ‌دهی را متوقف کند، که یک تجربه کاربری بد است و می‌تواند باعث خطای ANR (برنامه در حال پاسخ‌دهی نیست) شود.

برای جلوگیری از هنگ کردن نخ رابط کاربری، نخ دیگری را برای آماده‌سازی MediaPlayer ایجاد کنید و پس از اتمام کار، نخ اصلی را مطلع کنید. چارچوب، روشی مناسب برای انجام این کار با استفاده از متد prepareAsync() ارائه می‌دهد. این متد شروع به آماده‌سازی رسانه در پس‌زمینه می‌کند و بلافاصله نتیجه را برمی‌گرداند. هنگامی که آماده‌سازی رسانه به پایان رسید، متد onPrepared() از MediaPlayer.OnPreparedListener که از طریق setOnPreparedListener() پیکربندی شده است، فراخوانی می‌شود.

بیشتر بدانید

Jetpack Media3 راهکار پیشنهادی برای پخش رسانه در برنامه شماست. درباره آن بیشتر بخوانید .

این صفحات موضوعات مربوط به ضبط، ذخیره و پخش صدا و تصویر را پوشش می‌دهند: