مشاركة إدخال الصوت

يأتي إدخال الصوت عادةً من الميكروفون المُدمَج أو ميكروفون خارجي واجهة صوتية متصلة بالجهاز. يمكن أيضًا أن يأتي إدخال الصوت من محادثة هاتفية.

في بعض الأحيان، قد يريد تطبيقان أو أكثر "التقاط" الإدخال الصوتي نفسه ربما يؤدي مهام مختلفة. على سبيل المثال، بعض التطبيقات التي تتلقى محتوًى صوتيًا قد تكون ميزة "التسجيل" مثل مسجل صوت بسيط، بينما قد تكون التطبيقات الأخرى "الاستماع"، مثل مساعد Google أو خدمة إمكانية وصول والاستجابة للأوامر الصوتية.

وفي كلتا الحالتين، تريد هذه التطبيقات تلقّي الإدخال الصوتي. نستخدم في هذه الصفحة المصطلح "capture" (التقاط). بغض النظر عما إذا كان يسجّلون أو يستمعون فقط.

إذا أراد تطبيقان أو أكثر التقاط الصوت في الوقت نفسه، قد تكون هناك مشكلة وتقديم الإشارة الصوتية من المصدر نفسه إلى جميع الأجهزة تصف هذه الصفحة الطريقة التي يشارك بها نظام Android إدخال الصوت بين تطبيقات متعددة تسجِّل الصوت.

سلوك الإصدارات التجريبية قبل Android 10

قبل نظام التشغيل Android 10، لم يكن من الممكن التقاط بث الصوت الوارد إلا بواسطة تطبيق واحد في الوقت. إذا كان هناك تطبيق معيّن يسجِّل صوتًا أو يستمع إليه، يمكن أن تنشئ كائن AudioRecord، ولكن سيظهر خطأ عند طلب AudioRecord.startRecording() ولن يبدأ التسجيل.

وكان الاستثناء الوحيد لهذه القاعدة عندما يكون هناك تطبيق ذا امتياز (مثل "مساعد Google" أو إمكانية الوصول) على الإذن android.permission.CAPTURE_AUDIO_HOTWORD وتم استخدام مصدر صوت من النوع HOTWORD في هذه الحالة، يمكن لتطبيق آخر بدء التسجيل. وعندما حدث ذلك، تم إنهاء تطبيق خاص وحصل التطبيق الجديد على الإدخال.

أُضيفَ تغيير آخر في Android 9: التطبيقات التي تعمل في المقدّمة فقط (أو خدمة تعمل في المقدّمة) يمكنها التقاط إدخال الصوت. عندما يكون التطبيق الذي لا بدأ التقاط مكون خدمة التي تعمل في المقدّمة أو مكوِّن واجهة المستخدم التي تعمل في المقدّمة، استمرار تشغيله لكن مع مرور الوقت، حتى لو كان التطبيق الوحيد الذي يلتقط الصوت في ذلك الوقت.

سلوك Android 10

يكون السلوك السابق لنظام Android 10 هو "أولوية الحجز على الإطلاق". بعد أن يبدأ التطبيق في تسجيل الصوت، لن تتمكّن أي تطبيقات أخرى من الوصول إلى إدخال الصوت إلى أن يتوقف التطبيق الذي يلتقط الصوت.

يفرض Android 10 نظامًا لأولويات يمكنه تبديل البث الصوتي الذي يتم إدخاله. بين التطبيقات أثناء تشغيلها. وفي معظم الحالات، إذا حصل تطبيق جديد على إدخال الصوت، استمرار تشغيل التطبيق الذي يلتقط المحتوى سابقًا، لكنه يتعرض لعملية صمت. في بعض الحالات التي يمكن أن يواصل فيها النظام إرسال الصوت إلى كلا التطبيقين. مختلف يتم توضيح سيناريوهات المشاركة أدناه.

يشبه هذا المخطّط طريقة معالجة ميزة "التركيز الصوتي" مع تطبيقات متعدّدة. يعترضون على استخدام إخراج الصوت. ومع ذلك، تتم إدارة التركيز الصوتي من خلال والحلول الآلية لجذب التركيز وإطلاقه، مع إمكانية التبديل بين إشارات الإدخال الموضحة هنا، تعتمد على سياسة تحديد الأولويات المطبقة تلقائيًا كلما بدأ تطبيق جديد في تسجيل الصوت.

يميّز Android بين نوعَين من التطبيقات لأغراض تسجيل الصوت:

  • "عادي" التطبيقات التي ثبّتها المستخدم.
  • "خاص" يتم تثبيت التطبيقات مسبقًا على الجهاز. وتشمل هذه الخدمات "مساعد Google" وجميع خدمات تسهيل الاستخدام.

بالإضافة إلى ذلك، يتم التعامل مع التطبيق بطريقة مختلفة كانت تستخدم عبارة "حساسة للخصوصية" مصدر الصوت: CAMCORDER أو VOICE_COMMUNICATION

في ما يلي قواعد تحديد الأولوية لاستخدام الإدخال الصوتي ومشاركته:

  • التطبيقات المميزة لها أولوية أعلى من التطبيقات العادية.
  • تكون التطبيقات التي تحتوي على واجهات مستخدم مرئية في المقدّمة أولوية أعلى من التطبيقات التي تعمل في الخلفية.
  • تحظى التطبيقات التي تسجِّل الصوت من مصدر حسّاس للخصوصية بأولوية أعلى من التطبيقات التي لا تسجِّل ذلك.
  • لا يمكن لتطبيقين عاديين التقاط صوت في الوقت نفسه.
  • في بعض الحالات، يمكن لأحد التطبيقات الحاصلة على إذن مميّز مشاركة إدخال الصوت مع تطبيق آخر.
  • إذا كان هناك تطبيقان في الخلفية لهما الأولوية نفسها يلتقطان الصوت، يكون للتطبيق الأخير الذي بدأ أولوية أعلى.

سيناريوهات المشاركة

عندما يحاول تطبيقان التقاط صوت، وقد يتمكن كلاهما من تلقّي إشارة الإدخال، أو قد يتلقى أحدهما صمت.

هناك أربعة سيناريوهات رئيسية:

  • "مساعد Google" + تطبيق عادي
  • خدمة مخصّصة لتسهيل الاستخدام + تطبيق عادي
  • تطبيقان عاديان
  • مكالمة صوتية + تطبيق عادي

"مساعد Google" + تطبيق عادي

يُعد "مساعد Google" تطبيقًا متميزًا لأنه مثبت مسبقًا ويحتوي على الدور RoleManager.ROLE_ASSISTANT. يتم التعامل مع أي تطبيق آخر مثبَّت مسبقًا يتضمّن هذا الدور بالطريقة نفسها.

يشارك Android صوت الإدخال وفقًا للقواعد التالية:

  • بإمكان "مساعد Google" تلقّي صوت (بغض النظر عمّا إذا كان هذا الصوت في المقدّمة أو في الخلفية) ما لم يلتقط بالفعل تطبيق آخر يستخدم مصدر صوت حساسًا للخصوصية.

  • يستقبل التطبيق الصوت ما لم تكن لدى "مساعد Google" واجهة مستخدم مرئية المكون أعلى الشاشة.

يُرجى العِلم أنّ كلا التطبيقَين يتلقّىان الصوت فقط أثناء تشغيل "مساعد Google" في الخلفية. والتطبيق الآخر لا يلتقط من مصدر صوت يراعي الخصوصية.

خدمة مخصّصة لتسهيل الاستخدام + تطبيق عادي

إنّ AccessibilityService تتطلب بيانًا صارمًا.

يشارك Android صوت الإدخال وفقًا للقواعد التالية:

  • إذا كانت واجهة المستخدم الخاصة بالخدمة في أعلى الشاشة، ستتلقّى كل من الخدمة والتطبيق إدخال الصوت يقدّم هذا السلوك وظائف مثل التحكّم في مكالمة صوتية أو فيديو. تسجيله باستخدام الطلبات الصوتية.

  • إذا لم تكن الخدمة في أعلى الصفحة، يتم التعامل مع هذه الحالة على النحو التالي: الحالة العادية الثنائية للتطبيق أدناه.

تطبيقان عاديان

عند التقاط تطبيقَين بشكل متزامن، يتلقّى أحدهما صوتًا ويكتم صوت التطبيق الآخر.

يشارك Android صوت الإدخال وفقًا للقواعد التالية:

  • إذا لم يكن أيٌّ من التطبيقَين حسّاسًا للخصوصية، يتلقى التطبيق المزود بواجهة مستخدم صوتًا. إذا لم يكن أي من التطبيقين يشتمل على واجهة مستخدم، فإن التطبيق الذي بدأ التقاط آخر صوت يتلقَّى الصوت.
  • إذا كان أحد التطبيقات حساسًا للخصوصية، سيتلقّى صوتًا تطبيق آخر يكتم صوته حتى لو كان الهاتف يعرض واجهة مستخدم في الأعلى أو بدأ في الالتقاط مؤخرًا.
  • وإذا كان كِلا التطبيقين حساسَين للخصوصية، فإن التطبيق الذي بدأ في جذب معظم يتلقى صوتًا مؤخرًا ويتوقف الطرف الآخر عن كتم الصوت.

مكالمة صوتية + تطبيق عادي

تكون المكالمة الصوتية نشطة إذا تم إرجاع وضع الصوت بواسطة AudioManager.getMode() هو MODE_IN_CALL أو MODE_IN_COMMUNICATION

يشارك Android صوت الإدخال وفقًا للقواعد التالية:

سلوك Android 11

Android 11 (مستوى واجهة برمجة التطبيقات 30) يلتزم بنظام أولوية Android 10 الموضحة أعلاه. وتوفّر هذه الخدمة أيضًا طرقًا جديدة في AudioRecord وMediaRecorder و AAudioStream التي تتيح أو توقف إمكانية التقاط الصوت بشكل متزامن، بغض النظر عن حالة الاستخدام المحددة.

الطرق الجديدة هي:

عندما تكون قيمة السمة setPrivacySensitive() هي true، تكون حالة استخدام الالتقاط خاصة وحتى لا يمكن لـ "مساعد Google" الحاصل على الامتياز "مساعد Google" الحصول على البيانات بشكل متزامن. يلغي هذا الإعداد بشكل تلقائي يعتمد على مصدر الصوت. على سبيل المثال: يكون VOICE_COMMUNICATION خاصًا بشكل تلقائي ولكن لا يكون UNPROCESSED كذلك.

تغييرات الإعدادات

عندما تلتقط عدة تطبيقات الصوت في وقت واحد، لا تلتقط سوى تطبيق واحد أو اثنين "نشط" (الصوت المتلقّي) يتم كتم صوت بقية المشاركين (يتم كتم صوتهم). عندما تغيير التطبيقات النشطة، قد يُعيد إطار العمل الصوتي ضبط المسارات الصوتية وفقًا لهذه القواعد:

  • قد يتغير جهاز إدخال الصوت لكل تطبيق نشط (على سبيل المثال، من الميكروفون المدمج بسماعة رأس بلوتوث مرفقة).
  • تم تفعيل المعالجة المسبقة المرتبطة بالتطبيق النشط ذي الأولوية القصوى. الكل يتم تجاهل العمليات المسبقة الأخرى.

وبما أنّه قد يتم كتم صوت تطبيق نشط عندما يصبح أحد التطبيقات ذات الأولوية الأعلى نشطًا، يمكنك تسجيل AudioManager.AudioRecordingCallback على AudioRecord أو MediaRecorder إرسال إشعار عند تغيير الإعدادات. تشمل التغييرات المحتملة ما يلي:

  • التقاط الصوت في وضع كتم الصوت أو عدم كتمه
  • تم تغيير الجهاز.
  • تم تغيير المعالجة المسبقة
  • تغيّرت خصائص مصدر البيانات (معدّل العيّنات وقناع القناة وتنسيق العيّنة)

يجب الاتصال AudioRecord.registerAudioRecordingCallback() قبل بدء الالتقاط. لا يتم تنفيذ معاودة الاتصال إلا عندما يتلقى التطبيق مقطعًا صوتيًا ويحدث تغيير.

تعرض الطريقة onRecordingConfigChanged() رمز AudioRecordingConfiguration يحتوي على حالة التقاط الصوت الحالية. استخدِم ما يلي: للتعرف على التغيير:

isClientSilenced()
تعود القيمة "صحيح" إذا كان الصوت الذي تم إرجاعه إلى العميل يتم كتم صوته حاليًا بسبب سياسة الالتقاط.
getAudioDevice()
عرض الجهاز السماعي النشط
getEffects()
عرض التأثير النشط قبل المعالجة. يُرجى العِلم أنّ التأثير النشط قد لا يكون مطابقًا للتأثير الذي تم عرضه من خلال getClientEffects() إذا لم يكن البرنامج هو التطبيق النشط ذي الأولوية القصوى.
getFormat()
عرض مواقع ساحة المشاركات. تجدر الإشارة إلى أنّ البيانات الصوتية التي يتلقّاها العميل تلتزم دائمًا بالتنسيق المطلوب الذي يعرضه getClientFormat(). ينفّذ إطار العمل تلقائيًا عمليات إعادة أخذ العينات والقناة والتنسيق اللازمة من التنسيق المستخدَم في واجهة الجهاز إلى التنسيق الذي يحدّده العميل.
AudioRecord.getActiveRecordingConfiguration().
عرض إعدادات التسجيل النشطة.

يمكنك الحصول على عرض عام لجميع التسجيلات النشطة على الجهاز من خلال إجراء مكالمة AudioManager.getActiveRecordingConfigurations()