سبد (0)

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

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

وقتی برنامه قابل پیش بینی باشد، کاربر یک تجربه ی خوبی از برنامه خواهد داشت. اگر برنامه ی شما قابلیت پخش رسانه دارد، اینکه کاربر بتواند با دکمه های سخت افزاری یا نرم افزاری میزان صدای دستگاهشان، هدستشان و یا هدفنشان را کنترل کند، از اهمیت بسزایی برخودار است.

به همین ترتیب، دکمه های پخش، توقف، نگه داشتن، پرش و ... می بایست به درستی عملکرد خود را انجام دهند.

 


 تعیین اینکه از چه جریان صوتی استفاده کنیم

اولین گام برای اینکه کاربر هنگامی که در حین کار با صوت برنامه است تجربه ی خوبی داشته باشد این است که مشخص کنیم برنامه ی شما از چه جریان صوتی استفاده می کند.

اندروید از یک جریان صوتی مجزا برای پخش موسیقی، هشدار، پیغام، زنگ تماس، صداهای صوتی و تن های DTMF استفاده می کند. این کار اساساً به این خاطر است که کاربر بتواند میزان صدای هر کدام از جریان ها را به صورت مستقل کنترل کند.

اکثر این جریان ها محدودیت هایی را در مقابل رویدادهای سیستمی دارند، بنابراین به غیر از مواردی که برنامه ی شما هشدار ساعت می باشد، تقریباً در اکثر اوقات شما از جریان STREAM_MUSIC برای پخش صوت استفاده می کنید.

استفاده از کلید سخت افزاری کنترل صدا برای کنترل میزان صدای برنامه


به طور پیش فرض، فشردن دکمه ی کنترل صدا، میزان صدای جریان صوتی فعال را تغییر می دهد. اگر برنامه ی شما در حال حاضر در هیچ صوتی را پخش نمی کند، فشردن دکمه صدا، میزان صدای زنگ دستگاه را کم و زیاد می کند.

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

شاید شما بخواهید میزان صدای برنامه را با فشردن دکمه ی میزان صدا تغییر دهید. اندروید متد ()setVolumeControlStream را در اختیار شما گذاشته تا شما بتوانید جریان صوتی که مد نظرتان هست را هنگام فشردن دکمه ی میزان صوت کنترل کنید.

وقتی جریان صوتی که برنامه ی شما استفاده می کند را شناسایی کردید، می بایست آن را به عنوان جریان هدف تنظیم کنید. این کار را باید در ابتدای چرخه ی حیات برنامه انجام دهید، از آنجایی که فقط یک بار نیاز است تا این تابع در طول چرخه ی حیات فراخوانی شود، معمولاً آن را در متد ()onCreate (در Activity یا Fragmentی که صدا را کنترل می کند) فراخوانی می کنند. این کار تضمین می کند که هنگامی که برنامه مشاهده می شود و در پیش روی کاربر قرار دارد، کنترل صدا دقیقاً کاری را انجام دهد که کاربر انتظار آن را دارد.

setVolumeControlStream(AudioManager.STREAM_MUSIC);

از این زمان به بعد با فشردن دکمه ی کنترل صدای دستگاه، هنگامی که activity یا fragment پیش روی کاربر است جریانی که شما مشخص کرده اید کم یا زیاد می شود.

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


دکمه های پخش رسانه مانند، پخش، توقف، نگه داشتن، پرش به بعدی، پرش به قبلی و ... روی اکثر هدست ها یا دستگاه های بیسیم هدست وجود دارند.

وقتی کاربری یکی از این دکمه های سخت افزاری را کلیک می کند، سیستم یک intent با اقدام ACTION_MEDIA_BUTTON منتشر می کند.

برای پاسخ به رویداد کلیک، می بایست یک BroadcastReceiver در منیفست برنامه ثبت کنیم که به این انتشار پاسخ دهد. مانند تکه کد زیر:

پاسخ به BroadcastReceiver

<receiverandroid:name=".RemoteControlReceiver">
   
<intent-filter>
       
<actionandroid:name="android.intent.action.MEDIA_BUTTON"/>
   
</intent-filter>
</receiver>

حال در پیاده سازی نیاز است که مشخص کنیم چه کلیدی فشرده شده است. Intent این کلید ها را در EXTRA_KEY_EVENT دارد. کلاس KeyEvent حاوی لیستی از *_KEYCODE_MEDIA است که هر یک از دکمه ها را نشان می دهد، مثلاً KEY_CODE_MEDIA_PLAY_PAUSE و KEYCODE_MEDIA_NEXT می باشد.

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

پاسخ به رویداد کلیک

public class RemoteControlReceiver extends BroadcastReceiver{
   
@Override
   
public void onReceive(Context context,Intent intent){
       
if(Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())){
           
KeyEventevent=(KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
           
if(KeyEvent.KEYCODE_MEDIA_PLAY ==event.getKeyCode()){
               
// Handle key press.
           
}
       
}
   
}
}
 

به این دلیل که چند برنامه ممکن است بخواهد به رویداد کلیک روی دکمه ی رسانه گوش دهند، باید در سطح برنامه نویسی کنترل کنیم که چه زمانی برنامه ی شما باید رویداد فشردن دکمه ی رسانه را دریافت کند.

می توانید از تکه کد زیر در برنامه ی خود استفاده کنید. در این کد می توانید با ثبت رویداد دکمه ی مدیا به آن پاسخ دهید و یا اینکه می توانید از آن صرف نظر کنید.

 

AudioManager am = mContext.getSystemService(Context.AUDIO_SERVICE);
...

// Start listening for button presses
am
.registerMediaButtonEventReceiver(RemoteControlReceiver);
...

// Stop listening for button presses
am
.unregisterMediaButtonEventReceiver(RemoteControlReceiver);

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

رهیافت بهتر این است که وقتی برنامه ی شما فوکوس صوتی را بدست می گیردیا آن را از دست می دهد ما هم در برنامه در رویداد مربوط به فشردن دکمه های صوتی ثبت نام کنیم و یا انصراف دهیم. در درس بعدی به تفصیل در مورد این مسئله توضیح داده شده است.

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