سبد (0)

مدیریت فوکوس صوت در اندروید

آن چه در این درس خواهید آموخت:

  1. درخواست فوکوس صوت
  2. مدیریت از دست دادن فوکوس صوت
  3. Duck!

مواردی که باید مطالعه کرده باشید:

  • پخش رسانه

آموزش اندروید-مدیریت فوکوس صوت

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

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

درخواست فوکوس صوت


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

شما می بایست مشخص کنید که از چه جریانی شما در حال استفاده هستید همچنین باید مشخص کنید که آیا انتظار دارید که فوکوس صوت دائم باشد یا گذرا باشد. فوکوس صوت دائم وقتی است که شما انتظار دارید پخش صوت برای مدت کوتاهی انجام گیرد و فوکوس صوت دائم وقتی است که شما برنامه دارید که صوت برای یک زمان قابل پیش بینی (مانند پخش موسیقی) پخش شود.

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

درخواست فوکوس صوت

// Request audio focus for playback
int result = am.requestAudioFocus(afChangeListener,
// Use the music stream.
AudioManager.STREAM_MUSIC,
// Request permanent focus.
AudioManager.AUDIOFOCUS_GAIN);

if(result ==AudioManager.AUDIOFOCUS_REQUEST_GRANTED){
am
.registerMediaButtonEventReceiver(RemoteControlReceiver);
// Start playback.
}

وقتی پخش صوت خاتمه یافت مطمئن شوید که تابع ()abandonAudioFocus را صدا زده اید. با این کار به سیستم می گویید که دیگر نیازی به فوکوس ندارید و از AudioManager.OnAudioFocudChangeListener مربوطه (که قبلاً در آن ثبت نام کرده بود) انصراف می دهد. در حالتی که فوکوس موقت تمام می شود، این خاتمه باعث می شود که صوت هایی که قبلاً متوقف شده بودند مجدداً ادامه پیدا کنند:

آزاد کردن فوکوس

// Abandon audio focus when playback complete    
am
.abandonAudioFocus(afChangeListener);
 

هنگامی که برای یک فوکوس صوت گذرا درخواست می شود، یک گزینه ی دیگر نیز پیش رو قرار دارد: اینکه شما می خواهید "ducking" را فعال کنید یا نه. در حالت عادی، هنگامی که یک برنامه ی صوت عادی فوکوس صوت را از دست می دهد، بلافاصله پخش قطع می شود. وقتی درخواست فوکس گذرایی دارید که "ducking" آن فعال است، در حقیقت با این کار به سایر برنامه های صوتی می گویید که این قابل قبول است که شما کماکان به پخشتان ادامه بدهید، که البته میزان صدای آن تا زمانی که فوکوس برگردد کمتر می شود.

فوکوس گذرا به همراه Duck

 
// Request audio focus for playback
int result = am.requestAudioFocus(afChangeListener,
// Use the music stream.
AudioManager.STREAM_MUSIC,
// Request permanent focus.
AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK);

if(result ==AudioManager.AUDIOFOCUS_REQUEST_GRANTED){
// Start playback.
}
 

داشتن docking مخصوصاً برای برنامه هایی مفید است که از جریان صوت به صورت گاه و بیگاه (و نه مداوم) استفاده می کنند.

هرگاه سایر برنامه ها فوکوس صوت را درخواست می کنند (همانگونه که در بالا توضیح داده شد)، توسط lisitenerی که موقع درخواست فوکوس در آن ثبت نام کردید، یک انتخاب بین فوکوس صوت گذرا یا دائمی برای درخواست کننده ارسال می شود.

مدیریت از دست دادن فوکوس صوت


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

متد ()onAudioFocusChange در واقع به تغییر فوکوس صوتی گوش می دهد. هنگامی که کاربر فوکوس صوتی را درخواست می کند، در این رویداد ثبت نام می کند. این متد یک پارامتر دریافت می کند که در مورد رویداد تغییر فوکوس توضیح می دهد. به ویژه، در این رویداد نوع درخواست نیز بازتاب می شود. مثلاً اینکه درخواست دائم است یا گذراست یا گذرا به همراه ducking است.

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

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

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

Title

OnAudioFocusChangeListener afChangeListener =newOnAudioFocusChangeListener(){
publicvoid onAudioFocusChange(int focusChange){
if(focusChange == AUDIOFOCUS_LOSS_TRANSIENT
// Pause playback
}elseif(focusChange ==AudioManager.AUDIOFOCUS_GAIN){
// Resume playback
}elseif(focusChange ==AudioManager.AUDIOFOCUS_LOSS){
am
.unregisterMediaButtonEventReceiver(RemoteControlReceiver);
am
.abandonAudioFocus(afChangeListener);
// Stop playback
}
}
};



در حالتی که از دست دادن فوکوس صوت گذرا باشد و ducking اجازه داده شده باشد، به جای اینکه پخش را pause کنید می توانید آن را duck کنید.

Duck!


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

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

Title

OnAudioFocusChangeListener afChangeListener =newOnAudioFocusChangeListener(){
publicvoid onAudioFocusChange(int focusChange){
if(focusChange == AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK){
// Lower the volume
}elseif(focusChange ==AudioManager.AUDIOFOCUS_GAIN){
// Raise it back to normal
}
}
};
 

از دست دادن فوکوس صوتی مهمترین چیزی است که باید با آن برخورد شود، اما تنها چیزی که باید به آن پرداخته شود نیست. سیستم تعدادی intent منتشر می کند تا به شما هشدار دهد که تغییراتی در پخش صوت اتفاق افتاده است. در آموزش بعدی نحوه ی مانتیور کردن تغییرات می پردازیم.

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