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

keywords: wear, media, collection_guideslandingwear

במדריך הזה נסביר איך אפליקציות ב-Wear OS יכולות להשתמש בממשקי API מוכרים של Android כדי להשמיע אודיו.

זיהוי התקני אודיו

אפליקציה ל-Wear OS צריכה קודם לזה לזהות אם למכשיר לביש יש פלט אודיו מתאים. מפתחים יכולים לצפות שבמכשירי לבישה יהיו לפחות אחד מפלט האודיו הבא:

בדוגמה הבאה, האפליקציה משתמשת בשיטה getDevices() בשילוב עם הערך של FEATURE_AUDIO_OUTPUT כדי למנות את כל הפלט של האודיו.

AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);

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 }
}

// True if the device has a speaker
audioOutputAvailable(AudioDeviceInfo.TYPE_BUILTIN_SPEAKER)

// True if a Bluetooth headset is paired and connected
audioOutputAvailable(AudioDeviceInfo.TYPE_BLUETOOTH_A2DP)

// True if a BLE broadcast group device is paired and connected
audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_BROADCAST)

// True if a BLE headset is paired and connected
audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_HEADSET)

// True if a BLE speaker is paired and connected
audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_SPEAKER)

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

בחירת המכשיר המועדף לפלט אודיו

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

לאפשר למשתמש לבחור את המכשיר שממנו יועבר הפלט של המדיה

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

אם האפליקציה מזהה שאין אוזניות Bluetooth מחוברות כשרוצים להפעיל אודיו במכשירים עם Wear OS 5 ואילך, אפשר להציע למשתמש לעבור ישירות למתג של פלט המדיה. במכשירים שלא תומכים במתג של פלט המדיה, מפעילים את פעולת הכוונה ACTION_BLUETOOTH_SETTINGS, שמעבירה את המשתמש לדף Bluetooth בהגדרות המערכת.

השיטה launchOutputSelection(), שמהווה חלק מהספרייה Horologist ב-GitHub, מראה איך לאפשר למשתמש לבחור את מכשיר הפלט של המדיה.

אוזניית Bluetooth

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

audioManager.registerAudioDeviceCallback(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.
        }
    }
}, null)
  

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

  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)
      putExtra("EXTRA_CLOSE_ON_CONNECT", true)
      putExtra("android.bluetooth.devicepicker.extra.FILTER_TYPE", 1)
  }
  startActivity(intent)
  

רמקולים

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

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

פרטים נוספים זמינים ב- WearSpeakerSample.

השמעת האודיו

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

מניעת הפעלה לא מכוונת של מדיה דרך הרמקולים

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

ExoPlayer

אם האפליקציה שלכם משתמשת ב-ExoPlayer:

  1. קוראים ל- setSuppressPlaybackOnUnsuitableOutput(true) במהלך היצירה של מופע ExoPlayer:

      ExoPlayer exoplayer = ExoPlayer.Builder(context)
              .setAudioAttributes(...)
              .setSuppressPlaybackWhenUnsuitableOutput(true)
              // ...
              .build()
          
  2. כדי להגיב לאירוע של ביטול ההפעלה, צריך לרשום את WearUnsuitableOutputPlaybackSuppressionResolverListener כ-listener של מופע ExoPlayer:

  3.   exoPlayer.addListener(WearUnsuitableOutputPlaybackSuppressionResolverListener(context))
        

ערכת הכלים של Horologist Media

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

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