Audio Focus: المفهوم والأنماط والإدارة في Android

المؤلف: IT Sectr نُشر: 2026-05-23 وقت القراءة: 8 دق

Audio Focus هو آلية في Android تنظم الاستخدام المتزامن لمخرج الصوت بواسطة تطبيقات متعددة. يمنع تداخل الأصوات: عندما يبدأ تطبيق ما التشغيل، يقوم النظام تلقائيًا بخفض أو إيقاف تطبيق آخر. وفقًا لـ Android Developer Guide, 2026، فإن Audio Focus إلزامي لجميع التطبيقات التي تشغل الصوت — وبدونه قد يرفض Google Play التحديث.

النقاط الرئيسية

  • Audio Focus هو آلية نظام في Android لتنسيق تشغيل الصوت بين التطبيقات دون تداخل الأصوات.
  • يتم طلب التركيز عبر AudioManager.requestAudioFocus() مع تحديد نوع التشغيل ومدته.
  • يقوم النظام بالإبلاغ عن تغييرات التركيز عبر AudioManager.OnAudioFocusChangeListener مع رموز AUDIOFOCUS_GAIN و LOSS و DUCK.
  • Auto Resume — عند استلام AUDIOFOCUS_LOSS يجب على التطبيق إيقاف التشغيل مؤقتًا واستئنافه عند AUDIOFOCUS_GAIN.
  • يتطلب Android 12+ استخدام AudioFocusRequestCompat من AndroidX لإنشاء طلب التركيز.

ما هو Audio Focus؟

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 وتشغيل الوسائط

من المهم أن نفهم أن Audio Focus لا يتحكم في التشغيل تلقائيًا. إنه فقط يخطر التطبيق بأحداث التركيز. التطبيق يقرر بنفسه: إيقاف المشغل مؤقتًا، أو خفض مستوى الصوت، أو الاستمرار في التشغيل. النظام لا يُجبر — هذا القرار المعماري متروك للمطور.

الاستثناء هو تطبيقات الملاحة (Google Maps، Yandex Maps). يمكنها طلب نوع التركيز AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK، حيث يتم خفض مستوى صوت المشغل الحالي بينما تصدر التوجيهات الصوتية فوقه. بعد انتهاء التوجيه، يستعيد المشغل مستوى الصوت تلقائيًا.

كيف يعمل Audio Focus في Android

يحتفظ النظام بمالك نشط واحد لتركيز الصوت. عندما يطلب تطبيق جديد التركيز، يحدد النظام الأولوية ويرسل حدثًا إلى المالك الحالي. إذا تجاهل المالك الحالي الحدث واستمر في التشغيل بصوت عالٍ، لا يطبق النظام أي عقوبات — تقع المسؤولية بالكامل على المشغل.

يتضمن طلب التركيز معامل durationHint الذي يخبر النظام بالمدة المقدرة: AUDIOFOCUS_GAIN (تشغيل طويل — موسيقى، بودكاست)، AUDIOFOCUS_GAIN_TRANSIENT (قصير المدى — صوت إشعار، ملاحة)، AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK (قصير المدى مع إذن لخفض مستوى المشغل الحالي).

عند فقدان التركيز، يتلقى التطبيق واحدًا من ثلاثة رموز: AUDIOFOCUS_LOSS (فقدان طويل المدى — تطبيق آخر بدأ تشغيل الموسيقى)، AUDIOFOCUS_LOSS_TRANSIENT (فقدان مؤقت — مكالمة، إشعار)، AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK (فقدان مؤقت مع إمكانية خفض الصوت). كل رمز يتطلب رد فعل خاص به.

سلسلة أحداث Audio Focus

مستخدم يستمع إلى الموسيقى في التطبيق A. تصل مكالمة — التطبيق B (الهاتف) يطلب AUDIOFOCUS_GAIN_TRANSIENT. يرسل النظام AUDIOFOCUS_LOSS_TRANSIENT إلى التطبيق A. يتوقف المشغل مؤقتًا. بعد انتهاء المكالمة، يحرر التطبيق B التركيز، يخطر النظام التطبيق A عبر AUDIOFOCUS_GAIN — يستأنف المشغل التشغيل. السلسلة بأكملها تستغرق أقل من 50 مللي ثانية.

أنواع وأنماط طلب Audio Focus

اختيار 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 — إيقاف كامل

خصائص AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK

Duck هو تخفيض مؤقت لمستوى صوت المشغل الرئيسي إلى 20–30% أثناء تشغيل صوت ثانوي. يوفر Android واجهة برمجة تطبيقات للخفض اليدوي عبر AudioManager.adjustSuggestedStreamVolume، لكن معظم المشغلات تنفذ الخفض بوسائلها الخاصة. وفقًا لوثائق Android (2026)، يجب ألا تستغرق معالجة duck أكثر من 3 ثوانٍ، وبعدها يتم استعادة مستوى الصوت.

تنفيذ Audio Focus في الكود

لتنفيذ Audio Focus بشكل صحيح، تحتاج إلى تنفيذ ثلاث خطوات بالتسلسل: إنشاء طلب، طلب التركيز قبل التشغيل، ومعالجة الحدث في رد الاتصال. استخدام AudioFocusRequestCompat من AndroidX media يضمن التوافق مع جميع إصدارات Android.

إنشاء وتنفيذ طلب Audio Focus

kotlin
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 — اعرض رسالة للمستخدم أو أرجئ التشغيل حتى الحصول على التركيز.

رد اتصال تغيير التركيز

kotlin
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 في تذكر ما إذا كان يجب استعادة التشغيل.

تحرير Audio Focus

kotlin
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)، يجب تنفيذ duck بضرب مستوى الصوت الحالي لـ AudioTrack بمعامل 0.2–0.3. لا تستخدم AudioManager.setStreamVolume — هذا يغير مستوى صوت النظام ويؤثر على التطبيقات الأخرى. يتم تنفيذ duck فقط على جانب المشغل الخاص بك.

معالجة المكالمات والملاحة

عند مكالمة واردة، يطلب النظام تلقائيًا AUDIOFOCUS_GAIN_TRANSIENT عبر تطبيق الهاتف. يتلقى المشغل AUDIOFOCUS_LOSS_TRANSIENT ويتوقف مؤقتًا. بعد انتهاء المكالمة أو إذا رفض المستخدم المكالمة، يعود التركيز — يستأنف المشغل التشغيل تلقائيًا إذا كان مشغل موسيقى.

لتطبيقات الملاحة (Google Maps)، يتم استخدام AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK أثناء التوجيهات الصوتية. يتم خفض مستوى صوت المشغل لمدة 2–3 ثوانٍ، ثم يتم استعادة مستوى الصوت. إذا كان المستخدم يستمع إلى بودكاست بدلاً من الموسيقى، فمن الأفضل الإيقاف المؤقت بدلاً من الخفض — كل ثانية مهمة في البودكاست.

سيناريوهات الاستخدام النموذجية

في الممارسة العملية، يواجه المطورون عدة سيناريوهات قياسية حيث يتصرف Audio Focus بشكل مختلف. دعنا نلقي نظرة على الحالات النموذجية وردود الفعل الصحيحة.

  • موسيقى + مكالمة — يتوقف المشغل مؤقتًا (AUDIOFOCUS_LOSS_TRANSIENT). بعد المكالمة، يستأنف تلقائيًا إذا لم يتفاعل المستخدم مع المشغل.
  • موسيقى + ملاحة — يتم خفض صوت المشغل أثناء التوجيه الصوتي (DUCK). يتم استعادة مستوى الصوت بعد انتهاء العبارة.
  • المستخدم قام بتشغيل تطبيق آخر — يتلقى المشغل AUDIOFOCUS_LOSS ويتوقف. الاستئناف فقط عبر زر Play.
  • فيديو + موسيقى في الخلفية — مشغل الفيديو يطلب AUDIOFOCUS_GAIN. مشغل الموسيقى يتلقى LOSS ويتوقف.
  • بحث صوتي (Google Assistant) — يتلقى التطبيق AUDIOFOCUS_LOSS_TRANSIENT، يتوقف مؤقتًا ويستأنف تلقائيًا بعد رد المساعد.

الاستئناف التلقائي بعد فقدان التركيز

من المهم تنفيذ علم يتذكر ما إذا كانت الموسيقى تُشغّل قبل فقدان التركيز. إذا ضغط المستخدم على إيقاف مؤقت بنفسه ثم جاءت مكالمة — لا تستأنف. يتم إعادة تعيين العلم عند الإيقاف المؤقت الصريح من المستخدم ويتم تعيينه عند بدء التشغيل.

وفقًا لأبحاث تجربة المستخدم من Google (2024)، الاستئناف التلقائي بعد المكالمة يزيد رضا المستخدمين بنسبة 22%. ولكن إذا استأنف المشغل بعد أن بدأ المستخدم بالفعل مشاهدة فيديو — فهذا يسبب الإزعاج. العلم wasPlayingBeforeLoss يمنع الاستئنافات الخاطئة.

الأسئلة المتداولة

هل Audio Focus إلزامي لجميع التطبيقات التي تحتوي على صوت؟

نعم، بدءًا من Android 12، يوصي Google Play بتنفيذ Audio Focus لجميع التطبيقات التي تشغل الصوت. تطبيقات فئة الموسيقى والصوت ملزمة بتنفيذه للنشر. تجاهله قد يؤدي إلى رفض التحديث.

كيف أتحقق من أن Audio Focus يعمل بشكل صحيح؟

ابدأ تشغيل المشغل الخاص بك، ثم افتح تطبيق صوت آخر (مثل YouTube Music). يجب أن يتوقف المشغل مؤقتًا. ثم أغلق YouTube Music — يجب أن يستأنف المشغل التشغيل تلقائيًا. لاختبار duck، استخدم Google Maps مع التوجيهات الصوتية.

ما هو AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK عمليًا؟

يقول النظام: «تطبيق آخر يحتاج إلى تشغيل صوت قصير لفترة وجيزة — اخفض صوت المشغل الخاص بك». هذا مثالي للتوجيهات الصوتية والإشعارات القصيرة. يتم استعادة مستوى الصوت بعد انتهاء الصوت الخارجي دون تدخل يدوي.

هل يمكنني رفض طلب فقدان Audio Focus؟

رسميًا نعم — النظام لا يُجبر. لكن عمليًا هذا يعني تداخل الأصوات. سيسمع المستخدم الموسيقى والمكالمة في نفس الوقت، مما يؤدي إلى تجربة سلبية. يوصي Google دائمًا بمعالجة AUDIOFOCUS_LOSS بإيقاف المشغل.

هل يعمل Audio Focus على منصات أخرى غير Android؟

على iOS، الدور المماثل يؤديه Audio Session، الذي يُدار عبر AVAudioSession. الآليات متشابهة: الفئات والخيارات تحدد السلوك عند تداخل الأصوات. ومع ذلك، تختلف واجهة برمجة التطبيقات والقواعد اختلافًا كبيرًا — كل إطار عمل منفذ بطريقته الخاصة.

الخلاصة

  • Audio Focus هو الحكم النظامي للصوت في Android، الذي يمنع تداخل الأصوات بين التطبيقات المختلفة.
  • يتم طلب التركيز عبر AudioFocusRequestCompat مع تحديد durationHint: GAIN أو TRANSIENT أو TRANSIENT_MAY_DUCK.
  • رد الاتصال OnAudioFocusChangeListener يعالج أربعة أحداث: GAIN و LOSS و LOSS_TRANSIENT و LOSS_TRANSIENT_CAN_DUCK.
  • عند AUDIOFOCUS_LOSS يتوقف المشغل؛ عند TRANSIENT — يتوقف مؤقتًا مع استئناف تلقائي؛ عند DUCK — يخفض الصوت.
  • من المهم تتبع العلم wasPlayingBeforeLoss لتجنب الاستئناف بعد إيقاف مؤقت صريح من المستخدم.
  • تحرير التركيز عبر abandonAudioFocusRequest إلزامي عند الإيقاف المؤقت وإيقاف المشغل.
  • على iOS، المعادل لـ Audio Focus هو Audio Session (AVAudioSession) بفئاته وأوضاعه الخاصة.

سنقوم بتطوير تطبيق جوال جاهز

تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.

مناقشة المشروع

اقرأ أيضًا