پخش صدا در پوشیدنی‌ها

این راهنما نحوه استفاده از میاناهای برنامه‌سازی کاربردی آشنای Android را برای پخش صدا در برنامه‌های Wear OS شرح می‌دهد.

شناسایی دستگاه‌های صوتی

برنامه Wear OS ابتدا باید تشخیص دهد که دستگاه پوشیدنی خروجی صدای مناسبی دارد یا نه. دستگاه‌های پوشیدنی معمولاً حداقل یکی از بروندادهای صوتی زیر را دارند:

  • AudioDeviceInfo.TYPE_BUILTIN_SPEAKER: در دستگاه‌های دارای بلندگوی داخلی.
  • AudioDeviceInfo.TYPE_BLUETOOTH_A2DP: وقتی هدست بلوتوث جفت و متصل باشد.
  • AudioDeviceInfo.TYPE_BLE_BROADCAST: وقتی دستگاه گروه همه‌فرستی «بلوتوث کم‌مصرف» (BLE) جفت و متصل می‌شود.
  • AudioDeviceInfo.TYPE_BLE_HEADSET: وقتی هدست بلوتوث کم‌مصرف جفت و متصل باشد.
  • AudioDeviceInfo.TYPE_BLE_SPEAKER: وقتی بلندگوی بلوتوث کم‌مصرف جفت و متصل شود.

مثال زیر از روش 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)

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

انتخاب دستگاه ترجیحی برای خروجی صوتی

بسته به مورد استفاده برنامه شما و اهمیت صدا برای تجربه اصلی آن، انتخاب کنید که کاربران چگونه با برونداد صدای برنامه شما تعامل داشته باشند.

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

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

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

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

هدست بلوتوث

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

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

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

  1. با ثبت کردن WearUnsuitableOutputPlaybackSuppressionResolverListener شنونده به‌عنوان شنونده نمونه ExoPlayer، به رویداد سرکوب بازپخش واکنش نشان دهید:

exoPlayer.addListener(WearUnsuitableOutputPlaybackSuppressionResolverListener(context))

جعبه‌ابزار رسانه‌ای ساعت‌ساز

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

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