قبل بدء مصدر بيانات منطقي، يطلب التطبيق التركيز على الصوت باستخدام سمات الصوت نفسها المستخدَمة في مصدر البيانات المنطقي. يجب أن يراعي التطبيق خسائر تركيز العميل ليعمل على النحو المتوقّع في حالات الاستخدام المتعلقة بالسيارات.
على الرغم من أنّه يُنصح بإرسال طلب التركيز، لا يفرض النظام ذلك. لذلك، ننصحك باستخدام ميزة "التركيز" كآلية للتحكم بشكل غير مباشر في الصوت وتجنّب حدوث تعارض أثناء التشغيل، بدلاً من استخدامها كآلية أساسية للتحكّم في الصوت. يجب ألا تعتمد المركبة على نظام التركيز لتشغيل النظام الفرعي للصوت.
التفاعلات التي تركّز على
لدعم AAOS، تتم معالجة طلبات التركيز الصوتي استنادًا إلى تفاعلات مُحدَّدة مسبقًا بين CarAudioContext
للطلب وCarAudioContext
لمالكي التركيز الحاليين. هناك ثلاثة أنواع من التفاعلات:
- عرض حصري
- رفض
- متزامنة
تفاعل حصري
هذا هو نموذج التفاعل الأكثر استخدامًا مع Android.
في التفاعلات الحصرية، يُسمح لتطبيق واحد فقط بجذب الانتباه في كل مرة.
لذلك، يتم منح طلب التركيز الوافد التركيز بينما يفقد حامل التركيز الحالي
التركيز. بما أنّ كلا التطبيقَين يشغّلان الوسائط، يُسمح لتطبيق واحد فقط بشدّ
التركيز. نتيجةً لذلك، يتم عرض طلب التركيز للتطبيق الذي تم تشغيله حديثًا مع AUDIOFOCUS_REQUEST_GRANTED
، بينما يتلقّى التطبيق الذي يشغّل الموسيقى حاليًا حدث
تغيير التركيز مع حالة فقدان تتوافق مع نوع الطلب الذي تم تقديمه.
رفض التفاعل
في حال إجراء تفاعلات رفض، يتم دائمًا رفض الطلب الوافد. على سبيل المثال، عند محاولة تشغيل الموسيقى أثناء إجراء مكالمة. في هذه الحالة، إذا كان تطبيق "أداة الاتصال" يحافظ على تركيز الصوت لمكالمة، وطلب تطبيق ثانٍ التركيز لتشغيل الموسيقى، سيتلقّى تطبيق الموسيقى AUDIOFOCUS_REQUEST_FAILED
استجابةً للطلب. بما أنّه تم رفض طلب التركيز، لن يتم إرسال أي إشعار بشأن فقدان التركيز
إلى صاحب التركيز الحالي.
التفاعل المتزامن
إنّ التفاعلات المتزامنة هي فريدة من نوعها في AAOS. ويمنح ذلك التطبيقات التي تطلب ميزة "عدم إزعاج" للصوت في السيارة إمكانية الاحتفاظ بالتركيز في الوقت نفسه مع التطبيقات الأخرى. لكي يحدث تفاعل متزامن، يجب استيفاء الشروط التالية. في ما يلي:
يجب أن يطلب طلب التركيز الواردة AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK
لا يستخدم عنصر التركيز الحالي setPauseWhenDucked(true)
اختيار عدم تلقّي أحداث خفض الصوت من مالك التركيز الحالي
في حال استيفاء هذه المعايير، يتم عرض طلب التركيز مع
AUDIOFOCUS_REQUEST_GRANTED
بينما لا يحدث أي تغيير في
focus لصاحب التركيز الحالي. ومع ذلك، إذا اختار عنصر التركيز الحالي تلقّي أحداث إخفاء أو
إيقاف مؤقت عند إخفائه، سيفقد عنصر التركيز الحالي التركيز، كما يحدث مع
التفاعل الحصري.
التعامل مع أحداث البث المتزامنة
على الرغم من أنّ التفاعل المتزامن له استخدامات عديدة، يجب الانتباه إلى عملية المزج والخفض على مستوى الأجهزة في جميع أجهزة الإخراج. ننصح بشدة بأن يتم توجيه
CarAudioContext
المسموح بتشغيلها بشكل متزامن إلى
أجهزة إخراج مختلفة.
من خلال استخدام أجهزة إخراج منفصلة لأحداث البث المتزامنة، يمكن لوحدة HAL خفض مستوى صوت أحد أحداث البث قبل مزجها، أو توجيه أحداث البث المادية إلى مكبّرات صوت مختلفة في المركبة. في حال تم دمج أحداث البث المنطقية في Android، لا يتم تغيير المكاسب ويتم عرضها كجزء من حدث البث المادي نفسه.
على سبيل المثال، عند عرض الوسائط والتنقّل في الوقت نفسه، يمكن خفض مستوى إشارة بث الوسائط مؤقتًا (أو كتم صوته) لكي تتمكّن منسماع تعليمات التنقّل بوضوح أكبر. بدلاً من ذلك، يمكن توجيه بث التنقّل إلى مكبّرات الصوت في جانب السائق مع مواصلة تشغيل الوسائط في بقية المقصورة.
مصفوفة التفاعل
يعرض الجدول التالي مصفوفة التفاعل كما حدّدها CarAudioService
.
يمثّل كل صف CarAudioContext
الخاص بصاحب التركيز الحالي، ويمثّل كل عمودCarAudioContext
الخاص بالطلب الوافد.
على سبيل المثال، عندما يحافظ تطبيق وسائط الموسيقى على التركيز بينما يطلب تطبيق التنقّل التركيز، تشير المصفوفة إلى أنّه يمكن تشغيل التفاعلَين بشكل متزامن، بافتراض استيفاء المعايير الأخرى للتفاعلات المتزامنة.
بسبب التفاعلات المتزامنة، من الممكن أن يكون هناك أكثر من عنصر واحد يجذب الانتباه. في هذه الحالة، تتم مقارنة طلب التركيز الوافد بكل من أصحاب التركيز الحاليين قبل تحديد التفاعل الذي سيتم تطبيقه. في هذه الحالة، يفوز التفاعل الأكثر تحفظًا. رفض، ثم حصري، ثم متزامن.
الشكل 1: مصفوفة التفاعل مع ميزة "التركيز على الصوت"
التنقّل أثناء المكالمات الهاتفية
في Android 11، تمّ تقديم إعداد جديد للمستخدمين للسماح لهم بتغيير
سلوك التفاعل بين التنقّل والمكالمات الهاتفية. عند ضبط القيمة
android.car.KEY_AUDIO_FOCUS_NAVIGATION_REJECTED_DURING_CALL
، يتم تغيير
التفاعل بين طلبات التركيز الواردة من NAVIGATION
وأصحاب CALL
التركيز الحاليين من متزامنة إلى مرفوضة. إذا كان المستخدم يفضّل عدم انقطاع المكالمة بسبب تعليمات التنقّل، يمكنه تفعيل هذا الإعداد. ويتم الاحتفاظ بهذه القيمة
للمستخدم، ويمكن ضبطها ديناميكيًا لكي تراعي طلبات تركيز
اللاحقة الإعداد الجديد.
ميزة "التركيز على الصوت" التي يمكن تأخيرها
في Android 11، أضافت AAOS إمكانية طلب ميزة تركيز الصوت القابل للتأخير. يتيح ذلك تأخير طلبات التركيز غير المؤقتة عندما يؤدي تفاعلها مع حائزي التركيز الحاليين إلى رفضها عادةً. بعد أن يؤدي تغيير في التركيز إلى حالة يمكن فيها للطلب المتأخر الحصول على التركيز، يتم منح الطلب.
قواعد طلبات التركيز على الصوت المتأخرة
الطلبات غير المؤقتة فقط: لا يمكن تقديم طلب متأخر إلا لملف صوتي غير عابر، وذلك لتجنّب تشغيل صوت عابر بعد وقت طويل من انتهاء المقطع الصوتي ذي الصلة.
يمكن تأخير طلب واحد فقط في كل مرة. إذا تم تقديم طلب قابل للتأخير بينما كان هناك طلب متأخر، يتلقّى الطلب الأصلي المتأخر حدث تغيير
AUDIOFOCUS_LOSS
ويتلقّى الطلب الجديد استجابة متزامنة من النوعAUDIOFOCUS_REQUEST_DELAYED
.يجب أن تتضمّن الطلبات التي يمكن تأخيرها
OnAudioFocusChangeListener
. بعد تأخير أحد الطلبات، يتم استخدام المستمع لإعلام مقدّم الطلب عندما تتم الموافقة على الطلب في النهاية (AUDIOFOCUS_GAIN
)، أو إذا تم رفضه لاحقًا (AUDIOFOCUS_LOSS
).
طلب التركيز الذي يمكن تأخيره
لإنشاء طلب يمكن تأخيره:
استخدم
AudioFocusRequest.Builder#setAcceptsDelayedFocusGain
.mMediaWithDelayedFocusListener = new MediaWithDelayedFocusListener(); mDelayedFocusRequest = new AudioFocusRequest .Builder(AudioManager.AUDIOFOCUS_GAIN) .setAudioAttributes(mMusicAudioAttrib) .setOnAudioFocusChangeListener(mMediaWithDelayedFocusListener) .setForceDucking(false) .setWillPauseWhenDucked(false) .setAcceptsDelayedFocusGain(true) .build();
عند تقديم الطلب، عليك معالجة الردّ
AUDIOFOCUS_REQUEST_DELAYED
:int delayedFocusRequestResults = mAudioManager.requestAudioFocus(mDelayedFocusRequest); if (delayedFocusRequestResults == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { // start audio playback return; } if (delayedFocusRequestResults == AudioManager.AUDIOFOCUS_REQUEST_DELAYED) { // audio playback delayed to audio focus listener return; }
عندما يتأخّر الطلب، يعالج مستمع التركيز التغييرات في التركيز:
private final class MediaWithDelayedFocusListener implements OnAudioFocusChangeListener { @Override public void onAudioFocusChange(int focusChange) { synchronized (mLock) { switch (focusChange) { case AudioManager.AUDIOFOCUS_GAIN: … // Start focus playback case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT: … // Pause media transiently case AudioManager.AUDIOFOCUS_LOSS: … // Stop media
إدارة التركيز على مناطق متعدّدة
في المركبات التي تتضمّن مناطق صوتية متعددة، تتم إدارة تركيز الصوت بشكلٍ مستقل في كل منطقة. وبناءً على ذلك، لا يأخذ الطلب المرسَل إلى منطقة معيّنة في الاعتبار ما يلي: العناصر التي تجذب الانتباه في المناطق الأخرى، ولا يؤدي إلى فقدان الانتباه في المناطق الأخرى. وبفضل ذلك، يمكن إدارة تركيز المقصورة الرئيسية بشكل منفصل عن نظام الترفيه في المقاعد الخلفية، وبالتالي عدم مقاطعة تشغيل الصوت في منطقة معيّنة بسبب التغييرات التي يتم إجراؤها في منطقة أخرى.
بالنسبة إلى جميع التطبيقات، يدير CarAudioService
التركيز تلقائيًا. يتم تحديد منطقة الصوت لطلب تركيز
حسب UserId
أو UID
المرتبط به
(للحصول على التفاصيل، يُرجى الاطّلاع على توجيه الصوت في مناطق متعدّدة).
طلب الصوت من مناطق متعددة في الوقت نفسه
إذا أراد تطبيق تشغيل الصوت في مناطق متعدّدة في الوقت نفسه، يجب أن يطلب
التركيز على كل منطقة من خلال تضمين AUDIOFOCUS_EXTRA_REQUEST_ZONE_ID
في
الحزمة:
//Create attribute with bundle and AUDIOFOCUS_EXTRA_REQUEST_ZONE_ID
Bundle bundle = new Bundle();
bundle.putInt(CarAudioManager.AUDIOFOCUS_EXTRA_REQUEST_ZONE_ID,
zoneId);
AudioAttributes attributesWithZone = new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.addBundle(bundle)
.build();
//Create focus request using built attributesWithZone
تسمح مَعلمة الحِزمة هذه للمقدّم بتجاوز عمليات ربط مناطق الصوت التلقائية لاستخدام معرّف المنطقة المحدّد بدلاً من ذلك. وبالتالي، يمكن للتطبيق إرسال طلبات منفصلة للمناطق الصوتية المختلفة.
التركيز على الصوت في HAL
بدءًا من Android 11، يتم تفعيل HAL لطلب التركيز نيابةً عن البث الخارجي. على الرغم من أنّ استخدام واجهات برمجة التطبيقات هذه اختياري، إلا أنّنا ننصحك بشدة باستخدامها ل السماح للأصوات الخارجية بالمشاركة بشكلٍ مثالي في المنظومة المتكاملة لنظام التشغيل Android و لتوفير تجربة سلسة للمستخدم.
يتّخذ HAL القرار النهائي بشأن الأصوات التي يجب أن تحظى بالأولوية. لهذا السبب، يجب تشغيل الأصوات المهمة للطوارئ والسلامة بغض النظر عما إذا كان قد تم منح HAL تركيز الصوت أم لا، ويجب مواصلة تشغيلها كما هو مناسب حتى إذا فقد HAL تركيز الصوت. وينطبق الأمر نفسه على أي أصوات مطلوبة بموجب اللوائح الحكومية.
يجب أن يتم بشكل استباقي كتم صوت أحداث البث على Android حسب الاقتضاء عند تشغيل أصوات الطوارئ أو الأصوات المهمة للسلامة لضمان سماعها بوضوح.
AudioControl@2.0
يقدّم الإصدار 2.0 من AudioControl HAL واجهات برمجة التطبيقات الجديدة التالية:
واجهة برمجة التطبيقات | الغرض |
---|---|
IAudioControl#registerFocusListener |
تسجيل مثيل من IFocusListener باستخدام
واجهة برمجة التطبيقات AudioControl HAL يتيح هذا المستمع لـ HAL طلب تركيز الصوت وعدم التركيز عليه. يوفّر HAl مثيل ICloseHandle ليستخدمه
نظام التشغيل Android لإلغاء تسجيل المستمع. |
IAudioControl#onAudioFocusChange |
إرسال إشعارات إلى HAL بالتغييرات في حالة طلبات التركيز التي يقدّمها HAL
من خلال IFocusListener ، بما في ذلك الردود على طلبات التركيز
الأولية |
IFocusListener#requestAudioFocus
| تطلب HAL التركيز نيابةً عنك لاستخدام محدّد، وعنوان منطقة محدّد، ونوع اكتساب التركيز. |
IFocusListener#abandonAudioFocus |
يتخلّى عن طلبات التركيز الحالية في HAL للاستخدام والمنطقة المحدّدَين Id. |
يمكن أن تتضمّن HAL طلبات تركيز متعددة في الوقت نفسه، ولكن يقتصر ذلك على طلب واحد لكل إقران بين الاستخدام ورقم تعريف المنطقة. يفترض Android أنّ HAL يبدأ على الفور في تشغيل الأصوات لاستخدام معيّن بعد تقديم طلب، ويواصل ذلك إلى أن يتخلّى عن التركيز.
باستثناء registerFocusListener
، تكون هذه الطلبات oneway
لضمان عدم تأخير نظام التشغيل Android لوحدة HAL أثناء معالجة طلب التركيز. يجب أن لا ينتظر HAL اكتساب التركيز قبل تشغيل الأصوات المهمة للسلامة. من الخيارات المتاحة
أن يستمع HAL إلى التغييرات في تركيز الصوت ويستجيب لها من خلال
IAudioControl#onAudioFocusChange
.
خدمة ميزة "أولوية الصوت" في السيارة من المصنّع الأصلي للجهاز
في Android 14، قدّم نظام التشغيل AAOS خدمات المكوّنات الإضافية للمصنع الأصلي للسيارة لتفعيل إمكانية ضبط بعض مكوّنات السيارة. بالنسبة إلى خدمة المكوّن الإضافي لنظام الصوت في السيارة، تسمح خدمة المكوّن الإضافي للمصنّعين الأصليّين للسيارات بإدارة طلبات التركيز التي تعترضها خدمة نظام الصوت في السيارة. ويمنح ذلك المصنّعين الأصليّين للسيارات مزيدًا من المرونة من حيث إدارة التركيز على النحو المطلوب بموجب القواعد واللوائح التنظيمية. وبالتالي، قد يختلف التفاعل مع ميزة "التركيز على الصوت" بين الشركات المصنّعة ومن منطقة إلى أخرى. لا يزال المبدأ الأساسي لميزة "التركيز على الصوت" ساريًا، إذ يجب أن تطلب التطبيقات التركيز على الصوت لإدارة الصوت بشكلٍ أفضل لتحسين تجربة المستخدم. بشكل عام، لا تزال قواعد معيّنة تنطبق على طلب التطبيقات للتركيز على الصوت:
بدون أي تركيز صوتي دائم ذي أولوية عالية (بما في ذلك مكالمة هاتفية أو إشارة تنبيه في حالات الطوارئ أو إشعار أمان)، يجب أن تتمكّن التطبيقات من الحصول على تركيز صوتي إما بشكل مؤقت أو دائم.
أثناء تفعيل ميزة "تركيز على الوسائط":
يجب أن تكون التطبيقات التي تطلب التركيز على استخدام المكالمات قادرة على تلقّي المكالمة إما بالتزامن أو بشكل حصري.
يجب أن تكون التطبيقات التي تطلب الحصول على إطار التركيز في استخدام التنقّل قادرة على الحصول على إطار التركيز في استخدام التنقّل إما بشكل متزامن أو حصري.
يجب أن تكون التطبيقات التي تطلب تركيز استخدام المساعد قادرة على تلقّي تركيز الاستخدام سواء بشكل متزامن أو حصري.
عندما تكون تطبيقات التركيز الصوتي ذات الأولوية العالية (بما في ذلك مكالمة هاتفية أو تنبيه طوارئ أو إشعار أمان) نشطة، يجب منح أي طلب وارد لتركيز الصوتي المؤجّل أو تأجيله حسب الحاجة.
على الرغم من أنّ الاقتراحات الواردة أعلاه ليست شاملة، يمكنها مساعدة التطبيقات التي تطلب التركيز في الحصول على التركيز إذا لم تكن هناك أصوات نشطة ذات أولوية عالية. حتى عندما تكون الأصوات ذات الأولوية العالية مفعّلة، يجب أن يتم الالتزام بطلبات التركيز المتأخرة ويجب أن يكون بإمكانها التركيز عندما يتوقف الصوت ذو الأولوية العالية.