يوضّح هذا الدليل كيفية استخدام واجهات برمجة التطبيقات المألوفة لنظام Android لتشغيل الصوت على تطبيقات Wear OS.
رصد أجهزة الصوت
يجب أن يرصد تطبيق Wear OS أولاً ما إذا كان الجهاز القابل للارتداء يتضمّن جهاز إخراج صوت مناسبًا. تتضمّن الأجهزة القابلة للارتداء عادةً واحدًا على الأقل من أجهزة إخراج الصوت التالية:
AudioDeviceInfo.TYPE_BUILTIN_SPEAKER: على الأجهزة التي تتضمّن مكبّر صوت مدمجًاAudioDeviceInfo.TYPE_BLUETOOTH_A2DP: عند إقران سماعة رأس Bluetooth وتوصيلهاAudioDeviceInfo.TYPE_BLE_BROADCAST: عند إقران جهاز مجموعة بث Bluetooth منخفض الطاقة (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، يوفّر النظام واجهة مستخدم تتيح للمستخدمين اختيار الجهاز الذي يشغّل الوسائط وعرض معلومات عن محتوى الوسائط الذي يتم تشغيله.
إذا رصد تطبيقك أنّه ما مِن سماعة رأس Bluetooth متصلة عندما تريد تشغيل الصوت على الأجهزة التي تعمل بنظام التشغيل Wear OS 5 أو إصدار أحدث، يمكنك أن تعرض على المستخدم الانتقال مباشرةً إلى التبديل بين مشغلات الوسائط. على الأجهزة التي لا تتوافق مع التبديل بين مشغلات الوسائط، يمكنك استدعاء إجراء ACTION_BLUETOOTH_SETTINGS intent الذي ينقل المستخدم إلى صفحة بلوتوث في إعدادات النظام.
توضّح الطريقة launchOutputSelection() method، وهي جزء من مكتبة Horologist library
على GitHub، كيفية السماح للمستخدمين باختيار جهاز إخراج الوسائط.
سماعة رأس بلوتوث
على عكس مكبّرات الصوت المدمجة التي تكون متاحة دائمًا إذا كانت متوفّرة على الجهاز، يمكن إقران سماعة رأس بلوتوث أو إلغاء إقرانها أثناء تشغيل أحد التطبيقات. إذا كان تطبيقك يتطلّب استخدام سماعة رأس لمواصلة التشغيل، عليك تسجيل معاودة الاتصال لرصد متى يربط المستخدم سماعة رأس 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 لتسهيل عملية الاتصال. يمكنك إجراء ذلك عن طريق إرسال 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:
- استدعِ
setSuppressPlaybackOnUnsuitableOutput(true)طريقة أثناء إنشاء مثيل ExoPlayer:
val exoPlayer = ExoPlayer.Builder(context) .setAudioAttributes(AudioAttributes.DEFAULT, true) .setSuppressPlaybackOnUnsuitableOutput(true) .build()
- يمكنك الاستجابة لحدث منع التشغيل عن طريق تسجيل
WearUnsuitableOutputPlaybackSuppressionResolverListenerأداة الاستماع كـ أداة استماع لمثيل ExoPlayer:
exoPlayer.addListener(WearUnsuitableOutputPlaybackSuppressionResolverListener(context))
مجموعة أدوات Horologist Media
تحتوي مجموعة أدوات Horologist MediaToolkit بالفعل على منطق لمنع تشغيل الوسائط غير المقصود على مكبّرات الصوت المدمجة في الساعة.
مشغّلات الوسائط الأخرى
- تأكَّد من أنّ تشغيل الصوت للوسائط لا يبدأ إلا عندما يكون جهاز إخراج مناسب، مثل سماعة رأس أو مكبّرات صوت خارجية، متصلاً بالساعة. تعرض القائمة التالية أجهزة إخراج مناسبة لتطبيقات الوسائط:
- إذا أبلغت
AudioManagerتطبيقك بأنّه تم فصل مصدر إخراج الصوت الخارجي عن الساعة، عليك إيقاف التشغيل مؤقتًا. - عندما يحاول المستخدم بدء تشغيل الوسائط ولكنّه لم يربط جهاز صوت خارجيًا، اطلب منه ربط جهاز بساعته.