تشغيل الصوت على الأجهزة القابلة للارتداء

يوضّح هذا الدليل كيف يمكن للتطبيقات على Wear OS استخدام واجهات برمجة تطبيقات 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 أو الإصدارات الأحدث، يمكنك أن تعرض على المستخدم الانتقال مباشرةً إلى أداة تبديل إخراج الوسائط. على الأجهزة التي لا تتوافق مع أداة تبديل إخراج الوسائط، استخدِم إجراء intent 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)
  

إذا رصد تطبيقك عدم توفّر سماعة رأس بلوتوث متصلة عند الرغبة في توفير مخرجات صوتية، لا تعرض رسالة خطأ. بدلاً من ذلك، يمكنك أن تعرض على المستخدم الانتقال مباشرةً إلى إعدادات البلوتوث لتسهيل عملية الربط. يمكن إجراء ذلك عن طريق إرسال هدف مع 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. استدعِ الدالة setSuppressPlaybackOnUnsuitableOutput(true) أثناء إنشاء مثيل ExoPlayer:

      ExoPlayer exoplayer = ExoPlayer.Builder(context)
              .setAudioAttributes(...)
              .setSuppressPlaybackWhenUnsuitableOutput(true)
              // ...
              .build()
          
  2. يمكنك الاستجابة لحدث منع التشغيل من خلال تسجيل WearUnsuitableOutputPlaybackSuppressionResolverListener كأداة معالجة لنموذج ExoPlayer:

  3.   exoPlayer.addListener(WearUnsuitableOutputPlaybackSuppressionResolverListener(context))
        

Horologist Media toolkit

تحتوي Horologist MediaToolkit حاليًا على منطق لمنع تشغيل الوسائط غير المقصود على مكبّرات الصوت المدمجة في الساعة.

مشغّلات الوسائط الأخرى