המשתמשים מצפים להיות מסוגלים לשלוט בעוצמת הקול של אפליקציית אודיו. ההתנהגות הרגילה כוללת את היכולת להשתמש בפקדי עוצמת הקול (לחצנים או לחצנים מסתובבים במכשיר או פסולי החלקה בממשק המשתמש), וכדי למנוע הפעלה פתאומית של אודיו בעוצמה גבוהה אם ציוד היקפי כמו אוזניות מנותק במהלך השימוש.
שימוש בפקדי עוצמת הקול
כשמשתמש לוחץ על מקש עוצמת קול במשחק או באפליקציית מוזיקה, עוצמת הקול אמורה להשתנות, גם אם הנגן מושהה בין שירים או שאין מוזיקה למיקום הנוכחי במשחק.
מערכת 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 מערבב את כל שידורי האודיו מאותו סוג.
השיטות האלה משנות את עוצמת הקול בכל אפליקציה שמשתמשת בסטרימינג. הימנעו משימוש בהם:
adjustStreamVolume()
adjustSuggestedStreamVolume()
adjustVolume()
setStreamVolume() setStreamVolume()
setStreamSolo()
setStreamMute()
עבודה עם מכשירים בנפח אחסון קבוע
במכשירים מסוימים (כמו Chromebooks ומכוניות עם Android Automotive OS) יש אמצעי בקרה על עוצמת הקול, אבל האפליקציות לא יכולות להשתמש בשיטות AudioManager
שמתוארות למעלה כדי לשנות את עוצמת הקול של מקור האודיו. המכשירים האלה נקראים מכשירים בנפח קבוע. כדי לבדוק אם האפליקציה פועלת במכשיר עם עוצמת קול קבועה, צריך להפעיל את הפונקציה isVolumeFixed()
.
אפליקציית אודיו צריכה לספק אפשרות לאזן את עוצמת הפלט שלה עם אפליקציות אחרות שעשויות לפעול באותו שידור.
במכשירים עם עוצמת קול קבועה, האפליקציה צריכה לחבר את אמצעי הבקרה שלה לעוצמת הקול לשיטה המתאימה של setVolume()
:
שחקן | שיטה |
---|---|
AudioTrack | AudioTrack.setVolume() |
MediaPlayer | MediaPlayer.setVolume() |
ExoPlayer | משתמשים ב-SimpleExoPlayer.setVolume() כדי להגדיר את עוצמת הקול של AudioTrack הבסיסי. |
אינטרנט | מגדירים את המאפיין volume של ה-HTMLMediaElement |
לא להרעיש
למשתמשים יש כמה חלופות כשמדובר באינטראקציה עם האודיו במכשירי 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 } } }
צריך לרשום את המקלט כשמתחילים את ההפעלה, ולבטל את הרישום שלו כשמפסיקים.
אם תתכננו את האפליקציה כפי שמתואר במדריך הזה, הקריאות האלה אמורות להופיע בקריאות החוזרות (callbacks) של סשן המדיה 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); } }