טיפול בשינויים בפלט האודיו

המשתמשים מצפים שתהיה להם אפשרות לשלוט בעוצמת הקול של אפליקציית אודיו. התנהגות רגילה כולל את היכולת להשתמש בפקדי עוצמת הקול (לחצנים או כפתורים במכשיר או בפסי ההזזה שבממשק המשתמש), וכדי להימנע מהשמעת פתאומיות בקול רם, ציוד היקפי, כמו אוזניות, מנותק בזמן השימוש.

שימוש בפקדי עוצמת הקול

כשמשתמש לוחץ על מקש עוצמת קול במשחק או באפליקציית מוזיקה, עוצמת הקול צריכה להיות גם אם הנגן מושהה בין שירים או ללא מוזיקה המיקום הנוכחי של המשחק.

מערכת 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 שלהם. ברוב המכשירים יש רמקול מובנה, שקעי אוזניות עבור ואוזניות חוטיות, ורבים מהם כוללים גם קישוריות Bluetooth ותמיכה אודיו A2DP.

כאשר אוזניות מנותקות או מכשיר Bluetooth מנותק, האודיו מועבר מנתב מחדש אוטומטית לרמקול המובנה. אם מאזינים למוזיקה בעוצמה גבוהה עוצמת קול, היא יכולה להיות הפתעה רועשת.

בדרך כלל, המשתמשים מצפים לאפליקציות שכוללות נגן מוזיקה עם הפעלה במסך בקרה להשהיית ההפעלה במקרה הזה. אפליקציות אחרות, כמו משחקים שלא כלול פקדים, אמור להמשיך לפעול. המשתמש יכול לכוונן את עוצמת הקול באמצעות ממשק השליטה בחומרה של המכשיר.

כשפלט האודיו חוזר לרמקול המובנה, המערכת משדרת 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
      }
    }
}

רישום המקלט בתחילת ההפעלה וביטול הרישום שלו כשמפסיקים את ההפעלה. אם מעצבים את האפליקציה כמו שמתואר במדריך הזה, הקריאות האלה יופיעו בקריאות החוזרות (callback) של סשן המדיה 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);
  }
}