डेवलपर रिलेशंस इंजीनियर
उपयोगकर्ता अब फ़ोन, पहने जाने वाले डिवाइसों, और ऑडियो डिवाइसों के बीच स्विच करते रहते हैं. इसलिए, उन्हें जोड़े रखने के लिए, अलग-अलग डिवाइसों पर बेहतर अनुभव देना ज़रूरी हो गया है. हालांकि, नेटवर्किंग के स्टैंडर्ड तरीकों पर भरोसा करने से अक्सर बैटरी जल्दी खत्म हो जाती है, इंतज़ार का समय बढ़ जाता है, और उपयोगकर्ता सेशन अलग-अलग हिस्सों में बंट जाते हैं.
इस लेख में, मल्टी-डिवाइस कम्यूनिकेशन के लिए बनाए गए खास Android एपीआई के बारे में ज़्यादा जानकारी दी गई है. ये एपीआई, मेमोरी और बैटरी की खपत को कम करने वाले पैटर्न उपलब्ध कराते हैं. इससे डिवाइसों के बीच ट्रांज़िशन तुरंत, भरोसेमंद, और आसान हो जाता है.
ट्रांसक्रिप्ट
नमस्ते.
क्रॉस-डिवाइस इंटरैक्शन को आसान बनाने की सुविधा में आपका स्वागत है.
मेरा नाम हानरुई है. आज मेरे साथ मेरे साथी, यासीन और नटराज भी हैं.
कनेक्टिविटी की बात करते ही, अक्सर हमारे दिमाग में बेसिक नेटवर्क लिंक या ब्लूटूथ हेडसेट का ख्याल आता है.
Android पर, कनेक्टिविटी इससे कहीं ज़्यादा बेहतर है.
इसका मकसद, डिवाइसों को एक साथ बेहतर तरीके से काम करने में मदद करना है.
आज हम आपको क्रॉस-डिवाइस के सामान्य मामलों के बारे में बताएंगे. साथ ही, यह भी बताएंगे कि हर मामले के लिए कौनसा एपीआई सही है.
काफ़ी समय तक, हम सिर्फ़ एक डिवाइस यानी फ़ोन के लिए ऐप्लिकेशन बनाते थे.
इसके बाद, पहने जाने वाले डिवाइसों का दौर शुरू हुआ.
जल्द ही, फ़ोन के साथ स्मार्टवॉच को जोड़ना, बैकग्राउंड में डेटा सिंक करना या सीधे कॉल करना बहुत आम हो गया.
वायरलेस ईयरबड जोड़ें.
अब उपयोगकर्ता कॉल के दौरान, ऑडियो डिवाइस को स्मार्टवॉच से फ़ोन, ईयरबड या कार पर स्विच कर सकते हैं.
हाल ही में, कई उपयोगकर्ता बड़ी स्क्रीन वाले दूसरे डिवाइस का भी इस्तेमाल करते हैं. जैसे, फ़ोल्ड किए जा सकने वाले डिवाइस या टैबलेट.
वे चाहते हैं कि ऐप्लिकेशन इन डिवाइसों पर आसानी से काम करे.
यह सुविधा लैपटॉप और Chromebook पर भी उपलब्ध है. इन पर उपयोगकर्ता, Android ऐप्लिकेशन चला सकते हैं और अपनी डेस्क से ही कनेक्ट रह सकते हैं.
साल 2023 में भी, एक औसत उपयोगकर्ता के पास तीन से चार डिवाइस होते थे.
उपयोगकर्ता इन डिवाइसों पर, सिर्फ़ स्टैंडअलोन फ़ंक्शन से ज़्यादा की उम्मीद करते हैं.
वे एक साथ काम करने का शानदार अनुभव चाहते हैं.
एक साथ बेहतर अनुभव पाने की सुविधा का फ़ायदा तब साफ़ तौर पर दिखता है, जब लोग एक ही कमरे में हों और उन्हें अपने आस-पास मौजूद लोगों के साथ फ़ोटो, लिंक या ऐप्लिकेशन शेयर करने का आसान तरीका चाहिए.
आंकड़ों के मुताबिक, यह नेटवर्क बहुत बड़ा है और तेज़ी से बढ़ रहा है.
इस साल, दुनिया भर में करीब 22 अरब आईओटी डिवाइस हैं. इनकी संख्या में साल-दर-साल 14% की बढ़ोतरी हो रही है.
इन सभी एंड पॉइंट में से, एक तिहाई वाई-फ़ाई और एक चौथाई ब्लूटूथ से जुड़े होते हैं.
क्रॉस-डिवाइस कनेक्टिविटी अब कोई नई बात नहीं है.
यह हमारी रोज़मर्रा की ज़िंदगी का हिस्सा है.
हालांकि, आज भी ज़्यादातर ऐप्लिकेशन, क्रॉस-डिवाइस सुविधाओं को लो-लेवल नेटवर्क और ब्लूटूथ एपीआई पर बनाते हैं. इससे तीन समस्याएं आती हैं.
सबसे पहले, बैटरी और मेमोरी.
बैकग्राउंड में स्कैन और सेवाओं को चालू रखने से, बैटरी और मेमोरी खर्च होती है.
दूसरा, इंतज़ार का समय.
अचानक होने वाली देरी की वजह से, रीयल-टाइम कॉल और डेटा सिंक करने में रुकावट आती है.
तीसरा, कनेक्शन में होने वाली गड़बड़ी.
सभी डिवाइसों पर, डिवाइसों को खोजने, उन्हें जोड़ने, और फिर से कनेक्ट करने की प्रोसेस को मैनेज करना मुश्किल होता है. इससे उपयोगकर्ता अनुभव खराब हो सकता है.
इन समस्याओं से छुटकारा पाने के लिए, हमने तीन मुख्य कैटगरी में खास तौर पर एपीआई बनाए हैं. इनसे क्रॉस-डिवाइस की सुविधाओं को इस्तेमाल करना बेहद आसान हो जाता है.
मैं कंपैनियन ऐप्लिकेशन के बारे में बताऊँगा. इसके बाद, नटराज वीओआईपी ऐप्लिकेशन के बारे में बताएँगे. फिर यासीन, पी2पी शेयरिंग के बारे में बात करेंगे.
सबसे पहले, कंपैनियन ऐप्लिकेशन के बारे में जानते हैं.
कंपैनियन ऐप्लिकेशन, फ़ोन पर इंस्टॉल किया जाने वाला एक ऐप्लिकेशन होता है. इससे स्मार्टवॉच या ग्लूकोज़ सेंसर जैसे कंपैनियन डिवाइस को फ़ोन के साथ आसानी से इस्तेमाल किया जा सकता है.
इस सेक्शन में, हम ब्लूटूथ से कनेक्ट किए गए डिवाइसों के बारे में बात करेंगे.
आम तौर पर, कंपैनियन डिवाइसों की चार कैटगरी होती हैं.
पहला, मेडिकल डिवाइस. जैसे, ग्लूकोज़ सेंसर और वाइटल साइन मॉनिटर.
पहने जाने वाले डिवाइस, जैसे कि स्मार्टवॉच और फ़िटनेस बैंड.
फ़ास्ट पेयरिंग और स्मार्ट कंट्रोल की सुविधा वाले हेडसेट.
कार किट, ताकि कार की डिजिटल कुंजी और बोलकर इस्तेमाल करने जैसी सुविधाओं का इस्तेमाल किया जा सके.
हर कैटगरी में उपयोगकर्ता अनुभव से जुड़ी अपनी मुख्य गतिविधियां होती हैं. हालांकि, इन सभी के लिए, डिवाइस और फ़ोन के बीच भरोसेमंद कनेक्शन होना ज़रूरी है.
मेडिकल डिवाइसों के लिए, यह कनेक्शन जान बचाने वाला भी हो सकता है.
आइए, इन कैटगरी में दिखने वाली चार सामान्य ज़रूरतों के बारे में जानें.
सबसे पहले, डिवाइस मैनेजमेंट.
ऐप्लिकेशन को आस-पास मौजूद सभी डिवाइसों में से सही डिवाइस ढूंढना होगा. जैसे, यहां ईयरबड या स्पीकर के बजाय स्मार्टवॉच को ढूंढना होगा. इसके बाद, कनेक्ट करने के लिए पेयरिंग की प्रोसेस शुरू करनी होगी.
दूसरा, मौजूदगी की जांच करना.
ऐप्लिकेशन को यह पता होना चाहिए कि डिवाइस कब आस-पास है और कब नहीं.
जब डिवाइस दिखता है, तो ऐप्लिकेशन को चालू करने का कोई तरीका होना चाहिए, ताकि वह अपना काम कर सके. भले ही, उपयोगकर्ता ने उसे खोला न हो.
तीसरा, कनेक्शन का रखरखाव.
कनेक्ट होने के बाद, ऐप्लिकेशन चाहते हैं कि कनेक्शन भरोसेमंद और लगातार बना रहे.
अगर कनेक्शन टूट जाता है, जैसे कि उपयोगकर्ता रेंज से बाहर चला जाता है और फिर वापस आता है, तो ऐप्लिकेशन को अपने-आप फिर से कनेक्ट होना चाहिए. भले ही, वह उस समय न चल रहा हो.
चौथा, डेटा सिंक और ट्रांसफ़र करना.
यहीं पर ऑडियंस को सबसे ज़्यादा वैल्यू और असली फ़ायदा मिलता है.
सेंसर की रीडिंग सिंक करना, फ़र्मवेयर के अपडेट पुश करना या डिवाइस पर सेटिंग भेजना.
मेडिकल डिवाइसों के लिए, यह ज़रूरी हो सकता है.
रीडिंग न लेने का मतलब है कि आपको चेतावनी नहीं मिलेगी.
इन सभी के लिए, ऐप्लिकेशन की प्रोसेस चालू होनी चाहिए और सही समय पर कनेक्ट होनी चाहिए.
ऐप्लिकेशन ने इन सभी ज़रूरतों को कैसे पूरा किया है?
पहले, ऐप्लिकेशन ज़्यादातर फ़ोरग्राउंड सेवा पर निर्भर होते थे.
यहां इसे लागू करने का एक सामान्य तरीका बताया गया है.
अगर आपने पहले कभी कोई कंपैनियन ऐप्लिकेशन बनाया है, तो आपको यह जाना-पहचाना लग सकता है.
आपको ब्लूटूथ डिवाइस का पता लगाने और कनेक्ट करने की अनुमतियों, फ़ोरग्राउंड सेवा की अनुमतियों, और कनेक्ट किए गए डिवाइस के लिए फ़ोरग्राउंड सेवा के टाइप का एलान करना होगा. इसके बाद, सूचना की अनुमति का एलान करना होगा, क्योंकि फ़ोरग्राउंड सेवा को लगातार सूचना दिखानी होती है.
<uses-permission android:name="android.permission.BLUETOOTH_SCAN"
android:usesPermissionFlags="neverForLocation" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_CONNECTED_DEVICE" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />इसके बाद, ऐप्लिकेशन की प्रोसेस को चालू रखने के लिए, स्टिकी सर्विस चलाएं.
class BleForegroundService : Service() {
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
…
return START_STICKY
}
}यह तरीका काम करता है, लेकिन इससे बैटरी और मेमोरी खर्च होती है. ऐसा इसलिए, क्योंकि यह सेवा हमेशा चालू रहती है, भले ही डिवाइस आस-पास न हो.
इसलिए, हमने कंपैनियन डिवाइस मैनेजर या सीडीएम बनाया.
सबसे पहले, यह डिवाइस की मौजूदगी के आधार पर आपके ऐप्लिकेशन को चालू कर सकता है. जब तक डिवाइस रेंज में रहेगा, तब तक सिस्टम आपके ऐप्लिकेशन की प्रोसेस को चालू रखेगा.
फ़ोरग्राउंड सेवा की ज़रूरत नहीं है.
दूसरा, सीडीएम में डिवाइस प्रोफ़ाइलें काम करती हैं.
डिवाइस प्रोफ़ाइल की मदद से, उपयोगकर्ता आपके ऐप्लिकेशन को ज़रूरी सभी अनुमतियां एक ही टैप में दे सकता है. इसके लिए, उसे अनुमति वाले कई डायलॉग बॉक्स पर टैप करने की ज़रूरत नहीं पड़ती.
इससे उपयोगकर्ता अनुभव और कन्वर्ज़न रेट में काफ़ी सुधार होता है.
स्मार्टवॉच प्रोफ़ाइल, Android 12 और इसके बाद के वर्शन पर उपलब्ध है. वहीं, स्मार्ट ग्लास प्रोफ़ाइल, Android 14 और इसके बाद के वर्शन पर उपलब्ध है.
Android 17 में, हमने खास तौर पर मेडिकल डिवाइस और फ़िटनेस ट्रैकर के लिए दो नई प्रोफ़ाइलें जोड़ी हैं.
फ़िलहाल, कुछ खास प्रोफ़ाइलें सिर्फ़ सिस्टम ऐप्लिकेशन के लिए उपलब्ध हैं.
अगर हमें डेवलपर नेटवर्क से इस बारे में ज़्यादा अनुरोध मिलते हैं, तो हम ज़्यादा डेवलपर के लिए ये सुविधाएं उपलब्ध कराने पर विचार कर सकते हैं.
सीडीएम का इस्तेमाल करना बहुत आसान है.
आइए, मेडिकल डिवाइस का उदाहरण लेते हैं.
सबसे पहले, ज़रूरी अनुमतियों के बारे में बताएं: एक मेडिकल डिवाइस के लिए, एक बैकग्राउंड में चलाने के लिए, और एक डिवाइस की मौजूदगी का पता लगाने के लिए.
<uses-permission android:name="android.permission.REQUEST_COMPANION_PROFILE_MEDICAL" />
<uses-permission android:name="android.permission.REQUEST_COMPANION_RUN_IN_BACKGROUND" />
<uses-permission android:name="android.permission.REQUEST_OBSERVE_COMPANION_DEVICE_PRESENCE" />एक बात ध्यान देने वाली है कि फ़ोरग्राउंड सेवा लागू करने के लिए ज़रूरी अनुमतियों के उलट, यहां दी गई सभी अनुमतियां सामान्य अनुमतियां हैं. इसका मतलब है कि ऐप्लिकेशन इंस्टॉल करते समय ये अनुमतियां मिल जाएंगी और इनके लिए कोई प्रॉम्प्ट डायलॉग नहीं दिखेगा.
उपयोगकर्ता को सिर्फ़ असोसिएशन को मंज़ूरी देनी होगी.
आइए, असोसिएशन बनाने का तरीका जानें.
यहां हम डिवाइस फ़िल्टर के साथ असोसिएशन का अनुरोध बनाते हैं, ताकि सिर्फ़ सही डिवाइस दिखे.
val paringRequest = AssociationRequest.Builder()
.addDeviceFilter(deviceFilter)
.setSingleDevice(true)
.setDeviceProfile(AssociationRequest.DEVICE_PROFILE_MEDICAL)
.build()
companionDeviceManager.associate(paringRequest, ContextCompat.getMainExecutor(this),
object : CompanionDeviceManager.Callback() {
override fun onAssociationPending(intentSender: IntentSender) {
intentSenderLauncher.launch(IntentSenderRequest.Builder(intentSender).build())
}
override fun onAssociationCreated(associationInfo: AssociationInfo) { … }
override fun onFailure(error: CharSequence?) { … }
}
)setSingleDevice को true पर सेट करें, क्योंकि हमें सिर्फ़ एक मैच चाहिए. साथ ही, प्रोफ़ाइल को medical पर सेट करें.
इसके बाद, असोसिएट को कॉल करें.
सीडीएम, स्कैनिंग को मैनेज करता है.
onAssociationPending में, हमें IntentSender मिलेगा.
इसे लॉन्च करें. इसके बाद, सिस्टम एक असोसिएशन डायलॉग दिखाता है.
मेडिकल प्रोफ़ाइल के साथ, यहां एक बार टैप करने से न सिर्फ़ असोसिएशन को मंज़ूरी मिलती है, बल्कि प्रोफ़ाइल को ज़रूरी सभी अनुमतियां भी मिलती हैं. यहां तक कि 'परेशान न करें' सुविधा को भी बायपास किया जा सकता है. यह सुविधा, गंभीर चेतावनियों के लिए ज़रूरी है.
जब उपयोगकर्ता 'अनुमति दें' पर टैप करेगा, तो हमें AssociationInfo के साथ onAssociationCreated मिलेगा. इसमें एक असोसिएशन आईडी शामिल होता है.
इसके बाद, हम डिवाइस की मौजूदगी का पता लगा सकते हैं. इसके लिए, हमें उस असोसिएशन आईडी के साथ startObservingDevicePresence को कॉल करना होगा.
साथ ही, आपको ऐसी सेवा लागू करनी होगी जो CompanionDeviceService को बढ़ाती हो.
class BleCompanionDeviceService : CompanionDeviceService() {
override fun onDevicePresenceEvent(event: DevicePresenceEvent) {
when (event.event) {
DevicePresenceEvent.EVENT_BLE_APPEARED -> onDeviceAppeared(event.associationId)
DevicePresenceEvent.EVENT_BLE_DISAPPEARED -> onDeviceDisappeared(event.associationId)
}
}
private fun onDeviceAppeared(associationId: Int) { … }
private fun onDeviceDisappeared(associationId: Int) { … }
}जब डिवाइस रेंज में आता है, तो सिस्टम आपकी सेवा से जुड़ जाता है. भले ही, आपका ऐप्लिकेशन न चल रहा हो.
इसके बाद, सिस्टम EVENT_BLE_APPEARED का इस्तेमाल करके onDevicePresenceEvent को कॉल करेगा.
इसके बाद, कनेक्ट और सिंक किया जा सकता है.
डिवाइस के इस जगह से बाहर जाने पर, आपको EVENT_BLE_DISAPPEARED मिलेगी.
इसके बाद, स्टोरेज खाली किया जा सकता है.
हमेशा चालू रहने वाली कोई सेवा नहीं है और न ही सिर्फ़ चालू रहने के लिए कोई सूचना है.
हालांकि, सीडीएम की कुछ सीमाएं हैं, जिनका ध्यान डेवलपर्स को रखना चाहिए.
सबसे पहले, ओएस वर्शन.
सीडीएम की ज़्यादातर सुविधाएं, Android 12 और 13 में उपलब्ध हैं.
हालांकि, Android 16 में कुछ शानदार सुधार किए गए और Android 17 में नई प्रोफ़ाइलें जोड़ी गईं.
इसलिए, रनटाइम के दौरान ओएस वर्शन की जांच करें और पुराने वर्शन के लिए फ़ॉलबैक रखें.
हालांकि, टारगेट एसडीके हर साल बढ़ता है और कम से कम एसडीके भी इसके हिसाब से बढ़ता है.
ऐप्लिकेशन को मेमोरी से जुड़ी समस्याओं से बचाने के लिए, हमारा सुझाव है कि ऐप्लिकेशन को जल्द से जल्द फ़ोरग्राउंड सेवा से सीडीएम पर माइग्रेट करें.
अगर आपके पास इस्तेमाल का कोई ऐसा उदाहरण है जो फ़िलहाल सीडीएम के साथ काम नहीं करता, तो हमें बताएं.
दूसरा, आज के समय में सीडीएम, बैकग्राउंड स्कैनिंग की सुविधा देता है, लेकिन बैकग्राउंड विज्ञापन की सुविधा नहीं देता.
हमें इस सुविधा की ज़रूरत के बारे में बहुत कम सुनने को मिलता है.
हालांकि, अगर आपके ऐप्लिकेशन को फ़ोन को पेरिफ़ेरल के तौर पर इस्तेमाल करने और बैकग्राउंड में लगातार विज्ञापन दिखाने की ज़रूरत है, तो हमें इस बारे में ज़्यादा जानकारी देने में खुशी होगी.
तीसरा, सीडीएम कम पावर वाले स्कैन मोड का इस्तेमाल करता है.
यह बैटरी और मेमोरी बचाने के लिए, रीयल-टाइम में जवाब देने की सुविधा को थोड़ा कम कर देता है.
इसलिए, यह उम्मीद न करें कि डिवाइस तुरंत चालू हो जाएगा.
आखिर में, पेलोड को न देखना.
किसी खास विशेषता या विज्ञापन डेटा के लिए रजिस्टर नहीं किया जा सकता.
हालांकि, डिवाइस के रेंज में आते ही आपका ऐप्लिकेशन चालू हो जाता है.
इसलिए, यह ज़रूरत के हिसाब से कनेक्ट करके पेलोड की जांच कर सकता है.
कंपैनियन ऐप्लिकेशन और सीडीएम के बारे में बस इतना ही.
अब मैं नटराज को वीओआईपी ऐप्लिकेशन के बारे में बताने के लिए आमंत्रित करता हूं.
अगर आपके ऐप्लिकेशन के पास कोई खास पेरिफ़ेरल है और वह लगातार उससे कम्यूनिकेट करता है, तो CompanionDeviceManager सही टूल है.
सभी को नमस्ते।
मेरा नाम नटराज के आर है.
अब मैं आपको क्रॉस-डिवाइस की अगली सुविधा के बारे में बताऊंगी. यह सुविधा है, रीयल-टाइम में कॉल करना.
आज-कल, लोगों के कॉल मैनेज करने का तरीका बदल रहा है.
40% से ज़्यादा कॉल, वीओआईपी नेटवर्क पर किए जा रहे हैं.
Android इसमें अहम भूमिका निभा रहा है.
इनमें से 71% कॉल, Android डिवाइसों पर किए जाते हैं.
सिर्फ़ कॉल ही नहीं.
लोग अब कई तरह के डिवाइसों का इस्तेमाल कर रहे हैं.
दुनिया भर में 25 करोड़ से ज़्यादा कारों में Android Auto का इस्तेमाल किया जा रहा है. साथ ही, हम उपयोगकर्ताओं को 100 करोड़ से ज़्यादा ब्लूटूथ डिवाइस उपलब्ध करा रहे हैं.
इयरबड, Wear OS स्मार्टवॉच, Android-- Android Auto की सुविधा वाली कारें, और ब्लूटूथ स्पीकर, ऐसे डिवाइस हैं जो लोग अपने फ़ोन के साथ इस्तेमाल करते हैं. वे चाहते हैं कि इन सभी डिवाइसों पर कॉल की सुविधा आसानी से काम करे.
उदाहरण के लिए, उपयोगकर्ता को कॉल आने पर, कॉलर की जानकारी देखने के लिए अपनी स्मार्टवॉच पर नज़र डालनी होगी.
वे अपनी स्मार्टवॉच पर कॉल का जवाब दे सकते हैं.
वे ज़रूरत के हिसाब से म्यूट या अनम्यूट कर सकते हैं. साथ ही, ईयरबड लगाकर कॉल जारी रख सकते हैं.
अगर उन्हें बाहर जाना है, तो वे अपनी कार में बैठेंगे और उम्मीद करेंगे कि कॉल बिना किसी रुकावट के कार के केबिन में स्विच हो जाए.
इसलिए, यह उपयोगकर्ता के लिए एक सामान्य रूटीन बन गया है और इसमें कोई प्रीमियम अनुभव नहीं है.
यह हर उपयोगकर्ता की बुनियादी ज़रूरत है. इसलिए, यह हम Android डेवलपर की ज़िम्मेदारी है कि हम अपने वीओआईपी ऐप्लिकेशन में उपयोगकर्ताओं को बेहतर अनुभव दें.
हालांकि, अगर इसे खुद से बनाने की कोशिश की जाए, तो आपको तीन बड़ी समस्याओं का सामना करना पड़ सकता है.
पहला, ब्लूटूथ सॉकेट के साथ फ़्रैगमेंटेशन.
सिस्टम को यह नहीं पता होता कि आपका ऐप्लिकेशन किसी कॉल को मैनेज कर रहा है. इसलिए, आपको कस्टम ब्लूटूथ सॉकेट और कस्टम मीडिया सेशन बनाने होंगे, ताकि आपके कॉल को स्मार्टवॉच या Android Auto पर प्रोजेक्ट किया जा सके.
दूसरी समस्या ऑडियो फ़ोकस की है.
आपको लो-लेवल AudioManager एपीआई और ब्लूटूथ एपीआई का इस्तेमाल करना पड़ता है. इस वजह से, ऑडियो लीक होता है. साथ ही, यह सिस्टम के लिए प्राथमिकता नहीं है, है न?
आपके ऐप्लिकेशन में वीओआईपी कॉल की सुविधा है. इसलिए, जब भी कोई कैरियर कॉल आता है, तो वह रुकावट डालता है और मॉडेम ऑडियो को रोक देता है. इससे आपके ऐप्लिकेशन में कोई ऑडियो नहीं आता.
सबसे खराब बात यह है कि कॉल खत्म होने के बाद भी, ऑडियो फ़ोकस आपके ऐप्लिकेशन पर वापस नहीं आएगा.
तीसरी समस्या, सिंक करने से जुड़ी है.
उपयोगकर्ता अपनी स्मार्टवॉच पर म्यूट बटन पर टैप करता, लेकिन फ़ोन के यूज़र इंटरफ़ेस (यूआई) पर कॉल अब भी अनम्यूट दिखता.
इससे काफ़ी भ्रम पैदा होता है.
उपयोगकर्ता ने कार के स्टीयरिंग कॉलम से कॉल डिसकनेक्ट कर दिया, लेकिन फ़ोन पर अब भी कॉल की सूचना दिख रही है.
जब ऐसा होता है, तो उपयोगकर्ता को बहुत निराशा होती है.
इन सभी समस्याओं को हल करने के लिए, हमने Jetpack Telecom बनाया है.
इसलिए, CallsManager का इस्तेमाल करके, Jetpack Telecom के साथ अपने कॉल को एक बार रजिस्टर करें. इसके बाद, Jetpack Telecom एक सेंट्रल सिस्टम कॉल कोऑर्डिनेटर के तौर पर काम करता है.
यह आपके कॉल को स्मार्टवॉच, Android Auto, और उपयोगकर्ता के मालिकाना हक वाले अन्य रिमोट प्लैटफ़ॉर्म पर प्रोजेक्ट करने की ज़िम्मेदारी लेता है.
साथ ही, यह ऑडियो फ़ोकस को भी मैनेज करता है.
सबसे अहम बात यह है कि यह सुविधा Android 8 और इसके बाद के वर्शन वाले डिवाइसों पर आसानी से काम करती है.
कॉल को स्मार्टवॉच या कार की स्क्रीन पर प्रोजेक्ट करना, आधी कहानी है. ऐसा इसलिए, क्योंकि उपयोगकर्ता इन डिवाइसों से कॉल की स्थिति को कंट्रोल करना चाहते हैं.
उन्हें ज़रूरत के हिसाब से, स्मार्टवॉच से कॉल को म्यूट या अनम्यूट करना हो.
वे कार के स्टीयरिंग कॉलम से या ईयरबड पर दो बार टैप करके कॉल को काटना चाहते हैं.
इसलिए, Jetpack Telecom इन हार्डवेयर इवेंट को सुनता है और उन्हें कॉलबैक के तौर पर एक ही जगह पर दिखाता है. यह जगह CallControlScope है.
आपको बस इन कॉलबैक को सुनना होगा, अपने कॉल इंजन को मैनेज करना होगा, और उसके हिसाब से कॉल की स्थिति को अपडेट करना होगा.
Jetpack Telecom, डिवाइसों के बीच कॉल की इस स्थिति को सिंक करने की ज़िम्मेदारी लेता है.
लाइब्रेरी से दो तरह के फ़ायदे मिलते हैं.
पहला, इससे उन सभी समस्याओं का समाधान हो जाता है जिनके बारे में हमने बात की है.
इसलिए, आपको AudioManager एपीआई के लो-लेवल पर काम करने की ज़रूरत नहीं है. लाइब्रेरी, कॉल एंडपॉइंट के बारे में जानकारी देती है, ऑडियो फ़ोकस को मैनेज करती है, और डिवाइसों के बीच सिंक करती है.
यह डिवाइसों के बीच कॉल को ट्रांसफ़र करने की ज़िम्मेदारी लेता है.
साथ ही, यह मोबाइल नेटवर्क पर आने वाले कॉल को भी मैनेज करता है.
इस लाइब्रेरी का एक और फ़ायदा यह है कि इसे Kotlin के ऊपर बनाया गया है. इसलिए, Jetpack Telecom की मदद से कॉल जोड़ने पर, Kotlin कोरूटीन स्कोप खुल जाता है.
इसलिए, यह Kotlin कोरूटीन का फ़ायदा लेता है. साथ ही, Kotlin कोरूटीन तब तक चालू रहता है, जब तक कॉल चलता है.
इसलिए, कॉल के दौरान आपने जो भी जॉब चलाया है वह कॉल डिसकनेक्ट होते ही अपने-आप बंद हो जाता है.
इसलिए, आपके पास कोई भी खराब जॉब नहीं बचेगा. साथ ही, कॉल लाइफ़साइकल का ध्यान भी लाइब्रेरी रखती है.
अब आपको लग रहा होगा कि यह लाइब्रेरी बहुत शानदार है और आपको इसे लागू करना चाहिए, है न?
यह बेहद आसान है.
पहला चरण यह है कि आपको डिपेंडेंसी का एलान करना होगा.
इसके बाद, ज़रूरी अनुमति का एलान करें, जो कि MANAGE_OWN_CALLS है. इसके बाद, CallsManager ऑब्जेक्ट को इंस्टैंशिएट करें.
<uses-permission android:name="android.permission.MANAGE_OWN_CALLS" />CallsManager ऑब्जेक्ट को इंस्टैंशिएट करने के बाद, अपने ऐप्लिकेशन को उन सुविधाओं के साथ रजिस्टर करें जो आपको ऐप्लिकेशन के साथ उपलब्ध करानी हैं. जैसे, वीडियो कॉलिंग या कॉल स्ट्रीमिंग.
// Initialize CallsManager & register supported capabilities once
val callsManager = CallsManager(context)
callsManager.registerAppWithTelecom(
capabilities = CallsManager.CAPABILITY_SUPPORTS_VIDEO_CALLING or
CallsManager.CAPABILITY_SUPPORTS_CALL_STREAMING
)इसके बाद, दूसरा चरण.
Jetpack Telecom में अपना ऐप्लिकेशन रजिस्टर करने के बाद, अब इनकमिंग और आउटगोइंग कॉल मैनेज करने का समय आ गया है.
इसके लिए, आपको एक CallAttributesCompat ऑब्जेक्ट बनाना होगा. इसमें कॉल का मेटाडेटा होता है. जैसे, कॉल करने वाले या कॉल पाने वाले व्यक्ति का displayName, पता (कॉल करने वाले का एंडपॉइंट), और कॉल की दिशा. इससे यह पता चलता है कि कॉल इनकमिंग कॉल है या आउटगोइंग कॉल, ताकि Jetpack Telecom इस रिमोट प्लैटफ़ॉर्म पर संबंधित यूज़र इंटरफ़ेस (यूआई) दिखा सके. इसके बाद, callType से यह पता चलता है कि यह ऑडियो कॉल है या वीडियो कॉल, ताकि आपको ज़रूरी संसाधन मिल सकें.
val attributes = CallAttributesCompat(
displayName = "Kukk Nat",
address = Uri.parse("tel:+16505550199"),
direction = CallAttributesCompat.DIRECTION_INCOMING,
callType = CallAttributesCompat.CALL_TYPE_AUDIO_CALL
)
callsManager.addCall(
attributes, onAnswer, onDisconnect, onSetActive, onSetInactive
) {
// Coroutine CallControlScope active for the duration of the call
}मेटाडेटा ऑब्जेक्ट तैयार होने के बाद, उसे callsManager.addCall तरीके का इस्तेमाल करके जोड़ें.
इससे कॉल कंट्रोल कोरूटीन स्कोप खुलता है.
कॉल जोड़ने के बाद, तीसरे चरण पर जाएं.
तीसरे चरण में, उन रिमोट सरफ़ेस से की जाने वाली उपयोगकर्ता की कार्रवाइयों को सुना जाता है.
इसलिए, आपके पास CallControlScope है. आपको बस Kotlin फ़्लो इकट्ठा करने होंगे.
callsManager.addCall(attributes, onAnswer, onDisconnect, onSetActive, onSetInactive) {
// 1. React to hardware mute toggles from Watch, Car, or Headset
launch {
isMuted.collect { muted -> audioEngine.setMicMuted(muted) }
}
// 2. Observe available endpoints & request declarative switches
launch {
currentCallEndpoint.collect { endpoint -> updateUi(endpoint) }
}
requestEndpointChange(preferredBluetoothEndpoint)
}जब उपयोगकर्ता उन रिमोट प्लैटफ़ॉर्म से कॉल को म्यूट करता है, तब प्रतिक्रिया देने के लिए isMuted को इकट्ठा किया जाता है. इसके हिसाब से, कॉल की स्थिति को अपडेट किया जा सकता है.
currentCallEndpoint को इकट्ठा करें, ताकि आपको पता चल सके कि कॉल फ़िलहाल किस एंडपॉइंट पर हो रहा है. इससे आपको अपने यूज़र इंटरफ़ेस (यूआई) को उसी हिसाब से अपडेट करने में मदद मिलेगी.
अपने फ़ोन के यूज़र इंटरफ़ेस (यूआई) पर, उस डिवाइस को दिखाया जा सकता है.
जब भी उपयोगकर्ता को एक डिवाइस से दूसरे डिवाइस पर स्विच करना हो, तो उपयोगकर्ता की पसंद के एंडपॉइंट के साथ requestEndpointChange तरीके को कॉल करें.
यह बहुत आसान है.
इन तीन चरणों को पूरा करने के बाद, आपका ऐप्लिकेशन Jetpack Telecom के साथ इंटिग्रेट हो जाएगा और इस्तेमाल के लिए तैयार हो जाएगा.
लेकिन, इतना ही नहीं है.
Jetpack Telecom 1.1.0 के साथ, हम कई और सुविधाएं ला रहे हैं. जैसे, कॉल इतिहास को एक साथ दिखाने की सुविधा. इसका मतलब है कि आपके सभी वीओआईपी कॉल, अब सिस्टम डायलर पर नेटिव तौर पर दिखेंगे.
इसका फ़ायदा यह है कि आपके उपयोगकर्ता, आपके सिस्टम डायलर से सीधे आपके ऐप्लिकेशन में वन-टैप कॉल बैक की सुविधा इंस्टैंशिएट कर पाएंगे.
इसलिए, आपको सभी ऐप्लिकेशन में से अपने पसंदीदा ऐप्लिकेशन को खोजने की ज़रूरत नहीं है.
वे अपने सिस्टम डायलर से कॉल बैक इंस्टैंशिएट कर सकते हैं जिसका वे सभी उपयोग करते हैं.
हालांकि, हम आपको ज़्यादा कंट्रोल भी दे रहे हैं.
अगर आपको किसी कॉल को सिस्टम में लॉग नहीं करना है, तो आपको CallAttributesCompat ऑब्जेक्ट में isLogExcluded फ़्लैग को 'सही' के तौर पर सेट करना होगा.
मैंने जिस मेटा डेटा ऑब्जेक्ट के बारे में पहले बताया था, उसे 'सही' के तौर पर सेट करें. इसके बाद, आपका कॉल सिस्टम में लॉग नहीं किया जाएगा और यह सिस्टम डायलर में नहीं दिखेगा.
1.1.0 के साथ आने वाली दूसरी शानदार सुविधा, 5G नेटवर्क स्लाइसिंग है.
इसलिए, जिन मोबाइल और इंटरनेट सेवा देने वाली कंपनियों के नेटवर्क पर यह सुविधा काम करती है वे आपको प्रीमियम नेटवर्क स्लाइस उपलब्ध कराती हैं. इसका मतलब है कि किसी खास इस्तेमाल के लिए, मोबाइल और इंटरनेट सेवा देने वाली कंपनी आपको ऐसा नेटवर्क स्लाइस देगी जिसमें इंतज़ार का समय कम होगा और कोई अन्य रुकावट नहीं होगी. इससे आपको बेहतर क्वालिटी और बेहतर अनुभव मिलेगा.
इसलिए, मोबाइल और इंटरनेट सेवा देने वाली जिन कंपनियों के नेटवर्क पर यह सुविधा काम करती है उन पर आपको यह सुविधा पहले से ही मिलेगी. इसके लिए, आपको कुछ भी करने की ज़रूरत नहीं है. यहां तक कि कोड की एक लाइन भी नहीं लिखनी होगी.
लाइब्रेरी को इंटिग्रेट करने के बाद, आपके कॉल उन नेटवर्क स्लाइस का फ़ायदा ले पाएंगे. साथ ही, आपको बेहतर इंतज़ार का समय और बेहतर परफ़ॉर्मेंस मिलेगी.
हालांकि, अगर आपको किसी वजह से यह सुविधा नहीं चाहिए, तो CAPABILITY_OPT_OUT_OF_PREMIUM_NETWORK फ़्लैग का इस्तेमाल करके इससे ऑप्ट आउट किया जा सकता है.
Jetpack Telecom को Google Meet, WhatsApp, KakaoTalk, और Zoho Arattai जैसे दुनिया के टॉप कम्यूनिकेशन ऐप्लिकेशन पहले ही लागू कर चुके हैं.
इसलिए, अब यह आप पर निर्भर करता है कि आप इस लाइब्रेरी को अपने ऐप्लिकेशन में इंटिग्रेट करें और उपयोगकर्ता को बेहतर अनुभव दें.
अब जब रीयल-टाइम कॉलिंग की सुविधा के बारे में जानकारी दे दी गई है, तो मैं अपने शानदार कलीग यासीन को माइक सौंपना चाहूँगा, ताकि वे शेयर करने के लिए टैप करें सुविधा के बारे में बता सकें.
धन्यवाद.
ठीक है दोस्तों, मुझे पता है कि आप थोड़ा थक गए हैं. इसलिए, चिंता न करें, यह आखिरी सेक्शन है.
इसलिए, मैं पीयर-टू-पीयर फ़ाइल शेयरिंग के बारे में बात करने जा रहा हूं. हालांकि, पीयर-टू-पीयर शेयरिंग का इस्तेमाल अन्य कामों के लिए भी किया जा सकता है.
हमने मोबाइल नेटवर्क पर देखा है कि सोशल मीडिया और मैसेजिंग ऐप्लिकेशन पर हर दिन 14 अरब से ज़्यादा फ़ोटो और वीडियो शेयर किए जाते हैं. यह एक बहुत बड़ी संख्या है.
इनमें से ज़्यादातर फ़ाइलें क्लाउड के ज़रिए शेयर की जाती हैं. इसलिए, फ़ोटो लेने के बाद उसे अपनी पसंदीदा सेवा के ज़रिए अपलोड किया जाता है. इसके बाद, दूसरे व्यक्ति को उसे उसी तरह डाउनलोड करना पड़ता है.
ऐसा ही तब होता है, जब किसी दोस्त को सोशल नेटवर्क पर न्योता भेजना हो या किसी प्लेलिस्ट या दस्तावेज़ पर साथ मिलकर काम करने के लिए न्योता भेजना हो. इसके लिए, आपको आम तौर पर उनका उपयोगकर्ता नाम या ईमेल पता टाइप करना पड़ता है. इसमें कीबोर्ड पर थोड़ा समय लगता है.
ऐसा हो सकता है कि आपसे कोई गलती हो जाए और यह वाकई एक अच्छा अनुभव नहीं है. खास तौर पर तब, जब आप दोनों एक-दूसरे के बगल में बैठे हों. ऐसे में, आपको लगता है कि अरे, मुझे क्लाउड के ज़रिए भेजना है, मुझे इंतज़ार करना होगा.
यह बहुत अच्छा नहीं है.
आज-कल हम सभी के पास शानदार फ़ोन, डिवाइस, टैबलेट, और फ़ोल्ड किए जा सकने वाले डिवाइस हैं. इनसे हम बेहतरीन फ़ोटो ले सकते हैं.
हालांकि, जब इन्हें कुछ सोशल मीडिया या मैसेजिंग ऐप्लिकेशन पर शेयर किया जाता है, तो परफ़ॉर्मेंस और स्टोरेज की समस्याओं की वजह से, इन्हें कंप्रेस कर दिया जाता है. इस वजह से, आपकी शानदार स्क्रीन पर ये पिक्सलेट हो जाते हैं या इनकी क्वालिटी अच्छी नहीं होती.
यह आपके प्रीमियम डिवाइस पर मिलने वाला सबसे अच्छा अनुभव नहीं है.
दूसरी बात, फ़ाइलें अब काफ़ी बड़ी हो गई हैं.
एक फ़ोटो का साइज़ आसानी से 10 एमबी हो सकता है. वहीं, पांच मिनट के वीडियो का साइज़ 500 एमबी तक हो सकता है. इसलिए, इन्हें अपलोड और डाउनलोड करने में काफ़ी समय लगता है.
आखिर में, दूसरी तरफ़ आपको इंतज़ार करना पड़ता है.
इसलिए, कभी-कभी ऐसा हो सकता है कि आप किसी बस में सफ़र कर रहे हों और उसमें भीड़ हो. बस के चलने के दौरान, आपको सबसे अच्छी लेटेंसी और नेटवर्क कवरेज न मिल रहा हो. साथ ही, कभी-कभी फ़ाइल ट्रांसफ़र करने की प्रोसेस रुक जाती हो. कभी-कभी बहुत ज़्यादा लेटेंसी की वजह से, टाइम आउट हो सकता है और फ़ाइल ट्रांसफ़र करने की प्रोसेस रद्द हो सकती है. यह उपयोगकर्ता के लिए वाकई निराशाजनक होता है.
इसलिए, उन सभी फ़ाइलों को शेयर करने के लिए क्लाउड पर निर्भर रहने और उन सभी के लिए इंतज़ार करने के बजाय, ब्लूटूथ या वाई-फ़ाई जैसे लोकल नेटवर्क का इस्तेमाल क्यों न करें?
हालांकि, अगर आपको खुद ऐसा करना है, तो आपको ब्लूटूथ मैनेजर और वाई-फ़ाई मैनेजर का इस्तेमाल करना होगा. साथ ही, आपको अपना प्रोटोकॉल लिखना होगा. मेरा मतलब है कि हर कोई ऐसा करने में समय नहीं लगाना चाहता.
हालांकि, Android पर पहले से ही कुछ मौजूद है.
यह सुविधा पहले से ही उपलब्ध है और आपने इसके बारे में सुना भी होगा. इसका नाम है, क्विक शेयर.
Android पर क्विक शेयर की सुविधा, सिस्टम में पहले से ही मौजूद होती है. इससे आपको फ़ाइलें शेयर करने के लिए, किसी अन्य ऐप्लिकेशन को मैनेज करने की ज़रूरत नहीं पड़ती.
यह सुविधा, शेयर शीट में पहले से उपलब्ध है. यह दोनों डिवाइसों के बीच, आपके डिवाइस के लिए सबसे सही प्रोटोकॉल पर स्विच करती है. यह सुविधा, Marshmallow और इसके बाद के वर्शन वाले डिवाइसों पर उपलब्ध है. आजकल, इस वर्शन वाले डिवाइसों का इस्तेमाल करने वाले लोगों की संख्या काफ़ी ज़्यादा है, है न?
आखिर में, साइड में दिखने वाला जाना-पहचाना यूज़र इंटरफ़ेस (यूआई) और यूज़र एक्सपीरियंस (यूएक्स), आपके उपयोगकर्ताओं की मदद करता है.
इसलिए, उन्हें पता है कि यूज़र इंटरफ़ेस (यूआई) क्या है. उन्हें इसे इस्तेमाल करने का तरीका सीखने की ज़रूरत नहीं है, क्योंकि उन्होंने इसे पहले ही देखा हुआ है.
हालांकि, हमें पता है कि डेवलपर भी अपने हिसाब से अनुभव देना चाहते हैं.
आपको अपने ऐप्लिकेशन के बारे में पता है. शायद आपको अपने उपयोगकर्ताओं के बारे में हमसे बेहतर पता है.
इसलिए, क्यों न क्विक शेयर की सुविधा को सीधे अपने ऐप्लिकेशन में शामिल किया जाए?
इसलिए, हमने डेवलपर से बात की और हमें पता चला कि क्विक शेयर की सुविधा का इस्तेमाल पहले से ही काफ़ी ज़्यादा किया जा रहा है.
यह Android, Chromebook, और Windows पर उपलब्ध है. हाल ही में, इसे Google Books पर भी उपलब्ध कराया गया है. यह 3 अरब से ज़्यादा डिवाइसों पर उपलब्ध है. यह बहुत बड़ी संख्या है.
हमने Pixel 11 में, टैप करके शेयर करने की सुविधा भी जोड़ी है.
इसलिए, आपको जिस डिवाइस के साथ कॉन्टेंट शेयर करना है उसे चुनने के बजाय, बस टैप करें. एनएफ़सी की मदद से, हम आपके लिए सीधे तौर पर उस डिवाइस को खोजने की सुविधा उपलब्ध करा रहे हैं.
इसलिए, आपके पास फ़ोटो के साथ-साथ फ़ाइल चुनने का भी विकल्प होता है. आपको बस दो डिवाइसों पर टैप करना होगा और वे सीधे बंप के साथ शेयर हो जाएंगे.
हम जानते हैं कि कुछ डेवलपर, अपने हिसाब से अनुभव देना चाहते हैं.
हमें पता है कि यह आपके उपयोगकर्ताओं के लिए, किसी खास सुविधा का इस्तेमाल करने का सबसे अच्छा तरीका है. इस मामले में, फ़ाइल शेयर करने की सुविधा.
इसलिए, अपने ऐप्लिकेशन में क्विक शेयर की सुविधा को एम्बेड क्यों न करें?
इसलिए, अगले साल हम आपके लिए क्विक शेयर एसडीके लेकर आ रहे हैं.
इसे सीधे अपने ऐप्लिकेशन में इस्तेमाल किया जा सकेगा. साथ ही, इसमें सुरक्षा की सुविधा पहले से मौजूद होती है. इसमें दोनों डिवाइसों के बीच पूरी तरह सुरक्षित एन्क्रिप्शन की सुविधा होती है.
फ़ाइलें उन लोकल नेटवर्क के बीच ट्रांसफ़र होती हैं. इसलिए, आपको फ़ुल स्पीड मिलेगी. ज़ाहिर है कि आपके घर के वाई-फ़ाई में भी ऐसा होगा. हालांकि, आप दोनों के बीच हॉटस्पॉट अपने-आप बन सकता है. आपको इसके लिए कुछ नहीं करना होगा.
Wi-Fi Direct की सुविधा वाले डिवाइसों में यह पहले से मौजूद होता है.
साथ ही, आपने अपने शानदार कैमरे से जो फ़ाइलें ली हैं वे अपने सबसे अच्छे रिज़ॉल्यूशन और बारीकियों को बनाए रखेंगी. इससे, उन्हें अपनी बड़ी स्क्रीन पर अच्छी तरह से देखा जा सकता है.
यह लोकल नेटवर्क पर काम करता है. इसलिए, इसे ट्यूब में भी इस्तेमाल किया जा सकता है. यहां तक कि ट्यूब के सबसे गहरे हिस्से में भी, आपके पास अपने दोस्त के साथ शेयर करने के लिए नेटवर्क होगा.
प्लेन में भी, आप हज़ारों फ़ीट ऊपर आसमान में होंगे और फिर भी उन फ़ाइलों को शेयर कर पाएंगे.
आखिर में, एक डेवलपर के तौर पर, डेटा के मामले में यह आपके लिए काफ़ी किफ़ायती है. इसकी वजह यह है कि आपके उपयोगकर्ताओं को उस डेटा प्लान का इस्तेमाल नहीं करना पड़ता. यह तब बहुत फ़ायदेमंद होता है, जब वे पर्यटक के तौर पर यात्रा कर रहे हों.
साथ ही, आपको अपने सर्वर पर इसे मैनेज करने की ज़रूरत नहीं है.
पिछले साल हमने डेवलपर और उपयोगकर्ताओं को बताया था कि क्विक शेयर की मदद से, AirDrop के ज़रिए iPhone डिवाइसों के साथ फ़ाइलें शेयर की जा सकेंगी.
क्विक शेयर की मदद से, हम डेवलपर के लिए भी यही सुविधा लेकर आ रहे हैं.
हम iOS ऐप्लिकेशन वाले डेवलपर के लिए, Quick Share iOS SDK उपलब्ध कराने जा रहे हैं. इससे वे दोनों प्लैटफ़ॉर्म के बीच फ़ाइलें शेयर कर पाएंगे. इसके लिए, डिवाइस की कोई पाबंदी नहीं होगी.
तो यह सब एक शानदार प्रज़ेंटेशन है. अब आइए, कोड पर एक नज़र डालते हैं.
हमने इसे जितना हो सके उतना आसान बनाने की कोशिश की है.
ज़ाहिर है कि आपको QuickShareClient शुरू करना होगा. इसके बाद, आपको वे फ़ाइलें अटैच करनी होंगी जिन्हें आपको शेयर करना है. सेशन शुरू होने के बाद, आपको साइड में यह शानदार मोडल विंडो दिखेगी. यह बॉटम शीट है, जहां उपयोगकर्ताओं को भेजी जा रही फ़ाइलों की झलक दिखेगी. अगर आपको लगता है कि कॉन्टेंट संवेदनशील है, तो स्क्रीन पर दिख रहे विकल्प की मदद से, उसे भी चालू किया जा सकता है.
// Final API may undergo further updates
val quickShareClient = QuickShareClient.create(activity)
val attachment = FileAttachment(
fileName = "report.pdf",
size = 1_048_576L,
uri = fileUri,
mimeType = "application/pdf",
// Sensitive content will be masked in preview
isSensitiveContent = false,
)
val content = ShareableContent.withFiles(listOf(attachment))
val request = SharingRequest.withContent(content)
val session = quickShareClient.startSharingSession(request, lifecycleOwner)जब आपको अपने ऐप्लिकेशन में कोई फ़ाइल फिर से पानी हो, तो आपको वही चीज़ करनी होगी. हालांकि, इस मामले में आपको कोई अटैचमेंट नहीं जोड़ना होगा. इसके बाद, सेशन शुरू होते ही आपको इनमें से किसी भी चीज़ से नहीं निपटना होगा.
// Final API may undergo further updates
val quickShareClient = QuickShareClient.create(activity)
val request = SharingRequest.withoutContent()
val session = quickShareClient.startSharingSession(request, lifecycleOwner)
// Open the Quick Share overlay in receive mode
session.launchWindow(activity, contentSelectionIntent = null)अब तक, आपने दोनों तरफ़ सिर्फ़ 20 लाइन का कोड देखा है.
हमें पता है कि क्विक शेयर और टैप करके शेयर करने की सुविधा से, डिवाइसों को सिर्फ़ टच करके फ़ाइलें शेयर की जा सकती हैं. इससे, एक नया इस्तेमाल का उदाहरण भी मिलता है.
ऐसा हो सकता है कि आपका ऐप्लिकेशन दूसरे डिवाइस पर बंद हो. फ़ाइल ट्रांसफ़र होने के बाद, टैप करने पर आपका ऐप्लिकेशन अपने-आप खुल जाएगा. साथ ही, आपको यूआरआई मिलेगा, ताकि आप डिवाइस पर कुछ प्रोसेस कर सकें. उदाहरण के लिए, सीधे अपने ऐप्लिकेशन में उपयोगकर्ता को कुछ दिखा सकें.
// Final API may undergo further updates
val quickShareClient = QuickShareClient.create(activity)
val urlAttachment = TextAttachment(
text = groupAddUrl,
type = TextAttachment.Type.URL,
)
val content = ShareableContent.withText(urlAttachment)
val appLink = AppLink("https://myapp.com/group/invite")
val request = SharingRequest.withContent(content, appLink)
val session = quickShareClient.startSharingSession(request, lifecycleOwner)इसलिए, आपको फ़ाइल पाने वाले डिवाइस पर ऐप्लिकेशन खोलने की ज़रूरत नहीं है.
'टैप करके शेयर करें' सुविधा की मदद से, वह अपने-आप खुल जाएगा.
अगर आपको फ़ाइल ट्रांसफ़र के दौरान यूज़र इंटरफ़ेस (यूआई) में बदलाव करना है, तो Kotlin Flow का इस्तेमाल करें. इससे आपको सभी इवेंट की जानकारी मिलेगी, ताकि आप उन्हें प्रोसेस कर सकें.
// Final API may undergo further updates
scope.launch {
for (event in session.sharingEvents) {
when (event) {
is SharingEvent.SendComplete ->
println("Send finished")
is SharingEvent.ReceiveComplete ->
println("Received, files=${event.content?.files?.size}")
else -> println("other event")
}
}
}हमने आज बहुत कुछ देखा, इसलिए अब मैं इस वीडियो को खत्म कर रहा हूं.
चिंता न करें, आपको ब्रेक लेने के लिए कुछ मिनट मिलेंगे.
CompanionDeviceManager, ब्लूटूथ से जुड़े किसी भी इंटरैक्शन और लगातार होने वाले ब्लूटूथ इंटरैक्शन को मैनेज करने के लिए सबसे अच्छा एपीआई है. इसके बारे में हानरुई ने पहले ही बताया है.
अगर आपके ऐप्लिकेशन में वॉइस ओवर आईपी कॉल की सुविधा है, तो ज़रूरी नहीं है कि यह उसका मुख्य इस्तेमाल हो. उदाहरण के लिए, आपके ऐप्लिकेशन में सहायता क्लाइंट का हिस्सा हो सकता है, जहां उपयोगकर्ता सहायता टीम को कॉल कर सकता है.
इस मामले में भी, Android पर वॉइस ओवर आईपी कॉल को मैनेज करने का सबसे अच्छा तरीका, Jetpack Telecom है.
आखिर में, पीयर-टू-पीयर फ़ाइल शेयर करने या ऐप्लिकेशन खोलने के लिए, जैसा कि मैंने बताया, शेयर करने के लिए टैप करें सुविधा के साथ, क्विक शेयर इसका समाधान है.
इसलिए, सभी को धन्यवाद. जाने से पहले, एक छोटी सी बात. हम आपके सवालों के जवाब देने के लिए बाहर मौजूद रहेंगे.
अगर आपका कोई सवाल है, तो हमसे ऑफ़िस में कामकाज के घंटों के दौरान भी संपर्क किया जा सकता है.
साथ ही, अपनी बातचीत या अन्य सेशन से मिली कोई भी जानकारी, सोशल मीडिया पर शेयर करना न भूलें.
हमारे पास #AndroidDevSummit है.
हमारे लिए यह जानना बहुत ज़रूरी है कि इवेंट में लोगों की दिलचस्पी बनी रहे और वे इसका आनंद लें.
इससे हमें यह जानने में मदद मिलती है कि हमारे पास एक ऐसी कम्यूनिटी है जिसे हम फिर से देखना चाहते हैं.
साथ ही, सोशल चार्म इकट्ठा करें. इसे इन्फ़ोडेस्क से Android बॉट कीरिंग में जोड़ा जा सकता है.
क्या मैंने इसे सही तरीके से किया?
धन्यवाद.
<uses-permission android:name="android.permission.BLUETOOTH_SCAN"
android:usesPermissionFlags="neverForLocation" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_CONNECTED_DEVICE" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />class BleForegroundService : Service() {
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
…
return START_STICKY
}
}<uses-permission android:name="android.permission.REQUEST_COMPANION_PROFILE_MEDICAL" />
<uses-permission android:name="android.permission.REQUEST_COMPANION_RUN_IN_BACKGROUND" />
<uses-permission android:name="android.permission.REQUEST_OBSERVE_COMPANION_DEVICE_PRESENCE" />val paringRequest = AssociationRequest.Builder()
.addDeviceFilter(deviceFilter)
.setSingleDevice(true)
.setDeviceProfile(AssociationRequest.DEVICE_PROFILE_MEDICAL)
.build()
companionDeviceManager.associate(paringRequest, ContextCompat.getMainExecutor(this),
object : CompanionDeviceManager.Callback() {
override fun onAssociationPending(intentSender: IntentSender) {
intentSenderLauncher.launch(IntentSenderRequest.Builder(intentSender).build())
}
override fun onAssociationCreated(associationInfo: AssociationInfo) { … }
override fun onFailure(error: CharSequence?) { … }
}
)class BleCompanionDeviceService : CompanionDeviceService() {
override fun onDevicePresenceEvent(event: DevicePresenceEvent) {
when (event.event) {
DevicePresenceEvent.EVENT_BLE_APPEARED -> onDeviceAppeared(event.associationId)
DevicePresenceEvent.EVENT_BLE_DISAPPEARED -> onDeviceDisappeared(event.associationId)
}
}
private fun onDeviceAppeared(associationId: Int) { … }
private fun onDeviceDisappeared(associationId: Int) { … }
}<uses-permission android:name="android.permission.MANAGE_OWN_CALLS" />// Initialize CallsManager & register supported capabilities once
val callsManager = CallsManager(context)
callsManager.registerAppWithTelecom(
capabilities = CallsManager.CAPABILITY_SUPPORTS_VIDEO_CALLING or
CallsManager.CAPABILITY_SUPPORTS_CALL_STREAMING
)val attributes = CallAttributesCompat(
displayName = "Kukk Nat",
address = Uri.parse("tel:+16505550199"),
direction = CallAttributesCompat.DIRECTION_INCOMING,
callType = CallAttributesCompat.CALL_TYPE_AUDIO_CALL
)
callsManager.addCall(
attributes, onAnswer, onDisconnect, onSetActive, onSetInactive
) {
// Coroutine CallControlScope active for the duration of the call
}callsManager.addCall(attributes, onAnswer, onDisconnect, onSetActive, onSetInactive) {
// 1. React to hardware mute toggles from Watch, Car, or Headset
launch {
isMuted.collect { muted -> audioEngine.setMicMuted(muted) }
}
// 2. Observe available endpoints & request declarative switches
launch {
currentCallEndpoint.collect { endpoint -> updateUi(endpoint) }
}
requestEndpointChange(preferredBluetoothEndpoint)
}// Final API may undergo further updates
val quickShareClient = QuickShareClient.create(activity)
val attachment = FileAttachment(
fileName = "report.pdf",
size = 1_048_576L,
uri = fileUri,
mimeType = "application/pdf",
// Sensitive content will be masked in preview
isSensitiveContent = false,
)
val content = ShareableContent.withFiles(listOf(attachment))
val request = SharingRequest.withContent(content)
val session = quickShareClient.startSharingSession(request, lifecycleOwner)// Final API may undergo further updates
val quickShareClient = QuickShareClient.create(activity)
val request = SharingRequest.withoutContent()
val session = quickShareClient.startSharingSession(request, lifecycleOwner)
// Open the Quick Share overlay in receive mode
session.launchWindow(activity, contentSelectionIntent = null)// Final API may undergo further updates
val quickShareClient = QuickShareClient.create(activity)
val urlAttachment = TextAttachment(
text = groupAddUrl,
type = TextAttachment.Type.URL,
)
val content = ShareableContent.withText(urlAttachment)
val appLink = AppLink("https://myapp.com/group/invite")
val request = SharingRequest.withContent(content, appLink)
val session = quickShareClient.startSharingSession(request, lifecycleOwner)// Final API may undergo further updates
scope.launch {
for (event in session.sharingEvents) {
when (event) {
is SharingEvent.SendComplete ->
println("Send finished")
is SharingEvent.ReceiveComplete ->
println("Received, files=${event.content?.files?.size}")
else -> println("other event")
}
}
}