بدءًا من الإصدار 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خدمة تعمل في المقدّمة يدويًا. يجب دائمًا بدء خدمة تعمل في المقدّمة عندما يكون التطبيق قيد التشغيل في المقدّمة إذا كان من المحتمل تشغيل الصوت في الخلفية.على سبيل المثال، إذا كان تطبيقك يتيح بث الفيديو، وهو عادةً تطبيق يعمل في المقدّمة فقط، ولكنّه يتضمّن عنصر تحكّم يتيح للمستخدم مواصلة التشغيل أثناء إيقاف تشغيل الشاشة، يجب أن يبدأ تطبيقك خدمة تعمل في المقدّمة عند تشغيل الفيديو من خلال عنصر التحكّم الذي بدأه المستخدم.
ويضمن ذلك بدء الخدمة التي تعمل في المقدّمة مع توفُّر إمكانات "الاستخدام أثناء التنقّل".
يجب إبقاء خدمة
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. الاستثناءات الأساسية التي تمنح إذنًا بالاستخدام أثناء عدم القفل هي التفاعلات التي تتضمّن نية صريحة من المستخدم، مثل النقرات على الإشعارات أو التفاعلات مع التطبيقات المصغّرة أو أحداث مفتاح الوسائط من جهاز خارجي.
- بدأ النظام خدمة تعمل في المقدّمة: يتم منح الخدمات التي تعمل في المقدّمة إذن الوصول إلى واجهة برمجة التطبيقات WorkManager إذا تم بدء تشغيلها من خلال تفويض خادم النظام (على سبيل المثال، من مكتبة Telecom Jetpack) أو من خلال عمليات ربط النظام التي تمثّل حالة مقدّمة مميّزة لتنفيذ وظيفة مخصّصة (مثل
VoiceInteractionService).
يمكنك الاطّلاع على مزيد من المعلومات في قيود على بدء خدمة تعمل في المقدّمة من الخلفية.
القائمة الكاملة لواجهات برمجة التطبيقات المتأثرة في "واجهات برمجة التطبيقات الصوتية"
وظيفة الصوت |
النتيجة |
واجهات برمجة التطبيقات المتأثّرة |
تشغيل الصوت |
تم كتم صوت التشغيل ما مِن استثناءات، ولم تقدّم أي واجهة برمجة تطبيقات رسالة خطأ |
(NDK) OpenSL ES لنظام التشغيل Android قد تتأثر أيضًا أي مكتبات وسائط من جهة العميل تدير التشغيل، مثل media3 وExoplayer وOboe. |
طلب أولويّة الصوت |
المرتجعات لا يؤثّر في تشغيل الصوت في التطبيقات الأخرى، ولم يتم اكتساب التركيز |
|
واجهات برمجة التطبيقات لمستوى الصوت ووضع الرنين |
لا تأثير في وضع الرنين أو مستوى الصوت (يتم تجاهل طلب الإجراء بدون تنبيه) ما مِن استثناءات، ولم تقدّم أي واجهة برمجة تطبيقات رسالة خطأ |
|