इस गाइड में बताया गया है कि Wear OS ऐप्लिकेशन पर ऑडियो चलाने के लिए, Android के जाने-पहचाने एपीआई का इस्तेमाल कैसे किया जा सकता है.
ऑडियो डिवाइसों का पता लगाना
Wear OS ऐप्लिकेशन को सबसे पहले यह पता लगाना होगा कि स्मार्टवॉच में ऑडियो आउटपुट की सुविधा है या नहीं. आम तौर पर, पहनने वाले डिवाइसों में इनमें से कम से कम एक ऑडियो आउटपुट होता है:
AudioDeviceInfo.TYPE_BUILTIN_SPEAKER
: स्पीकर वाले डिवाइसों पर.AudioDeviceInfo.TYPE_BLUETOOTH_A2DP
: जब ब्लूटूथ हेडसेट को पेयर और कनेक्ट किया जाता है.AudioDeviceInfo.TYPE_BLE_BROADCAST
: जब ब्लूटूथ स्मार्ट (बीएलई) ब्रॉडकास्ट ग्रुप डिवाइस को पेयर और कनेक्ट किया जाता है.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
इंटेंट ऐक्शन को लागू करें. इससे उपयोगकर्ता को सिस्टम सेटिंग में मौजूद ब्लूटूथ पेज पर ले जाया जाता है.
GitHub पर मौजूद Horologist लाइब्रेरी का हिस्सा, launchOutputSelection()
method यह दिखाता है कि उपयोगकर्ताओं को मीडिया आउटपुट डिवाइस चुनने की अनुमति कैसे दी जाए.
ब्लूटूथ हेडसेट
डिवाइस में पहले से मौजूद स्पीकर हमेशा उपलब्ध रहते हैं. हालांकि, ब्लूटूथ हेडसेट को ऐप्लिकेशन के चालू रहने के दौरान भी जोड़ा या हटाया जा सकता है. अगर आपके ऐप्लिकेशन को हेडसेट की ज़रूरत है, तो कॉल बैक रजिस्टर करें. इससे यह पता चलेगा कि उपयोगकर्ता ने 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 का इस्तेमाल करता है, तो:
- ExoPlayer इंस्टेंस बनाते समय,
setSuppressPlaybackOnUnsuitableOutput(true)
method को कॉल करें:
val exoPlayer = ExoPlayer.Builder(context) .setAudioAttributes(AudioAttributes.DEFAULT, true) .setSuppressPlaybackOnUnsuitableOutput(true) .build()
- प्लेबैक बंद होने के इवेंट पर प्रतिक्रिया देने के लिए, ExoPlayer इंस्टेंस के लिसनर के तौर पर
WearUnsuitableOutputPlaybackSuppressionResolverListener
listener को रजिस्टर करें:
exoPlayer.addListener(WearUnsuitableOutputPlaybackSuppressionResolverListener(context))
Horologist Media toolkit
Horologist MediaToolkit में पहले से ही यह लॉजिक मौजूद है कि घड़ी में पहले से मौजूद स्पीकर पर अनचाहे मीडिया को चलने से कैसे रोका जाए.
अन्य मीडिया प्लेयर
- पक्का करें कि मीडिया ऑडियो सिर्फ़ तब चलना शुरू हो, जब कोई सही आउटपुट डिवाइस, जैसे कि हेडसेट या बाहरी स्पीकर, घड़ी से कनेक्ट हो. यहां मीडिया ऐप्लिकेशन के लिए, सही आउटपुट डिवाइसों की सूची दी गई है:
- अगर AudioManager आपके ऐप्लिकेशन को सूचना देता है कि कोई बाहरी ऑडियो आउटपुट डिवाइस स्मार्टवॉच से डिसकनेक्ट हो गया है, तो वीडियो चलाने की सुविधा को रोक दें.
- जब उपयोगकर्ता मीडिया चलाने की कोशिश करता है, लेकिन उसने कोई बाहरी ऑडियो डिवाइस कनेक्ट नहीं किया है, तो उन्हें अपनी स्मार्टवॉच से कोई डिवाइस कनेक्ट करने के लिए कहें.