اعتبارًا من الإصدار 17 من نظام التشغيل Android، يفرض إطار عمل الصوت قيودًا على التفاعلات الصوتية في الخلفية، بما في ذلك تشغيل الصوت وطلبات التركيز على الصوت وواجهات برمجة التطبيقات الخاصة بتغيير مستوى الصوت، وذلك لضمان أنّ المستخدم هو من يبدأ هذه التغييرات عن قصد.
إذا كان مطوّر التطبيق ينوي التحكّم في الصوت بدون نشاط مرئي، عليه التأكّد من أنّ التطبيق يتضمّن خدمة تعمل في المقدّمة (ليست من النوع SHORT_SERVICE) تم بدء تشغيلها باستخدام إمكانات أثناء الاستخدام. يتم منح الخدمة التي تعمل في المقدّمة إمكانات WIU إذا تم تشغيلها استجابةً إلى MediaSessionEvent أو عندما يكون التطبيق مرئيًا للمستخدم.
إذا حاول التطبيق استدعاء واجهات برمجة تطبيقات الصوت أثناء عدم توفّره في دورة حياة صالحة، سيتعذّر تشغيل الصوت وتغيير مستوى الصوت بدون عرض رسالة خطأ أو طرح استثناء. تعذُّر إكمال طلب البيانات من واجهة برمجة التطبيقات الخاصة بالتركيز الصوتي مع ظهور رمز النتيجة 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.
اختبار التغييرات على نظامَي التشغيل Android 16 وAndroid 17
تمت إضافة هذه الميزة إلى مستوى "تحذير" في الإصدار 16 من نظام التشغيل Android والإصدارات الأحدث. وهذا يعني أنّ التطبيقات يمكنها استخدام adb shell cmd audio
set-enable-hardening لاختبار تنفيذ إجراءات تقوية أمان الصوت في الخلفية يدويًا.
لتفعيل فرض القيود على الأجهزة التي تعمل بنظام التشغيل Android 16، شغِّل الأمر التالي:
adb shell cmd audio set-enable-hardening 1
لإيقاف فرض القيود على الأجهزة التي تعمل بالإصدار 17 من نظام التشغيل Android، شغِّل الأمر التالي:
adb shell cmd audio set-enable-hardening 0
ننصحك أيضًا باستخدام logcat أو الأمر adb adb dumpsys audio لتحديد ما إذا كان التطبيق قد واجه حالات تعذُّر غير ظاهرة بسبب فرض ميزة "تصليد الصوت". إذا كان الأمر كذلك، سيتضمّن السجلّ إدخالاً مسبوقًا بـ AudioHardening مع اسم الحزمة.
التعرّف على الخدمات التي تعمل في المقدّمة مع إمكانية الاستخدام أثناء التنقّل
بشكل عام، يجب تشغيل الخدمات التي تعمل في المقدّمة (FGS) أثناء تشغيل التطبيق في المقدّمة لتوسيع نطاق العمليات التي بدأها المستخدم. في بعض الحالات المحدّدة، يُسمح للتطبيقات بتشغيل خدمة تعمل في المقدّمة أثناء عمل التطبيق في الخلفية. ومع ذلك، لا يتم عادةً منح هذه الخدمات التي تعمل في المقدّمة إمكانات الوصول إلى الموقع الجغرافي أثناء الاستخدام.
تعمل ميزة "الاستخدام أثناء عدم الاتصال بالإنترنت" كبوابة أمان، فهي تمنع الخدمات التي تعمل في المقدّمة والخلفية من تنفيذ بعض السلوكيات الحسّاسة عندما لا يكون المستخدم على دراية بنشاط التطبيق. تمنع هذه الميزة التطبيق من الوصول إلى البيانات الحساسة، مثل الموقع الجغرافي أو الكاميرا أو الميكروفون، كما تحظر بدءًا من Android 17 واجهات برمجة التطبيقات الصوتية التي تتطلّب عادةً سياق واجهة مستخدم مرئيًا.
إليك مرجعًا مفيدًا:
- الخدمات العادية التي تعمل في المقدّمة: يتم منح إذن الوصول إلى ميزة "الاستخدام أثناء عدم الاتصال بالإنترنت" للخدمات التي يتم تشغيلها أثناء ظهور التطبيق أو التي تم منحها إذن إطلاق نشاط في الخلفية.
- خدمة تعمل في المقدّمة تبدأ في الخلفية (BFSL): لا يمنح معظمها إذن الوصول إلى WIU. الاستثناءات الأساسية التي تمنح إذنًا بالاستخدام أثناء عدم القفل هي التفاعلات التي تتضمّن نية صريحة من المستخدم، مثل النقرات على الإشعارات أو التفاعلات مع التطبيقات المصغّرة أو أحداث مفتاح الوسائط من جهاز خارجي.
- بدأ النظام في استخدام خدمة FGS: تم منح إذن الوصول إلى WIU للخدمات التي بدأت في استخدام تفويض system-server (على سبيل المثال، باستخدام مكتبة Telecom jetpack).
يمكنك الاطّلاع على مزيد من المعلومات في قيود على بدء خدمة تعمل في المقدّمة من الخلفية.
القائمة الكاملة لواجهات برمجة التطبيقات المتأثرة في "واجهات برمجة التطبيقات الصوتية"
وظيفة الصوت |
النتيجة |
واجهات برمجة التطبيقات المتأثّرة |
تشغيل الصوت |
تم كتم صوت التشغيل ما مِن استثناءات، وما مِن رسالة خطأ تقدّمها أي واجهة برمجة تطبيقات |
(NDK) OpenSL ES لنظام التشغيل Android قد تتأثر أيضًا أي مكتبات وسائط من جهة العميل تدير التشغيل، مثل media3 وExoplayer وOboe. |
طلب التركيز على الصوت |
المرتجعات لا يؤثّر في تشغيل الصوت في التطبيقات الأخرى، ولم يتم اكتساب التركيز |
|
واجهات برمجة التطبيقات لمستوى الصوت ووضع الرنين |
لا تأثير في وضع الرنين أو مستوى الصوت (يتم تجاهل طلب الطريقة بدون تنبيه) ما مِن استثناءات، وما مِن رسالة خطأ تقدّمها أي واجهة برمجة تطبيقات |
|