Audio Focus হল একটি Android মেকানিজম যা একাধিক অ্যাপ্লিকেশন দ্বারা অডিও আউটপুটের একযোগে ব্যবহার নিয়ন্ত্রণ করে। এটি শব্দের ওভারল্যাপিং প্রতিরোধ করে: যখন একটি অ্যাপ প্লেব্যাক শুরু করে, সিস্টেম স্বয়ংক্রিয়ভাবে অন্যটির শব্দ কমিয়ে দেয় বা বিরতি দেয়। Android Developer Guide, 2026 অনুসারে, Audio Focus অডিও চালানো সমস্ত অ্যাপের জন্য বাধ্যতামূলক — এটি ছাড়া Google Play আপডেট প্রত্যাখ্যান করতে পারে।
মূল বিষয়
Audio Focus Android এ একটি কেন্দ্রীভূত অডিও সালিশ ব্যবস্থা। যখন একটি অ্যাপ ফোকাস অনুরোধ করে, সিস্টেম পরীক্ষা করে সক্রিয় ফোকাস “মালিক” আছে কিনা এবং তাকে ক্ষতি বিজ্ঞপ্তি পাঠায়। মালিক ফোকাসের প্রকারের উপর নির্ভর করে শব্দ কমাতে পারে (duck), প্লেব্যাক বিরতি দিতে পারে, বা এটি উপেক্ষা করতে পারে।
Android 8.0 এর আগে, ফোকাস AudioManager.requestAudioFocus(callback, stream, durationHint) এর মাধ্যমে পরিচালিত হত। Android 8.0 থেকে শুরু করে, AudioFocusRequest প্রবর্তিত হয়েছিল, যা অনুরোধের ধরন এবং স্বয়ংক্রিয় ফোকাস পুনরুদ্ধার নির্দিষ্ট করার ক্ষমতা যোগ করেছিল। Android 12 এ মেকানিজম শক্তিশালী করা হয়েছিল — Google Play এ প্রকাশের জন্য সমস্ত মিডিয়া প্লেয়ারকে সঠিকভাবে ফোকাস পরিচালনা করতে হবে।
Google I/O 2024 অনুসারে, অডিও অ্যাপ রিভিউতে প্রায় 15% ব্যবহারকারীর অভিযোগ শব্দ ওভারল্যাপিং সম্পর্কিত। সঠিক Audio Focus বাস্তবায়ন এই সমস্যার সমাধান করে এবং শোনার সময়ে ব্যবহারকারীর অভিজ্ঞতা 30% উন্নত করে।
এটি বোঝা গুরুত্বপূর্ণ যে Audio Focus স্বয়ংক্রিয়ভাবে প্লেব্যাক নিয়ন্ত্রণ করে না। এটি শুধুমাত্র ফোকাস ইভেন্ট সম্পর্কে অ্যাপকে জানায়। অ্যাপ নিজেই সিদ্ধান্ত নেয়: প্লেয়ার বিরতি দেওয়া, ভলিউম কমানো বা চালিয়ে যাওয়া। সিস্টেম বাধ্য করে না — এই স্থাপত্য সিদ্ধান্ত ডেভেলপারের উপর ছেড়ে দেওয়া হয়েছে।
ব্যতিক্রম নেভিগেশন অ্যাপ (Google Maps, Yandex Maps)। তারা AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK ফোকাস ধরনের অনুরোধ করতে পারে, যেখানে বিদ্যমান প্লেয়ারের শব্দ কমানো হয় যখন ভয়েস প্রম্পট তার উপরে বাজে। প্রম্পট শেষ হওয়ার পরে, প্লেয়ার স্বয়ংক্রিয়ভাবে ভলিউম পুনরুদ্ধার করে।
সিস্টেম একটি একক সক্রিয় অডিও ফোকাস মালিক বজায় রাখে। যখন একটি নতুন অ্যাপ ফোকাস অনুরোধ করে, সিস্টেম অগ্রাধিকার নির্ধারণ করে এবং বর্তমান মালিককে একটি ইভেন্ট পাঠায়। যদি বর্তমান মালিক ইভেন্ট উপেক্ষা করে এবং জোরে বাজাতে থাকে, সিস্টেম কোনো জরিমানা প্রয়োগ করে না — দায়িত্ব সম্পূর্ণভাবে প্লেয়ারের উপর।
ফোকাস অনুরোধে একটি durationHint প্যারামিটার অন্তর্ভুক্ত থাকে যা সিস্টেমকে আনুমানিক সময়কাল জানায়: AUDIOFOCUS_GAIN (দীর্ঘ প্লেব্যাক — সঙ্গীত, পডকাস্ট), AUDIOFOCUS_GAIN_TRANSIENT (স্বল্পমেয়াদী — বিজ্ঞপ্তি শব্দ, নেভিগেশন), AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK (বিদ্যমান প্লেয়ারের শব্দ কমানোর অনুমতি সহ স্বল্পমেয়াদী)।
ফোকাস ক্ষতিতে, অ্যাপ তিনটি কোডের মধ্যে একটি পায়: AUDIOFOCUS_LOSS (দীর্ঘমেয়াদী ক্ষতি — অন্য অ্যাপ সঙ্গীত শুরু করেছে), AUDIOFOCUS_LOSS_TRANSIENT (অস্থায়ী ক্ষতি — কল, বিজ্ঞপ্তি), AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK (শব্দ কমানোর সম্ভাবনা সহ অস্থায়ী ক্ষতি)। প্রতিটি কোডের নিজস্ব প্রতিক্রিয়া প্রয়োজন।
একজন ব্যবহারকারী অ্যাপ A তে সঙ্গীত শুনছেন। একটি কল আসে — অ্যাপ B (ফোন) AUDIOFOCUS_GAIN_TRANSIENT অনুরোধ করে। সিস্টেম অ্যাপ A কে AUDIOFOCUS_LOSS_TRANSIENT পাঠায়। প্লেয়ার বিরতি নেয়। কল শেষ হওয়ার পরে, অ্যাপ B ফোকাস মুক্ত করে, সিস্টেম AUDIOFOCUS_GAIN এর মাধ্যমে অ্যাপ A কে জানায় — প্লেয়ার প্লেব্যাক পুনরায় শুরু করে। পুরো চেইনটি 50 ms এর কম সময় নেয়।
সঠিক durationHint নির্বাচন করা Audio Focus বাস্তবায়নের সময় মূল সিদ্ধান্ত। ভুল ধরনের নির্বাচন শব্দ ওভারল্যাপিং, অপ্রয়োজনীয় প্লেয়ার বন্ধ, বা ব্যবহারকারীর বিরক্তির দিকে নিয়ে যায়।
| অনুরোধের ধরন | দৃশ্যকল্প | মালিকের প্রতিক্রিয়া |
|---|---|---|
| AUDIOFOCUS_GAIN | সঙ্গীত, পডকাস্ট শুরু করা | AUDIOFOCUS_LOSS — প্লেয়ার বন্ধ হওয়া উচিত |
| AUDIOFOCUS_GAIN_TRANSIENT | কল, ভয়েস বিজ্ঞপ্তি | AUDIOFOCUS_LOSS_TRANSIENT — বিরতি |
| AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK | GPS নির্দেশ, ছোট সংকেত | AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK — শব্দ কমান |
| AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE | ভয়েস অনুসন্ধান, রেকর্ডিং | AUDIOFOCUS_LOSS — সম্পূর্ণ বন্ধ |
ডাক (Duck) হল একটি গৌণ শব্দ বাজানোর সময় প্রধান প্লেয়ারের ভলিউম 20–30% এ অস্থায়ী হ্রাস। Android AudioManager.adjustSuggestedStreamVolume এর মাধ্যমে ম্যানুয়াল ডাকিংয়ের জন্য API সরবরাহ করে, তবে বেশিরভাগ প্লেয়ার নিজস্ব উপায়ে ডাকিং বাস্তবায়ন করে। Android ডকুমেন্টেশন (2026) অনুসারে, ডাক হ্যান্ডলিং 3 সেকেন্ডের বেশি স্থায়ী হওয়া উচিত নয়, এর পরে ভলিউম পুনরুদ্ধার করা হয়।
Audio Focus সঠিকভাবে বাস্তবায়নের জন্য, আপনাকে ক্রমিকভাবে তিনটি ধাপ করতে হবে: একটি অনুরোধ তৈরি করুন, প্লেব্যাকের আগে ফোকাস অনুরোধ করুন এবং কলব্যাকে ইভেন্টটি পরিচালনা করুন। AndroidX মিডিয়া থেকে AudioFocusRequestCompat ব্যবহার সমস্ত Android সংস্করণের সাথে সামঞ্জস্য নিশ্চিত করে।
val audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager
val focusRequest = AudioFocusRequestCompat.Builder()
.setFocusGain(AudioManagerCompat.AUDIOFOCUS_GAIN)
.setOnAudioFocusChangeListener(focusChangeListener)
.build()
val result = AudioManagerCompat.requestAudioFocus(audioManager, focusRequest)
if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
startPlayback()
}
ফোকাস অনুরোধ প্রতিবার ব্যবহারকারী Play চাপলে, প্লেব্যাক শুরুর আগে করা উচিত। যদি ফলাফল AUDIOFOCUS_REQUEST_GRANTED হয় — বাজানো শুরু করুন। যদি DENIED হয় — ব্যবহারকারীকে একটি বার্তা দেখান বা ফোকাস পাওয়া পর্যন্ত প্লেব্যাক স্থগিত করুন।
private val focusChangeListener = AudioManager.OnAudioFocusChangeListener { focusChange ->
when (focusChange) {
AudioManager.AUDIOFOCUS_GAIN -> {
restoreVolume()
if (wasPlayingBeforeLoss) resumePlayback()
}
AudioManager.AUDIOFOCUS_LOSS -> {
pausePlayback()
wasPlayingBeforeLoss = false
}
AudioManager.AUDIOFOCUS_LOSS_TRANSIENT -> {
pausePlayback()
wasPlayingBeforeLoss = true
}
AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK -> {
duckVolume()
}
}
}
কলব্যাকে, AUDIOFOCUS_LOSS এবং AUDIOFOCUS_LOSS_TRANSIENT এর মধ্যে পার্থক্য করা গুরুত্বপূর্ণ। প্রথম ক্ষেত্রে, প্লেয়ারের স্বয়ংক্রিয়ভাবে পুনরায় শুরু হওয়া উচিত নয় — ব্যবহারকারী স্পষ্টভাবে অন্য অডিও শুরু করেছেন। দ্বিতীয় ক্ষেত্রে, এটি AUDIOFOCUS_GAIN প্রাপ্ত হলে স্বয়ংক্রিয়ভাবে পুনরায় শুরু হতে পারে। wasPlayingBeforeLoss ফ্ল্যাগ প্লেব্যাক পুনরুদ্ধার প্রয়োজন কিনা মনে রাখতে সাহায্য করে।
private fun abandonAudioFocus() {
AudioManagerCompat.abandonAudioFocusRequest(audioManager, focusRequest)
}
abandonAudioFocusRequest কল করা সিস্টেমকে জানায় যে অ্যাপের আর ফোকাস প্রয়োজন নেই। প্লেয়ার বিরতি এবং বন্ধ করার সময় এটি কল করা গুরুত্বপূর্ণ। যদি ফোকাস মুক্ত না করা হয়, তাহলে AUDIOFOCUS_GAIN অনুরোধকারী অন্য অ্যাপ LOSS পাবে না এবং শব্দ ওভারল্যাপ হবে।
ফোকাস ক্ষতি সঠিকভাবে পরিচালনা করা Google Play পর্যালোচনা পাস করার জন্য একটি মূল প্রয়োজনীয়তা। ভুল পরিচালনা নেতিবাচক পর্যালোচনার দিকে নিয়ে যায়: ব্যবহারকারীরা অভিযোগ করেন যে কলের সময় বা নেভিগেশনের উপরে সঙ্গীত বাজতে থাকে।
AUDIOFOCUS_LOSS প্রাপ্ত হলে, প্লেয়ার বন্ধ হওয়া উচিত এবং ব্যবহারকারী স্পষ্টভাবে Play না চাপা পর্যন্ত পুনরায় শুরু হওয়া উচিত নয়। AUDIOFOCUS_LOSS_TRANSIENT (কল, বিজ্ঞপ্তি) এ, প্লেয়ার বিরতি নেয় এবং ফোকাস পুনরুদ্ধার হলে স্বয়ংক্রিয়ভাবে পুনরায় শুরু হয়। AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK এ, প্লেয়ার বাহ্যিক অডিও চলাকালীন অস্থায়ীভাবে ভলিউম 20–30% এ কমিয়ে দেয়।
Android ডেভেলপার গাইড (2026) অনুসারে, ডাক বর্তমান AudioTrack ভলিউম স্তরকে 0.2–0.3 এর গুণক দ্বারা গুণ করে বাস্তবায়ন করা উচিত। AudioManager.setStreamVolume ব্যবহার করবেন না — এটি সিস্টেম ভলিউম পরিবর্তন করে এবং অন্যান্য অ্যাপকে প্রভাবিত করে। ডাকিং শুধুমাত্র নিজের প্লেয়ারের পক্ষ থেকে করা হয়।
ইনকামিং কল এ, সিস্টেম স্বয়ংক্রিয়ভাবে ফোন অ্যাপের মাধ্যমে AUDIOFOCUS_GAIN_TRANSIENT অনুরোধ করে। প্লেয়ার AUDIOFOCUS_LOSS_TRANSIENT পায় এবং বিরতি নেয়। কল শেষ হওয়ার পরে বা ব্যবহারকারী কল প্রত্যাখ্যান করলে, ফোকাস ফিরে আসে — প্লেয়ার স্বয়ংক্রিয়ভাবে প্লেব্যাক পুনরায় শুরু করে যদি এটি একটি সঙ্গীত প্লেয়ার হয়।
নেভিগেশন অ্যাপ (Google Maps) এর জন্য, ভয়েস প্রম্পটের সময় AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK ব্যবহার করা হয়। প্লেয়ারের শব্দ 2–3 সেকেন্ডের জন্য কমানো হয়, তারপর ভলিউম পুনরুদ্ধার করা হয়। যদি ব্যবহারকারী সঙ্গীতের পরিবর্তে পডকাস্ট শুনছেন, ডাকিংয়ের চেয়ে বিরতি দেওয়া ভাল — পডকাস্টে প্রতিটি সেকেন্ড গুরুত্বপূর্ণ।
অনুশীলনে, ডেভেলপাররা বেশ কয়েকটি মানক দৃশ্যকল্পের সম্মুখীন হন যেখানে Audio Focus ভিন্নভাবে আচরণ করে। আসুন সাধারণ ক্ষেত্র এবং সঠিক প্রতিক্রিয়াগুলি দেখি।
একটি ফ্ল্যাগ বাস্তবায়ন করা গুরুত্বপূর্ণ যা মনে রাখে ফোকাস ক্ষতির আগে সঙ্গীত বাজছিল কিনা। যদি ব্যবহারকারী নিজে বিরতি দিয়ে থাকেন এবং তারপর কল আসে — পুনরায় শুরু করবেন না। ফ্ল্যাগ ব্যবহারকারীর স্পষ্ট বিরতিতে রিসেট হয় এবং প্লেব্যাক শুরু হলে সেট হয়।
Google UX গবেষণা (2024) অনুসারে, কলের পরে স্বয়ংক্রিয় পুনরায় শুরু ব্যবহারকারীর সন্তুষ্টি 22% বাড়ায়। কিন্তু যদি প্লেয়ার ব্যবহারকারী ইতিমধ্যে ভিডিও দেখা শুরু করার পরে পুনরায় শুরু হয় — এটি বিরক্তি সৃষ্টি করে। wasPlayingBeforeLoss ফ্ল্যাগ ভুল পুনরায় শুরু প্রতিরোধ করে।
সচরাচর জিজ্ঞাসিত প্রশ্ন
হ্যাঁ, Android 12 থেকে শুরু করে, Google Play অডিও চালানো সব অ্যাপের জন্য Audio Focus বাস্তবায়নের সুপারিশ করে। Music & Audio বিভাগের অ্যাপগুলিকে প্রকাশের জন্য এটি বাস্তবায়ন করতে হবে। উপেক্ষা করলে আপডেট প্রত্যাখ্যান হতে পারে।
আপনার প্লেয়ার শুরু করুন, তারপর অন্য একটি অডিও অ্যাপ (যেমন YouTube Music) খুলুন। আপনার প্লেয়ার বিরতি নেওয়া উচিত। তারপর YouTube Music বন্ধ করুন — প্লেয়ার স্বয়ংক্রিয়ভাবে পুনরায় শুরু হওয়া উচিত। ডাক পরীক্ষার জন্য, ভয়েস প্রম্পট সহ Google Maps ব্যবহার করুন।
সিস্টেম বলে: “অন্য একটি অ্যাপকে সংক্ষিপ্তভাবে একটি ছোট শব্দ চালাতে হবে — আপনার প্লেয়ারের শব্দ কমিয়ে দিন।” এটি ভয়েস প্রম্পট এবং ছোট বিজ্ঞপ্তিগুলির জন্য সর্বোত্তম। বাহ্যিক অডিও শেষ হওয়ার পরে ম্যানুয়াল হস্তক্ষেপ ছাড়াই ভলিউম পুনরুদ্ধার করা হয়।
আনুষ্ঠানিকভাবে হ্যাঁ — সিস্টেম বাধ্য করে না। কিন্তু অনুশীলনে এর অর্থ শব্দ ওভারল্যাপিং। ব্যবহারকারী একই সাথে সঙ্গীত এবং কল শুনবেন, যা নেতিবাচক অভিজ্ঞতার দিকে নিয়ে যায়। Google সবসময় প্লেয়ার বন্ধ করে AUDIOFOCUS_LOSS পরিচালনা করার সুপারিশ করে।
iOS এ, সমতুল্য ভূমিকা পালন করে Audio Session, যা AVAudioSession এর মাধ্যমে পরিচালিত হয়। মেকানিজমগুলি একই রকম: বিভাগ এবং বিকল্পগুলি শব্দ ওভারল্যাপিংয়ের সময় আচরণ নির্ধারণ করে। তবে, API এবং নিয়মগুলি উল্লেখযোগ্যভাবে আলাদা — প্রতিটি ফ্রেমওয়ার্ক তার নিজস্ব উপায়ে বাস্তবায়িত।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন