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

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

تشخیص دستگاه های صوتی

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

  • AudioDeviceInfo.TYPE_BUILTIN_SPEAKER : در دستگاه‌های دارای بلندگوی داخلی.
  • AudioDeviceInfo.TYPE_BLUETOOTH_A2DP : زمانی که یک هدست بلوتوث جفت و متصل می شود.
  • AudioDeviceInfo.TYPE_BLE_BROADCAST : هنگامی که یک دستگاه گروه پخش کم مصرف بلوتوث (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)

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

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

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

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

با شروع 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)

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

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

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