במדריך הזה נסביר איך להשתמש בממשקי Android API מוכרים כדי להפעיל אודיו באפליקציות ל-WearOS.
זיהוי מכשירי אודיו
אפליקציה ל-Wear OS צריכה קודם לזהות אם למכשיר הלביש יש פלט שמע מתאים. בדרך כלל, למכשירים לבישים יש לפחות אחת מיציאות האודיו הבאות:
-
AudioDeviceInfo.TYPE_BUILTIN_SPEAKER: במכשירים עם רמקול מובנה. -
AudioDeviceInfo.TYPE_BLUETOOTH_A2DP: כשמזווגים אוזניות Bluetooth ומחברים אותן. -
AudioDeviceInfo.TYPE_BLE_BROADCAST: כשמכשיר Bluetooth Low Energy (BLE) לשידור קבוצתי מוצמד ומחובר. -
AudioDeviceInfo.TYPE_BLE_HEADSET: כשאוזניות BLE מוצמדות ומחוברות. -
AudioDeviceInfo.TYPE_BLE_SPEAKER: כשרמקול BLE מוצמד ומחובר.
בדוגמה הבאה נעשה שימוש בשיטה getDevices() עם הערך FEATURE_AUDIO_OUTPUT כדי לבדוק אם סוג פלט אודיו זמין.
private val audioManager: AudioManager by lazy { getSystemService(AUDIO_SERVICE) as AudioManager } fun audioOutputAvailable(type: Int): Boolean { if (!packageManager.hasSystemFeature(PackageManager.FEATURE_AUDIO_OUTPUT)) { return false } return audioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS).any { it.type == type } }
אחר כך תוכלו להשתמש בשיטה הזו כדי לבדוק אם סוג פלט האודיו זמין.
val hasSpeaker = audioOutputAvailable(AudioDeviceInfo.TYPE_BUILTIN_SPEAKER) val hasBluetoothHeadset = audioOutputAvailable(AudioDeviceInfo.TYPE_BLUETOOTH_A2DP) val hasBLEBroadcast = audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_BROADCAST) val hasBLEHeadset = audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_HEADSET) val hasBLESpeaker = audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_SPEAKER)
כדי לספק את חוויית המשתמש הטובה ביותר, המדיה תופעל רק כשאוזניות Bluetooth או רמקולים מחוברים לשעון.
בחירת המכשיר המועדף לפלט אודיו
בהתאם לתרחיש השימוש באפליקציה ולחשיבות של האודיו לחוויית הליבה שלה, בוחרים איך המשתמשים יפעלו עם פלט האודיו של האפליקציה.
המשתמש יכול לבחור מכשיר להצגת פלט מדיה
החל מ-Wear OS 5, המערכת מספקת ממשק משתמש שמאפשר למשתמשים לבחור באיזה מכשיר להפעיל מדיה ולהציג מידע על תוכן המדיה שמופעל.
אם האפליקציה מזהה שאין אוזניות Bluetooth מחוברות כשרוצים להפעיל אודיו במכשירים עם Wear OS 5 ואילך, צריך להציע למשתמש לעבור ישירות לבחירת יעד לפלט המדיה. במכשירים שלא תומכים בבחירת יעד לפלט המדיה, מפעילים את הפעולה ACTION_BLUETOOTH_SETTINGS intent, שמעבירה את המשתמש לדף ה-Bluetooth בהגדרות המערכת.
ה-method launchOutputSelection(), שהוא חלק מהספרייה Horologist ב-GitHub, מדגים איך לאפשר למשתמשים לבחור את מכשיר פלט המדיה שלהם.
אוזניית Bluetooth
בניגוד לרמקולים מובנים, שתמיד זמינים אם הם קיימים במכשיר, אפשר לשייך או לבטל את השיוך של אוזניות Bluetooth בזמן שאפליקציה פועלת. אם האפליקציה
דורשת אוזניות כדי להמשיך, צריך לרשום קריאה חוזרת (callback) כדי לזהות מתי המשתמש
מחבר ומנתק אוזניות Bluetooth באמצעות
registerAudioDeviceCallback:
val audioDeviceCallback = object : AudioDeviceCallback() { override fun onAudioDevicesAdded(addedDevices: Array<out AudioDeviceInfo>?) { super.onAudioDevicesAdded(addedDevices) if (audioOutputAvailable(AudioDeviceInfo.TYPE_BLUETOOTH_A2DP) || audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_BROADCAST) || audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_HEADSET) || audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_SPEAKER) ) { // A Bluetooth or BLE device is connected and available for playback. } } override fun onAudioDevicesRemoved(removedDevices: Array<out AudioDeviceInfo>?) { super.onAudioDevicesRemoved(removedDevices) if (!(audioOutputAvailable(AudioDeviceInfo.TYPE_BLUETOOTH_A2DP)) && !(audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_BROADCAST)) && !(audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_HEADSET)) && !(audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_SPEAKER)) ) { // No Bluetooth or BLE devices are connected anymore. } } } audioManager.registerAudioDeviceCallback(audioDeviceCallback, /*handler=*/ null)
אם האפליקציה מזהה שאין אוזניות Bluetooth מחוברות כשרוצים לספק פלט אודיו, לא מוצגת הודעת שגיאה. במקום זאת, כדאי להציע למשתמש לעבור ישירות להגדרות ה-Bluetooth כדי להקל עליו להתחבר. כדי לעשות את זה, שולחים כוונה עם ACTION_BLUETOOTH_SETTINGS:
fun Context.launchBluetoothSettings(closeOnConnect: Boolean = true) { val intent = with(Intent(Settings.ACTION_BLUETOOTH_SETTINGS)) { addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) putExtra("EXTRA_CONNECTION_ONLY", true) if (closeOnConnect) { putExtra("EXTRA_CLOSE_ON_CONNECT", true) } putExtra("android.bluetooth.devicepicker.extra.FILTER_TYPE", FILTER_TYPE_AUDIO) } startActivity(intent) } internal const val FILTER_TYPE_AUDIO = 1
רמקולים מובנים
לרוב מכשירי Wear OS יש רמקולים מובנים. אם האפליקציה שלכם מציעה תרחיש שימוש שאינו קשור למדיה וכולל שימוש בסאונד, כדאי להשתמש ברמקולים כדי להוסיף מימד נוסף של אינטראקציה. לדוגמה, מכשיר Wear OS עם רמקול יכול להפעיל שעון או טיימר עם התראה קולית, ואפליקציות כושר יכולות להשתמש ברמקול כדי לספק הוראות לתרגילים.
פרטים נוספים זמינים במאמר בנושא WearSpeakerSample.
הפעלת האודיו
אחרי שמזהים ובוחרים פלט אודיו מתאים, השמעת אודיו ב-Wear OS זהה להשמעת אודיו בנייד או במכשירים אחרים. מידע נוסף מופיע בסקירה הכללית על MediaPlayer. כדי לגשת בקלות לתכונות מתקדמות, למשל סטרימינג והורדה של מדיה, אפשר להשתמש ב-ExoPlayer. כדאי לפעול לפי השיטות המומלצות לאפליקציות אודיו, למשל ניהול של מיקוד אודיו.
זה מונע הפעלה לא מכוונת של מדיה דרך הרמקולים המובנים
אפליקציות מדיה יכולות לפעול לפי ההנחיות האלה כדי למנוע הפעלה לא מכוונת של מדיה ברמקולים המובנים של השעון. ההנחיות משתנות בהתאם לנגן שבו האפליקציה משתמשת.
ExoPlayer
אם האפליקציה שלכם משתמשת ב-ExoPlayer:
- מבצעים קריאה ל-
setSuppressPlaybackOnUnsuitableOutput(true)method בזמן בניית מופע ExoPlayer:
val exoPlayer = ExoPlayer.Builder(context) .setAudioAttributes(AudioAttributes.DEFAULT, true) .setSuppressPlaybackOnUnsuitableOutput(true) .build()
- כדי להגיב לאירוע של השבתת ההפעלה, צריך לרשום את
WearUnsuitableOutputPlaybackSuppressionResolverListenerlistener כ-listener של מופע ExoPlayer:
exoPlayer.addListener(WearUnsuitableOutputPlaybackSuppressionResolverListener(context))
ערכת כלים למדיה של Horologist
הספרייה Horologist MediaToolkit כבר מכילה לוגיקה למניעת הפעלה לא מכוונת של מדיה ברמקולים המובנים של השעון.
נגני מדיה אחרים
- מוודאים שהפעלת האודיו של המדיה מתחילה רק כשמכשיר פלט מתאים, למשל אוזניות או רמקולים חיצוניים, מחובר לשעון. ברשימה הבאה מוצגים מכשירי פלט מתאימים לאפליקציות מדיה:
- אם
AudioManagerשולח לאפליקציה הודעה על כך שמכשיר חיצוני של פלט אודיו מתנתק מהשעון, צריך להשהות את ההפעלה. - כשהמשתמש מנסה להתחיל הפעלת מדיה אבל לא חיבר מכשיר אודיו חיצוני, מוצגת לו בקשה לחבר מכשיר לשעון.