השמעת אודיו בגאדג'טים לבישים

במדריך הזה מוסבר איך אפשר להשתמש בממשקי 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, שמפנה את המשתמש לדף ה-Bluetooth בהגדרות המערכת.

השיטה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:

  1. מפעילים את setSuppressPlaybackOnUnsuitableOutput(true) method בזמן יצירת מופע ExoPlayer:

val exoPlayer = ExoPlayer.Builder(context)
    .setAudioAttributes(AudioAttributes.DEFAULT, true)
    .setSuppressPlaybackOnUnsuitableOutput(true)
    .build()

  1. כדי להגיב לאירוע של השהיית ההפעלה, צריך לרשום את WearUnsuitableOutputPlaybackSuppressionResolverListener listener כ-listener של מופע ExoPlayer:

exoPlayer.addListener(WearUnsuitableOutputPlaybackSuppressionResolverListener(context))

ערכת כלים למדיה של שענים

הספרייה Horologist MediaToolkit כבר מכילה לוגיקה למניעת הפעלה לא מכוונת של מדיה ברמקולים המובנים של השעון.

נגני מדיה אחרים