اعتبارًا من الإصدار 17 من نظام التشغيل Android، يفرض إطار عمل الصوت قيودًا على التفاعلات الصوتية في الخلفية، بما في ذلك تشغيل الصوت وطلبات التركيز على الصوت وواجهات برمجة التطبيقات لتغيير مستوى الصوت لضمان بدء هذه التغييرات بشكل مقصود من قِبل المستخدم.
يجب أن تتضمّن جميع التطبيقات التي تعمل على Android 17 والتي تتضمّن تفاعلات صوتية في الخلفية نشاطًا مرئيًا أو أن تكون قيد تشغيل خدمة تعمل في المقدّمة ليست من النوع SHORT_SERVICE. وينطبق ذلك سواء كان التطبيق يستهدف المستوى 37 من واجهة برمجة التطبيقات أم لا.
إذا كان التطبيق يستهدف الإصدار 17 من نظام التشغيل Android (المستوى 37 لواجهة برمجة التطبيقات)، فهناك قيد إضافي. إذا كان التطبيق قيد التشغيل في الخلفية، يجب أن يشغّل خدمة تعمل في المقدّمة تتضمّن إمكانات أثناء الاستخدام. (يتم منح الخدمة التي تعمل في المقدّمة إمكانات WIU إذا تم تشغيلها استجابةً لعملية بدأها المستخدم أو عندما يكون التطبيق مرئيًا للمستخدم). ومع ذلك، يتم التنازل عن شرط إمكانات WIU إذا تم منح التطبيق إذن المنبّه الدقيق، وكان يُجري تغييرات على عمليات البث الصوتي التي تتضمّن السمة USAGE_ALARM.
إذا حاول التطبيق طلب واجهات برمجة تطبيقات الصوت عندما لا يكون التطبيق في دورة حياة صالحة،
ستتعذّر واجهات برمجة تطبيقات تشغيل الصوت وتغيير مستوى الصوت بدون إرسال
استثناء أو تقديم رسالة تعذُّر. تعذّر تنفيذ واجهة برمجة التطبيقات الخاصة بالتركيز على الصوت وظهر رمز النتيجة AUDIOFOCUS_REQUEST_FAILED.
سبب إجراء هذا التغيير
والهدف من فرض هذه القيود هو الحدّ من تجارب الصوت في الخلفية غير المقصودة التي تتضمّن أخطاء. ومن الأمثلة على ذلك:
- يمكن تجميد التطبيقات التي تشغّل الصوت بدون خدمة تعمل في المقدّمة. وعندما يتم إلغاء تجميد التطبيق في النهاية، يستأنف تشغيل الصوت بشكل غير متوقّع، ربما بعد ساعات.
- واجهت التطبيقات التي تشغّل الصوت بدون خدمة تعمل في المقدّمة قيودًا مختلفة على التشغيل، ما أدى إلى أداء صوتي متقطّع.
- تم فصل التشغيل عن مراحل النشاط، ما قد يؤدي إلى تسرُّب جلسة التشغيل أو تسرُّب أحداث التركيز التي تستمر بدون أي طريقة تتيح للمستخدم إيقاف التشغيل.
ننصح المطوّرين باختبار تطبيقاتهم وتقديم ملاحظاتهم بشأن تغيير السلوك في حال تأثّرت أي حالات استخدام مقصودة للصوت سلبًا. يُرجى الإبلاغ عن أي مشاكل باستخدام أداة تتبُّع مشاكل توافق التطبيقات مع Android 17.
تحديد حالات استخدام الصوت في الخلفية المتأثرة
راجِع طريقة تنفيذ ميزة تشغيل الصوت وحدِّد ما إذا كان تطبيقك يهدف إلى توفير وظيفة التفاعل الصوتي في الخلفية حتى في الظروف المشروطة.
إذا كان تطبيقك يهدف فقط إلى تشغيل الصوت أو استخدام واجهات برمجة التطبيقات الصوتية أثناء عرض نشاط يظهر للمستخدم، بما في ذلك استخدام وضع "نافذة ضمن النافذة" (PiP)، فلن يتأثر بأي من هذه التغييرات.
إذا كان تطبيقك يوفّر وظائف بروتوكول VoIP، بما في ذلك تطبيقات مكالمات الفيديو، يجب أن يستوفي المتطلبات التي يتم تقديمها للتشغيل (عادةً من خلال استخدام واجهات برمجة تطبيقات الاتصالات المقترَحة) لتسجيل الصوت بنجاح، وبالتالي من غير المرجّح أن يتأثر بهذا التغيير.
إذا كان تطبيقك يهدف إلى مواصلة تشغيل الصوت عندما تكون الشاشة مغلقة أو عندما يكون نشاطك غير مرئي، وهو ما يظهر عادةً في تطبيقات بث الموسيقى أو تطبيقات البودكاست، يُعتبر تطبيقك يوفّر وظيفة تشغيل الصوت في الخلفية ويجب أن يستوفي المتطلبات الجديدة.
حالات استخدام الصوت في الخلفية التي من المرجّح أن تتأثر
إذا لم يتّبع تطبيقك نموذج مواصلة التفاعل الصوتي الذي بدأ أثناء فتح تطبيقك، أو استجابةً لإجراء صريح من المستخدم، فمن المرجّح أن يتم إيقاف وظائف تطبيقك تلقائيًا.
على سبيل المثال، إذا بدأ تطبيقك خدمة تعمل في المقدّمة استجابةً لـ BOOT_COMPLETE وحاول التفاعل مع الصوت، سيتم إيقاف الخدمة.
أفضل الممارسات المتعلقة بالصوت في الخلفية للحدّ من التأثير
استخدِم مكوّن
MediaSessionServiceفي مكتبة Jetpack media3 لإدارة تشغيل الصوت في الخلفية.في هذه الحالة، من غير المرجّح أن يتأثر تطبيقك بعملية تعزيز الأمان في الخلفية لأنّ المكتبة تساعد في إدارة مراحل تشغيل الوسائط.
إذا لم تكن تستخدم مكتبة media3، عليك بدء خدمة
mediaPlaybackتعمل في المقدّمة يدويًا. يجب دائمًا بدء خدمة تعمل في المقدّمة عندما يكون التطبيق في المقدّمة إذا كان من المحتمل تشغيل الصوت في الخلفية.على سبيل المثال، إذا كان تطبيقك مخصّصًا لبثّ الفيديوهات ويعمل عادةً في المقدّمة فقط، ولكنه يتيح للمستخدم مواصلة التشغيل عندما تكون الشاشة مغلقة، فعندما يبدأ المستخدم تشغيل الفيديو، يجب أن يبدأ تطبيقك خدمة تعمل في المقدّمة.
يضمن ذلك بدء الخدمة التي تعمل في المقدّمة بإمكانات WIU.
يجب إبقاء
mediaPlaybackFGS نشطًا أثناء حالات الفشل المؤقتة التي تقل مدتها عن 10 دقائق.إذا حدث عطل مؤقت في تطبيقك، مثل مشكلة في التخزين المؤقت بسبب نشاط الشبكة، أو إذا كان هناك انقطاع مؤقت متوقّع مثل
AUDIOFOCUS_LOSS_TRANSIENT، يجب أن يستمر تشغيل المحتوى. وبالتالي، يجب أن يظلّ FGS نشطًا.أوقِف الخدمة التي تعمل في المقدّمة في نهاية التشغيل وأعِد تشغيل المحتوى فقط إذا استأنف المستخدم التشغيل بشكل صريح.
في حال تلقّي إشارة دائمة لإنهاء التشغيل (على سبيل المثال، اكتمال تشغيل المحتوى بدون تشغيل تلقائي، أو تلقّي
AUDIOFOCUS_LOSS، أو حدث إيقاف مؤقت من UMO، أو حدث مفتاح وسائط) أو حدوث عطل غير قابل للاسترداد، يجب أن يوقف تطبيقك التفاعل الصوتي، ويوقف الخدمة التي تعمل في المقدّمة، وينهي جلسة الوسائط. ويعني تنفيذ كل هذه الإجراءات أنّ المستخدم قد "أنهى" التفاعل المطلوب مع الصوت في الخلفية. بعد إجراء ذلك، لن يتمكّن تطبيقك من التفاعل مع الصوت في الخلفية.بعد ذلك، إذا استأنف المستخدم تشغيل الوسائط صراحةً، على سبيل المثال من خلال واجهة مستخدم تطبيقك أو من خلال زر التشغيل في Universal Media Object، يجب أن يعود الغرض من بدء تشغيل الصوت، ما يؤدي إلى بدء خدمة تعمل في المقدّمة من جديد.
اختبِر سلوك تشغيل الصوت باستخدام أوامر adb shell.
اختبار التغييرات
يمكنك اختبار امتثال تطبيقك على التطبيقات التي تعمل بنظام التشغيل Android 17 أو الإصدارات الأحدث (بدءًا من الإصدار التجريبي 3) من خلال تنفيذ أمر ADB التالي:
adb shell cmd audio set-enable-hardening <enable|disable|throw>
يتضمّن هذا الأمر الخيارات التالية:
enable: يتيح هذا الخيار تفعيل جميع قيود تعزيز أمان الصوت لجميع التطبيقات. ينطبق شرط الخدمات التي تعمل في المقدّمة أثناء الاستخدام سواء كان التطبيق يستهدف الإصدار 17 من نظام التشغيل Android (المستوى 37 من واجهة برمجة التطبيقات) أم لا. بالإضافة إلى ذلك، يتم فرض هذا الشرط حتى إذا كان التطبيق يُجري تغييرات على أحداث المنبّهات وكان لديه إذن المنبّه الدقيق.
disable: لإيقاف جميع قيود تعزيز أمان الصوت
throw: يتيح هذا الإعداد تفعيل جميع قيود تعزيز أمان الصوت لجميع التطبيقات، مثلenable. بالإضافة إلى ذلك، يتيح هذا الخيار إظهار الأخطاء الواضحة، ما يؤدي إلى ظهورIllegalStateExceptionللتفاعلات المتعلقة بمستوى الصوت والتركيز. بالنسبة إلى تشغيل الصوت، تعرض طريقة الكتابة رمز خطأ باستمرار. أما في أوضاع التشغيل التي لا تتضمّن عمليات كتابة صريحة، فيتعطّل التطبيق.
استخدِم adb dumpsys audio أو logcat لتحديد ما إذا كان التطبيق قد واجه حالات تعطُّل
صامتة بسبب فرض إجراءات تعزيز أمان الصوت. إذا تم ذلك، سيكون هناك إدخال
مسبوق بـ AudioHardening مع اسم الحزمة. إذا كانت الرسالة تحتوي على
level: full، يعني ذلك أنّ تطبيقك يشغّل خدمة تعمل في المقدّمة، ولكنّ الخدمة لا تتضمّن إمكانية الوصول إلى الموقع الجغرافي أثناء الاستخدام. إذا كانت الرسالة تحتوي على level: partial، يعني ذلك أنّ تطبيقك لا يشغّل أي خدمة تعمل في المقدّمة على الإطلاق.
فهم خدمة تعمل في المقدّمة (FGS) مع إمكانية الوصول إلى الموقع الجغرافي أثناء الاستخدام
بشكل عام، يجب تشغيل الخدمات التي تعمل في المقدّمة (FGS) عندما يكون التطبيق في المقدّمة لتوسيع نطاق العمليات التي يبدأها المستخدم. في بعض الحالات المحدّدة، يُسمح للتطبيقات بتشغيل خدمة تعمل في المقدّمة عندما يكون التطبيق قيد التشغيل في الخلفية. ومع ذلك، لا يتم عادةً منح هذه الخدمات التي تعمل في المقدّمة إمكانات "أثناء الاستخدام" (WIU).
تعمل ميزة WIU كبوابة أمان، فهي تمنع الخدمات التي تعمل في المقدّمة (FGS) والتي تبدأ من الخلفية من المشاركة في بعض السلوكيات الحسّاسة عندما لا يكون المستخدم على دراية بنشاط التطبيق. ويمنع التطبيق من الوصول إلى البيانات الحسّاسة، مثل الموقع الجغرافي أو الكاميرا أو الميكروفون، كما يحظر واجهات برمجة التطبيقات الصوتية التي تتطلّب عادةً سياقًا مرئيًا لواجهة المستخدم، وذلك اعتبارًا من الإصدار Android 17.
إليك مرجعًا مفيدًا:
- الخدمات العادية التي تعمل في المقدّمة: يتم منح إذن الوصول إلى WIU للخدمات التي تبدأ أثناء ظهور التطبيق أو التي تم منحها إمكانية بدء النشاط في الخلفية.
- الخدمات التي تعمل في المقدّمة والتي تبدأ في الخلفية (BFSL): لا يمنح معظمها إذن الوصول أثناء الاستخدام. الاستثناءات الأساسية التي تمنح WIU هي التفاعلات التي تتضمّن نية صريحة للمستخدم، مثل النقرات على الإشعارات أو التفاعلات مع التطبيقات المصغّرة أو أحداث مفاتيح الوسائط من جهاز خارجي.
- الخدمات التي تعمل في المقدّمة (FGS) ويبدأها النظام: يتم منح الخدمات التي تعمل في المقدّمة إذن الوصول إلى WIU إذا تم
بدؤها من خلال تفويض خادم النظام (على سبيل المثال، من مكتبة Telecom Jetpack)
أو من خلال عمليات ربط النظام التي تمثّل حالة مرتفعة للخدمات التي تعمل في المقدّمة
لأداء وظائف مخصّصة (مثل
VoiceInteractionService).
يمكنك الاطّلاع على مزيد من المعلومات في مقالة القيود المفروضة على بدء خدمة تعمل في المقدّمة من الخلفية.
القائمة الكاملة لواجهات برمجة التطبيقات الصوتية المتأثرة
وظيفة الصوت |
النتيجة |
واجهات برمجة التطبيقات المتأثرة |
تشغيل الصوت |
تم كتم صوت التشغيل لا تتوفّر أي استثناءات أو رسائل خطأ من أي واجهة برمجة تطبيقات |
(NDK) OpenSL ES لنظام التشغيل Android وقد تتأثر أيضًا أي مكتبات وسائط من جهة العميل تدير عملية التشغيل، مثل media3 وExoplayer وOboe. |
طلب التركيز على الصوت |
عرض لا يؤثر في تشغيل الصوت في التطبيقات الأخرى، ولا يتم التركيز عليه |
|
واجهات برمجة التطبيقات الخاصة بمستوى الصوت ووضع الرنين |
لا تأثير على وضع الرنين أو مستوى الصوت (يتم تجاهل طلب الإجراء بدون إشعار) لا تتوفّر أي استثناءات أو رسائل خطأ من أي واجهة برمجة تطبيقات |
|