اعتبارًا من الإصدار 17 من نظام التشغيل Android، يفرض إطار عمل الصوت قيودًا على التفاعلات الصوتية في الخلفية، بما في ذلك تشغيل الصوت وطلبات التركيز على الصوت وواجهات برمجة التطبيقات لتغيير مستوى الصوت، وذلك لضمان بدء هذه التغييرات بشكل مقصود من قِبل المستخدم.
يجب أن تتضمّن جميع التطبيقات التي تعمل على Android 17 وتتضمّن تفاعلات صوتية في الخلفية نشاطًا مرئيًا أو أن تشغّل خدمة تعمل في المقدّمة من النوع غير SHORT_SERVICE. ينطبق ذلك سواء كان التطبيق يستهدف المستوى 37 من واجهة برمجة التطبيقات أم لا.
إذا كان التطبيق يستهدف الإصدار 17 من نظام التشغيل Android (المستوى 37 لواجهة برمجة التطبيقات)، سيتم فرض قيود إضافية. إذا كان التطبيق يعمل في الخلفية، يجب أن يشغّل خدمة تعمل في المقدّمة تتضمّن إمكانات أثناء الاستخدام. (يتم منح الخدمة التي تعمل في المقدّمة إمكانات "الاستخدام أثناء عدم الاتصال بالإنترنت" إذا تم تشغيلها استجابةً لعملية بدأها المستخدم أو أثناء ظهور التطبيق للمستخدم). ومع ذلك، يتم التنازل عن شرط توفُّر إمكانات WIU إذا تم منح التطبيق إذن المنبّه الدقيق، وكان التطبيق يجري تغييرات على بث الصوت الذي يتضمّن السمة USAGE_ALARM.
إذا حاول التطبيق استدعاء واجهات برمجة تطبيقات الصوت أثناء عدم توفّره في دورة حياة صالحة، سيتعذّر عمل واجهات برمجة تطبيقات تشغيل الصوت وتغيير مستوى الصوت تلقائيًا بدون عرض استثناء أو تقديم رسالة خطأ. تعذُّر إكمال طلب البيانات من واجهة برمجة التطبيقات الخاصة بأولويّة الصوت مع ظهور رمز النتيجة AUDIOFOCUS_REQUEST_FAILED.
سبب إجراء هذا التغيير
والهدف من فرض هذه القيود هو الحدّ من المشاكل غير المقصودة في تشغيل الصوت في الخلفية. ومن الأمثلة على ذلك:
- يمكن تجميد التطبيقات التي تشغّل الصوت بدون خدمة تعمل في المقدّمة. وعندما يتم إلغاء تجميد التطبيق في النهاية، يستأنف تشغيل الصوت بشكل غير متوقّع، وقد يحدث ذلك بعد ساعات.
- واجهت التطبيقات التي تشغّل الصوت بدون خدمة تعمل في المقدّمة قيودًا مختلفة على التشغيل، ما أدّى إلى تشغيل الصوت بشكل متقطّع.
- يتم فصل التشغيل عن مراحل نشاط التطبيق، ما قد يؤدي إلى تسريب جلسة التشغيل أو أحداث التركيز التي تستمر بدون أن يتمكّن المستخدم من إيقاف التشغيل.
ننصح المطوّرين باختبار تطبيقاتهم وتقديم ملاحظات حول التغيير في السلوك إذا كانت هناك أي حالات استخدام مقصودة للصوت تأثّرت سلبًا. يُرجى الإبلاغ عن أي مشاكل باستخدام أداة تتبُّع مشاكل توافق التطبيقات مع الإصدار 17 من نظام التشغيل Android.
تحديد حالات استخدام الصوت في الخلفية المتأثرة
راجِع عملية تنفيذ تشغيل الصوت وحدِّد ما إذا كان تطبيقك يهدف إلى توفير وظيفة التفاعل مع الصوت في الخلفية حتى في الظروف المشروطة.
إذا كان تطبيقك يهدف فقط إلى تشغيل الصوت أو استخدام واجهات برمجة تطبيقات الصوت أثناء عرض نشاط مرئي للمستخدم، بما في ذلك استخدام وضع "نافذة ضمن النافذة"، فلن يتأثر بأي من هذه التغييرات.
إذا كان تطبيقك يوفّر وظائف بروتوكول نقل الصوت عبر الإنترنت (VOIP)، بما في ذلك تطبيقات مكالمات الفيديو، يجب أن يستوفي المتطلبات التي سيتم طرحها بشأن التشغيل (عادةً من خلال استخدام واجهات برمجة التطبيقات الخاصة بالاتصالات المقترَحة) لتسجيل الصوت بنجاح، وبالتالي من غير المرجّح أن يتأثر.
إذا كان تطبيقك يهدف إلى مواصلة تشغيل الصوت عندما تكون الشاشة مطفأة أو عندما لا يكون نشاطك مرئيًا، وهو ما يحدث عادةً في تطبيقات بث الموسيقى أو تطبيقات البودكاست، يُعدّ تطبيقك يوفّر وظيفة تشغيل الصوت في الخلفية ويجب أن يستوفي المتطلبات الجديدة.
سيناريوهات الصوت في الخلفية التي من المحتمل أن تتأثر
إذا كان تطبيقك لا يتّبع نموذج مواصلة التفاعل الصوتي الذي بدأ أثناء فتح تطبيقك أو استجابةً لإجراء صريح من المستخدم، فمن المحتمل أن يتم إيقاف وظائف تطبيقك بدون إشعار.
على سبيل المثال، إذا بدأ تطبيقك خدمة تعمل في المقدّمة استجابةً إلى
BOOT_COMPLETE وحاول التفاعل مع الصوت، سيتم إيقاف هذا التفاعل.
أفضل الممارسات المتعلقة بالصوت في الخلفية للحدّ من التأثير
استخدِم مكوّن
MediaSessionServiceفي مكتبة media3 Jetpack لإدارة تشغيل الصوت في الخلفية.وفي حال اتّباع ذلك، من غير المرجّح أن يتأثّر تطبيقك بميزة "تعزيز الأمان في الخلفية" لأنّ المكتبة تساعد في إدارة مراحل نشاط التشغيل.
إذا كنت لا تستفيد من مكتبة Media3، عليك بدء
mediaPlaybackخدمة تعمل في المقدّمة (FGS) يدويًا. يجب دائمًا بدء خدمة تعمل في المقدّمة عندما يكون التطبيق قيد التشغيل في المقدّمة إذا كان من المحتمل تشغيل الصوت في الخلفية.على سبيل المثال، إذا كان تطبيقك يتيح بث الفيديو، وهو عادةً يعمل في المقدّمة فقط، ولكنّه يتضمّن عنصر تحكّم يتيح للمستخدم مواصلة التشغيل أثناء إيقاف تشغيل الشاشة، يجب أن يبدأ تطبيقك خدمة تعمل في المقدّمة عند تشغيل الفيديو من خلال عنصر التحكّم الذي بدأه المستخدم.
ويضمن ذلك بدء الخدمة التي تعمل في المقدّمة مع توفُّر إمكانات "الاستخدام أثناء التنقّل".
يجب إبقاء خدمة
mediaPlaybackالتي تعمل في المقدّمة نشطة أثناء حالات الفشل المؤقتة التي تقل مدتها عن 10 دقائق.إذا كان تطبيقك يعاني من عطل مؤقت، مثل مشكلة في التخزين المؤقت بسبب نشاط الشبكة، أو إذا كان هناك انقطاع مؤقت متوقّع، مثل
AUDIOFOCUS_LOSS_TRANSIENT، يجب أن يستمر هدف التشغيل. وبالتالي، يجب أن تظل خدمة FGS نشطة.أوقِف الخدمة التي تعمل في المقدّمة في نهاية التشغيل وأعِد تشغيلها فقط إذا استأنف المستخدم التشغيل بشكل صريح.
في حال تلقّي إشارة دائمة لإنهاء التشغيل (على سبيل المثال، اكتمال المحتوى بدون تشغيل تلقائي، أو تلقّي إشارة
AUDIOFOCUS_LOSS، أو حدث إيقاف مؤقت من UMO، أو حدث مفتاح وسائط) أو حدوث خطأ لا يمكن إصلاحه، يجب أن يوقف تطبيقك التفاعل الصوتي، وأن يوقف الخدمة التي تعمل في المقدّمة، وأن ينهي جلسة الوسائط. ويعادل كل ذلك مفهوم المستخدم "إنهاء" التفاعل المطلوب مع الصوت في الخلفية. بعد إجراء ذلك، لن يتمكّن تطبيقك من التفاعل مع الصوت في الخلفية.بعد ذلك، إذا استأنف المستخدم تشغيل الصوت بشكل صريح، مثلاً من خلال واجهة المستخدم في تطبيقك أو من خلال زر التشغيل في Universal Media Object، يجب أن يعود الغرض من بدء تشغيل الصوت، ما يؤدي إلى بدء تشغيل خدمة جديدة تعمل في المقدّمة.
اختبار سلوك تشغيل الصوت باستخدام أوامر adb shell
اختبار التغييرات
يمكنك اختبار امتثال تطبيقك على التطبيقات التي تعمل بالإصدار 17 من نظام التشغيل Android أو الإصدارات الأحدث (بدءًا من الإصدار التجريبي 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) أثناء تشغيل التطبيق في المقدّمة لتوسيع نطاق العمليات التي بدأها المستخدم. في بعض الحالات المحدّدة، يُسمح للتطبيقات بتشغيل خدمة تعمل في المقدّمة أثناء عمل التطبيق في الخلفية. ومع ذلك، لا يتم عادةً منح هذه الخدمات التي تعمل في المقدّمة إمكانات الوصول إلى الموقع الجغرافي أثناء الاستخدام.
تعمل ميزة "الاستخدام أثناء عدم الاتصال بالإنترنت" كبوابة أمان، فهي تمنع الخدمات التي تعمل في المقدّمة من الخلفية من تنفيذ بعض السلوكيات الحسّاسة عندما لا يكون المستخدم على دراية بنشاط التطبيق. ويمنع التطبيق من الوصول إلى البيانات الحسّاسة، مثل الموقع الجغرافي أو الكاميرا أو الميكروفون، كما يحظر بدءًا من Android 17 واجهات برمجة تطبيقات الصوت التي تتطلّب عادةً سياق واجهة مستخدم مرئية.
إليك مرجعًا مفيدًا:
- الخدمات العادية التي تعمل في المقدّمة: يتم منح إذن الوصول إلى ميزة "العمل أثناء الاستخدام" للخدمات التي يتم تشغيلها أثناء ظهور التطبيق أو التي تم منحها إذن إطلاق نشاط في الخلفية.
- خدمة تعمل في المقدّمة وبدأت في الخلفية (BFSL): لا يمنح معظمها إذن الوصول إلى WIU. الاستثناءات الأساسية التي تمنح إذنًا بالاستخدام أثناء عدم القفل هي التفاعلات التي تتضمّن إشارة واضحة إلى نية المستخدم، مثل النقرات على الإشعارات أو التفاعلات مع التطبيقات المصغّرة أو أحداث مفتاح الوسائط من جهاز خارجي.
- بدأ النظام تشغيل خدمة تعمل في المقدّمة (FGS): يتم منح الخدمات التي تعمل في المقدّمة إذن الوصول إلى واجهة برمجة التطبيقات WIU إذا بدأ تشغيلها من خلال تفويض خادم النظام (على سبيل المثال، من مكتبة Telecom Jetpack)، أو من خلال عمليات ربط النظام التي تمثّل حالة مقدّمة مميّزة لتنفيذ وظيفة مخصّصة (مثل
VoiceInteractionService).
يمكنك الاطّلاع على مزيد من المعلومات في قيود على بدء خدمة تعمل في المقدّمة من الخلفية.
القائمة الكاملة لواجهات برمجة التطبيقات المتأثرة
وظيفة الصوت |
النتيجة |
واجهات برمجة التطبيقات المتأثرة |
تشغيل الصوت |
تم كتم صوت التشغيل لا توجد استثناءات، ولم تقدّم أي واجهة برمجة تطبيقات رسالة خطأ |
(NDK) OpenSL ES لنظام التشغيل Android قد تتأثر أيضًا أي مكتبات وسائط من جهة العميل تدير التشغيل، مثل media3 وExoplayer وOboe. |
طلب أولويّة الصوت |
المرتجعات لا يؤثّر في تشغيل الصوت في التطبيقات الأخرى، ولا يتم اكتساب التركيز |
|
واجهات برمجة التطبيقات لمستوى الصوت ووضع الرنين |
لا تأثير على وضع الرنين أو مستوى الصوت (يتم تجاهل طلب الطريقة بدون تنبيه) لا توجد استثناءات، ولم تقدّم أي واجهة برمجة تطبيقات رسالة خطأ |
|