پخش صدا روی ابزارهای پوشیدنی

این راهنما توضیح می‌دهد که چگونه برنامه‌های 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)

برای ارائه بهترین تجربه کاربری، برنامه شما باید مطمئن شود که فقط زمانی رسانه پخش می کند که هدفون یا بلندگوهای بلوتوث به ساعت متصل هستند.

دستگاه مورد نظر را برای خروجی صدا انتخاب کنید

بسته به مورد استفاده برنامه‌تان و اهمیت صدا در تجربه اصلی برنامه‌تان، نحوه تعامل کاربران با خروجی صوتی برنامه‌تان را انتخاب کنید.

به کاربر اجازه دهید دستگاه خروجی رسانه را انتخاب کند

با شروع در Wear OS 5، این سیستم یک رابط کاربری ارائه می‌کند که به کاربران امکان می‌دهد انتخاب کنند کدام دستگاه باید رسانه پخش کند و اطلاعاتی درباره محتوای رسانه در حال پخش نمایش دهد.

اگر وقتی می‌خواهید در دستگاه‌های دارای سیستم‌عامل Wear OS 5 یا بالاتر، پخش صدا را ارائه دهید، برنامه شما تشخیص داد که هدست بلوتوث متصل نیست، پیشنهاد دهید کاربر را مستقیماً به تعویض‌کننده خروجی رسانه ببرید. در دستگاه‌هایی که از تعویض‌کننده خروجی رسانه پشتیبانی نمی‌کنند، عمل قصد ACTION_BLUETOOTH_SETTINGS را فراخوانی کنید، که کاربر را به صفحه بلوتوث در تنظیمات سیستم می‌برد.

متد launchOutputSelection() ، بخشی از کتابخانه Horologist در GitHub، نشان می دهد که چگونه به کاربر اجازه دهد دستگاه خروجی رسانه خود را انتخاب کند.

هدست بلوتوث

برخلاف بلندگوهای داخلی که در صورت وجود روی دستگاه همیشه در دسترس هستند، هدست بلوتوث را می توان در حین اجرای برنامه جفت یا از هم جدا کرد. اگر برنامه برای ادامه به هدست نیاز دارد، برای تشخیص اینکه چه زمانی کاربر یک هدست بلوتوث را با استفاده از 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)
  

اگر وقتی می‌خواهید خروجی صدا را ارائه دهید، برنامه شما تشخیص داد که هدست بلوتوث متصل نیست، پیام خطا نشان ندهید. در عوض، پیشنهاد دهید که کاربر را مستقیماً به تنظیمات بلوتوث ببرید تا اتصال را برای او آسان‌تر کنید. این را می توان با ارسال یک intent با 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. هنگام ساختن نمونه ExoPlayer ، setSuppressPlaybackOnUnsuitableOutput(true) را فراخوانی کنید:

      ExoPlayer exoplayer = ExoPlayer.Builder(context)
              .setAudioAttributes(...)
              .setSuppressPlaybackWhenUnsuitableOutput(true)
              // ...
              .build()
          
  2. با ثبت WearUnsuitableOutputPlaybackSuppressionResolverListener به عنوان شنونده نمونه ExoPlayer، به رویداد سرکوب پخش واکنش نشان دهید:

  3.   exoPlayer.addListener(WearUnsuitableOutputPlaybackSuppressionResolverListener(context))
        

جعبه ابزار رسانه Horologist

Horologist MediaToolkit از قبل دارای منطقی برای جلوگیری از پخش ناخواسته رسانه در بلندگوهای ساعت داخلی است.

سایر پخش کننده های رسانه