يوضّح هذا الدليل كيف يمكنك استخدام واجهات برمجة تطبيقات 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
Intent الذي ينقل المستخدم إلى صفحة البلوتوث في إعدادات النظام.
توضّح الدالة launchOutputSelection()
method، وهي جزء من مكتبة Horologist
على 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)
إذا رصد تطبيقك عدم توفّر سماعة رأس بلوتوث متصلة عندما تريد توفير إخراج صوتي، لا تعرض رسالة خطأ. بدلاً من ذلك، يمكنك أن تعرض على المستخدم الانتقال مباشرةً إلى إعدادات البلوتوث لتسهيل عملية الاتصال. يمكنك إجراء ذلك من خلال إرسال 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
listener كأداة معالجة لنموذج ExoPlayer:
exoPlayer.addListener(WearUnsuitableOutputPlaybackSuppressionResolverListener(context))
Horologist Media toolkit
تحتوي Horologist MediaToolkit على منطق لمنع تشغيل الوسائط غير المقصود على مكبّرات الصوت المدمجة في الساعة.
مشغّلات الوسائط الأخرى
- تأكَّد من أنّ تشغيل صوت الوسائط يبدأ فقط عند توصيل جهاز إخراج مناسب بالساعة، مثل سماعة رأس أو مكبّرات صوت خارجية. تعرض القائمة التالية أجهزة الإخراج المناسبة لتطبيقات الوسائط:
- إيقاف التشغيل مؤقتًا إذا أرسل AudioManager إشعارًا إلى تطبيقك بأنّه تم قطع اتصال جهاز إخراج الصوت الخارجي بالساعة.
- عندما يحاول المستخدم بدء تشغيل الوسائط بدون توصيل جهاز صوت خارجي، اطلب منه توصيل جهاز بساعته.