آموزش ساخت موزیک پلیر در اندروید

در این مطلب قصد دارم ساخت موزیک پلیر در اپلیکیشن اندروید رو آموزش بدهم. یکی از کاربردهای موزیک پلیر در اپلیکیشن‌هایی است که برای فروشگاه‌های کتاب صوتی نوشته می‌شوند. برای ساخت موزیک پلیر از کتابخانه exoplayer که توسط گوگل توسعه داده شده است استفاده می‌کنیم. وقتی بخواهیم از موزیک پلیر در برنامه‌ای استفاده کنیم، در ساده‌ترین حالت برنامه ما از دو قسمت مهم تشکیل خواهد شد. یکی UI مربوط به قسمت پلیر است که معمولا دکمه هایی برای توقف، پخش مجدد، رفتن به ترک بعد یا قبل و دکمه‌هایی برای جلو بردن یا عقب بردن فایل صوتی دارد. یک قسمت هم خود پلیر است که وظیفه پلی کردن فایل صوتی را برعهده دارد. در کتابخانه ‌exoplayer برای قسمت ‌UI از کلاس SimpleExoPlayerView و برای قسمتی که وظیفه پخش فایل صوتی را بر عهده دارد از کلاس SimpleExoPlayer استفاده می‌شود.

خود گوگل در یکی از دوره‌های آموزشی‌اش برنامه ای را با استفاده از کتابخانه exoplayer به اسم Guess the Composer نوشته است که در اینجا می‌توانید سورس کدهای آن را مشاهده کنید. برنامه‌ای که گوگل برای آموزش قرار داده است به گونه‌ای است که با خارج شدن کاربر از برنامه موزیک پلیر دیگر به کار خودش ادامه نمیدهد و پخش فایل صوتی قطع می‌شود. در حالیکه در اپلیکیشن‌های واقعی با خروج کاربر از برنامه موزیک پلیر به کارش ادامه میدهد و کاربر از طریق نوتیفیکیشن میتواند صدا را قطع کند. من برنامه گوگل را به گونه‌ای تغییر دادم که از سرویس برای ساخت موزیک پلیر استفاده شود و در نتیجه پخش صدا در بک گراند ادامه پیدا کند. سورس کدهای برنامه موزیک پلیر را می‌توانید در گیتهاب مشاهده کنید و توضیحات را در ادامه بخوانید.

مشاهده سورس کدهای برنامه در گیتهاب

کلاس SimpleExoPlayerView برای ظاهر موزیک پلیر

مانند View های دیگری که در اندروید استفاده می‌کنیم این View را هم به فایل xml اضافه کرده و در برنامه با گرفتن View از طریق id بقیه کارها را انجام میدهیم.

کلاس SimpleExoPlayer برای پخش فایل صوتی توسط موزیک پلیر

مهمترین مقداردهی که برای این کلاس باید انجام بشود مربوط به آدرس فایل صوتی است که از طریق متد prepare کلاس انجام می‌شود. بعد از مشخص کردن فایل صوتی که قرار است پخش شود با فرستادن true به متد setPlayWhenReady پخش فایل صوتی توسط موزیک پلیر آغاز می‌شود. مقدار دهی اولیه کلاس SimpleExoPlayer و همین طور مشخص کردن فایل صوتی که قرار است پخش شود در کلاس PlayerService انجام شده که کدهای آن به صورت زیر است. کدهای کامل برنامه را میتوانید در اینجا مشاهده کنید.

ادامه کار موزیک پلیر در بک گراند

اگر نخواهید موزیک پلیر در بک گراند به کارش ادامه دهد در ساده‌ترین حالت می‌توانید از دو کلاس SimpleExoPlayerView و  SimpleExoPlayer در  یک اکتیویتی استفاده کنید و با بسته شدن اکتیویتی هم صدا قطع میشود. اما همانطور که گفتیم در اپلیکیشن‌های واقعی معمولا چنین حالتی مدنظر نیست و موزیک پلیر با خروج کاربر از برنامه در بک گراند به کارش ادامه میدهد و کاربر میتواند از طریق نوتیفیکیشن موزیک پلیر را کنترل کند.

در صورتی که بخواهید موزیک پلیر در بک گراند به کارش ادامه دهد باید کلاس SimpleExoPlayer را در سرویس ایجاد و مقدار دهی کنید تا با بسته شدن اکتیویتی موزیک پلیر در سرویس بتواند به کارش ادامه دهد. از طرفی موقعی که اکتیویتی وجود دارد نیز باید بتواند توسط دکمه هایی مثلا قطع و پخش صدا را کنترل کند. اکتیویتی برای برقرار کردن ارتباط با سرویس در onStart به سرویس بایند میشود و در onStop هم از سرویس جدا میشود. برای اولین بار هم سرویس با شروع اکتویتی شروع به کار میکند در نتیجه startService در شروع اکتیویتی فراخوانی میشود.

کنترل موزیک پلیر از طریق نوتیفیکیشن

هنگامی که قرار باشد موزیک پلیر علاوه بر اپلیکیشن از طریق نوتیفیکیشن هم کنترل شود لازم است علاوه بر دو کلاسی که پیشتر معرفی شد با کلاس های MediaSessionCompat و PlaybackStateCompat.Builder و MediaButtonReceiver نیز کار کنید. مقدار دهی اولیه کلاس MediaSessionCompat در متد initializeMediaSession که در کلاس PlayerService وجود دارد انجام شده است. کد زیر مشخص میکند که MediaSessionCompat باید رویدادهایی که از طریق نوتیفیکیشن و همین طور از طریق هندزفری می‌آیند را دریافت کند.

 

کد زیر مشخص می‌کند که MediaSessionCompat چه رویدادهایی را از طریق callback اش دریافت میکند برای مثال توقف یا شروع مجدد، رفتن به ترک قبل و بعد و …

 

PendingIntent هایی که برای دکمه‌های نوتیفیکیشن نیاز هستند از طریق کلاس MediaButtonReceiver ایجاد می‌شوند. همین طور این کلاس از طریق کد زیر به عنوان دریافت کننده رویدادهای دکمه‌های نوتیفیکیشن تعیین میشود.

 

از آنجایی که MediaButtonReceiver باید تپ کردن روی دکمه‌های نوتیفیکیشن را کنترل کند باید در AndroidManifest.xml نیز اضافه شود.

 

یک نکته مهم این است که android.intent.action.MEDIA_BUTTON باید به عنوان اکشن سرویسی که مسئول کار با موزیک پلیر است نیز در نظر گرفته شود. وقتی روی دکمه های نوتیفیکیشن زده میشود یک broadcast با اکشن android.intent.action.MEDIA_BUTTON فرستاده میشود. سرویسی که با موزیک پلیر کار میکند intent برودکست شده را دریافت کرده و از طریق کد زیر آن را برای هندل شدن به MediaButtonReceiver میسپارد. MediaButtonReceiver نیز با توجه به رویداد اتفاق افتاده برای مثال زدن روی دکمه قطع موسیقی، کال بک مربوطه را فراخوانی میکند

کال بک فراخوانی شده از طریق MediaButtonReceiver نیز توسط کدهای زیر مشخص میشوند.

 

وقتی کال بکی فراخوانی میشود آنجاست که ما به موزیک پلیر میگوییم چه کار کند. مثلا قطع بشه، بره ترک بعدی یا هر کار دیگه‌ای که باید انجام بدهد. برای مثال فرض کنید موزیک پلیر داره یک فایل صوتی رو پخش میکنه و ما از طریق نوتیفیکیشن روی دکمه pause تپ میکنیم. اتفاق های زیر به ترتیب رخ میدهند.

  • فرستاده شدن برودکست توسط اندروید
  • صدازده شدن متد onStartCommand در کلاس PlayerService  که موزیک پلیر رو در بک گراند کنترل میکند
  • صدا زده شدن onPause که در کلاس MySessionCallback وجود دارد
  • قطع موزیک پلیر که باعث فراخوانی رویداد onPlayerStateChanged میشود
  • تغییر وضعیت سشن به حالت STATE_PAUSED و فراخوانی تابع showNotification که باعث تغییر آیکن نوتیفیکیشن میشود 🙂

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

درباره نویسنده

پست های مرتبط

8 نظر

    1. فهیمه قاسمی
      فهیمه قاسمی

      سلام
      تو آموزش یه جا گفتم سورس کد رو میتونید اینجا ببینید بعد به گیت هاب لینک دادم انگار شما اون قسمت رو ندیدید. البته منم بهتر بود لینک سورس رو آخر مقاله واضخ تر میزاشتم. به هر حال لینکش اینجاست

      https://github.com/fahime-ghasemi/AdvancedAndroid_ClassicalMusicQuiz/tree/background-service

      پاسخ
    1. فهیمه قاسمی
      فهیمه قاسمی

      خواهش می کنم، خوشحالم که مورد توجه شما قرار گرفت. انشالله به زودی این مقاله با توضیحات اندروید ۲۸ به روزرسانی میشه.
      توضیح اینکه موزیک پلیر در اندروید ۲۸ به بالا پیاده سازیش کمی تغییر کرده.

      پاسخ
  1. احسان نوکندی

    سلام خانم مهندس. ممنون از شما بابت آموزشتون. دو تا سوال داشتم. اول اینکه توی کدتون از سرویس استفاده نکردید اما مدیا سیشن دارید. من همیشه فکر می کردم مدیا سیشن باید همراه با اسرویس استفاده بشه. این که کد شما سرویس نداره باعث نمی شه موزیک در بکگراند اجرا نشه؟
    سوال دومم هم این هست که اگر بخوام از mediaPlayer استفاده کنم باید کد رو چطور بنویسم. من توی تبدیل کدتون به یه اپ با مدیا پلیر به مشکل خوردم. میشه لطفا کمکم کنید؟

    پاسخ
    1. فهیمه قاسمی
      فهیمه قاسمی

      سلام. خوشحالم که مقاله‌های آموزشی اندروید براتون مفید بوده. در رابطه با آموزش ساخت مدیا پلیر من از سرویس استفاده کردم. برای اینکه پخش موزیک در بک‌گراند ادامه پیدا کنه باید حتما از سرویس استفاده بشه. لینک پروژه گیت هاب رو توی مقاله در پاراگراف‌های ابتدایی گذاشتم اینجا هم مجددا براتون میفرستم. لینک سورس کد آموزش ساخت مدیا پلیر در گیتهاب
      در رابطه با سوال دومتون اگه بخواین از mediaPlayer استفاده کنین روالش کلا با استفاده از exoplayer فرق داره و یه جورایی استفاده از این مقاله و تبدیل کردن کدها به حالتی که از mediaplayer استفاده بشه ممکنه گیج کننده بشه. ولی من به زودی هم آپدیت این مقاله رو با نسخه جدید exoplayer منتشر میکنم و هم انشالله ساخت موزیک پلیر با استفاده از اندروید رو در مقاله جداگانه‌‌ای منتشر میکنم چون به نظرم این سوال شما به احتمال زیاد سوال عده دیگری از دوستان هم هست.

      پاسخ

پاسخ

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

4 × 4 =