التعامل مع التغييرات في إخراج الصوت

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

استخدام عناصر التحكم في مستوى الصوت

عندما يضغط المستخدم على أحد مفاتيح مستوى الصوت في لعبة أو تطبيق موسيقي، يجب ضبط مستوى الصوت على تغيير، حتى ولو كان المشغِّل متوقفًا مؤقتًا بين الأغاني أو لم تكن هناك موسيقى الموقع الحالي للعبة.

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

يؤدي الضغط على عنصر التحكم في مستوى الصوت إلى تعديل مستوى الصوت في الصوت النشط تلقائيًا دفق. إذا كان تطبيقك لا يشغّل أي محتوى حاليًا، اضغط على مفتاحَي مستوى الصوت لضبط مستوى صوت الموسيقى (أو مستوى صوت الرنين قبل الإصدار Android 9).

يجب تشغيل الصوت مع الاستخدام ما لم يكن تطبيقك منبّهًا. AudioAttributes.USAGE_MEDIA

للتأكّد من ضبط عناصر التحكّم في مستوى الصوت البث الصحيح، عليك طلب setVolumeControlStream() اختيار نوع مصدر البيانات الذي يتطابق مع السمات التي يمكنك استردادها من AudioAttributes.getVolumeControlStream

Kotlin

setVolumeControlStream(AudioManager.STREAM_MUSIC)

Java

setVolumeControlStream(AudioManager.STREAM_MUSIC);

يجب إجراء هذه المكالمة خلال مراحل نشاط تطبيقك، عادةً من onResume(). طريقة النشاط أو الجزء الذي يتحكّم في الوسائط يؤدي هذا إلى الاتصال يتحكَّم في مستوى الصوت على STREAM_MUSIC كلما حدث النشاط المستهدف أو الجزء مرئية.

التحكّم بطريقة آلية في مستوى صوت البث

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

العمل على الأجهزة ذات الحجم الثابت

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

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

اللاعب الطريقة
مقطع صوتي AudioTrack.setVolume()
مشغّل الوسائط MediaPlayer.setVolume()
ExoPlayer استخدِم السمة SimpleExoPlayer.setVolume() التي تضبط مستوى الصوت للمقطع الصوتي الأساسي.

لا تكن مزعجًا

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

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

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

عند رجوع إخراج الصوت إلى مكبّر الصوت المدمج، يبث النظام ACTION_AUDIO_BECOMING_NOISY والنية. عليك إنشاء BroadcastReceiver. يرصد هذا الغرض من تشغيل الصوت. من المفترض أن يظهر جهاز الاستقبال على النحو التالي:

Kotlin

private class BecomingNoisyReceiver : BroadcastReceiver() {

    override fun onReceive(context: Context, intent: Intent) {
        if (intent.action == AudioManager.ACTION_AUDIO_BECOMING_NOISY) {
            // Pause the playback
        }
    }
}

Java

private class BecomingNoisyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
      if (AudioManager.ACTION_AUDIO_BECOMING_NOISY.equals(intent.getAction())) {
          // Pause the playback
      }
    }
}

يمكنك تسجيل جهاز الاستقبال عند بدء التشغيل وإلغاء تسجيله عند توقّفه. في حال تصميم تطبيقك على النحو الموضّح في هذا الدليل، من المفترض أن تظهر هذه المكالمات في استدعاءات جلسة الوسائط onPlay() وonStop().

Kotlin

private val intentFilter = IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY)
private val myNoisyAudioStreamReceiver = BecomingNoisyReceiver()

private val callback = object : MediaSessionCompat.Callback() {

    override fun onPlay() {
        registerReceiver(myNoisyAudioStreamReceiver, intentFilter)
    }

    override fun onStop() {
        unregisterReceiver(myNoisyAudioStreamReceiver)
    }
}

Java

private IntentFilter intentFilter = new IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY);
private BecomingNoisyReceiver myNoisyAudioStreamReceiver = new BecomingNoisyReceiver();

MediaSessionCompat.Callback callback = new
MediaSessionCompat.Callback() {
  @Override
  public void onPlay() {
    registerReceiver(myNoisyAudioStreamReceiver, intentFilter);
  }

  @Override
  public void onStop() {
    unregisterReceiver(myNoisyAudioStreamReceiver);
  }
}