डिफ़ॉल्ट फ़ोन ऐप्लिकेशन की मदद से, Android Telecom फ़्रेमवर्क आपके ऐप्लिकेशन को कॉल करने की स्थिति के बारे में बताता है. ऐसा करने के लिए, भूमिका मैनेजर और कॉल के दौरान उपलब्ध सेवा का इस्तेमाल करके, किसी Android डिवाइस पर डिफ़ॉल्ट फ़ोन ऐप्लिकेशन की जगह नया ऐप्लिकेशन बनाया जाता है. इसके बाद, InCallService API लागू किया जाता है. आपकी लागू की गई सेटिंग को नीचे दी गई ज़रूरी शर्तों को पूरा करना होगा:
इसमें कॉल करने की सुविधा नहीं होनी चाहिए और इसमें सिर्फ़ कॉल करने के लिए यूज़र इंटरफ़ेस होना चाहिए. उसे उन सभी कॉल को हैंडल करना चाहिए जिनके बारे में टेलीकॉम फ़्रेमवर्क को पता है. साथ ही, उसे कॉल के टाइप के बारे में कोई अनुमान नहीं लगाना चाहिए. उदाहरण के लिए, उसे यह नहीं मानना चाहिए कि कॉल, सिम आधारित टेलीफ़ोनी कॉल हैं. साथ ही, उसे न तो किसी एक ConnectionService के तहत कॉल करने से जुड़ी पाबंदियां लागू करनी चाहिए. जैसे, वीडियो कॉल के लिए टेलीफ़ोनी से जुड़ी पाबंदियां लागू करना.
कॉलिंग ऐप्लिकेशन की सहायता से उपयोगकर्ता अपने डिवाइस पर ऑडियो या वीडियो कॉल कर सकते हैं डिवाइस. कॉलिंग की सुविधा देने वाले ऐप्लिकेशन, कॉल करने के लिए अपने यूज़र इंटरफ़ेस का इस्तेमाल करते हैं फ़ोन ऐप्लिकेशन का डिफ़ॉल्ट इंटरफ़ेस, जैसा कि इस स्क्रीनशॉट में दिखाया गया है.
Android फ़्रेमवर्क में android.telecom
पैकेज शामिल है, जो
इसमें ऐसी क्लास शामिल हैं जो टेलिकॉम के हिसाब से, कॉल करने की सुविधा देने वाला ऐप्लिकेशन बनाने में आपकी मदद करती हैं
फ़्रेमवर्क शामिल है. टेलिकॉम फ़्रेमवर्क के मुताबिक अपने ऐप्लिकेशन को बनाने पर, आपको
मिलने वाले फ़ायदे:
- आपका ऐप्लिकेशन डिवाइस.
- आपका ऐप्लिकेशन, कॉल करने की सुविधा देने वाले ऐसे अन्य ऐप्लिकेशन के साथ इंटरैक्ट करता है जो मदद ली जा सकती है.
- फ़्रेमवर्क आपके ऐप्लिकेशन को ऑडियो और वीडियो रूटिंग मैनेज करने में मदद करता है.
- फ़्रेमवर्क आपके ऐप्लिकेशन को यह तय करने में मदद करता है कि उसके कॉल पर फ़ोकस है या नहीं.
मेनिफ़ेस्ट किए गए एलान और अनुमतियां
अपने ऐप्लिकेशन मेनिफ़ेस्ट में यह एलान करें कि आपका ऐप्लिकेशन
MANAGE_OWN_CALLS
अनुमति, जैसा कि नीचे दिए गए उदाहरण में दिखाया गया है:
<manifest … >
<uses-permission android:name="android.permission.MANAGE_OWN_CALLS"/>
</manifest>
ऐप्लिकेशन अनुमतियों का एलान करने के बारे में ज़्यादा जानकारी के लिए देखें अनुमतियां.
आपको एक ऐसी सेवा की जानकारी देनी होगी जो
आपके ऐप्लिकेशन में ConnectionService
क्लास. टेलिकॉम
सबसिस्टम के लिए ज़रूरी है कि सेवा, BIND_TELECOM_CONNECTION_SERVICE
अनुमति का एलान करे, ताकि
उससे जुड़ने में मदद मिलती है. नीचे दिए गए उदाहरण में, सेवा का एलान करने का तरीका बताया गया है
आपका ऐप्लिकेशन मेनिफ़ेस्ट:
<service android:name="com.example.MyConnectionService"
android:permission="android.permission.BIND_TELECOM_CONNECTION_SERVICE">
<intent-filter>
<action android:name="android.telecom.ConnectionService" />
</intent-filter>
</service>
सेवाओं के साथ-साथ, ऐप्लिकेशन के कॉम्पोनेंट के बारे में ज़्यादा जानकारी के लिए, यहां देखें ऐप्लिकेशन के कॉम्पोनेंट.
कनेक्शन सेवा लागू करना
कॉलिंग की सुविधा देने वाले आपके ऐप्लिकेशन को, ConnectionService
क्लास का ऐसा तरीका उपलब्ध कराना होगा जिससे टेलीकॉम सबसिस्टम बाइंड कर सके.
आपका ConnectionService
लागू होना चाहिए
नीचे दिए गए तरीके अपनाएं:
onCreateOutgoingConnection(PhoneAccountHandle, ConnectionRequest)
टेलीकॉम सबसिस्टम इस तरीके को आपका ऐप्लिकेशन,
placeCall(Uri, Bundle)
को कॉल कर रहा है नया आउटगोइंग कॉल करने के लिए. आपका ऐप्लिकेशन,Connection
क्लास लागू करने का नया इंस्टेंस लौटाता है (ज़्यादा जानकारी के लिए, देखें कनेक्शन लागू करें) आउटगोइंग कॉल. कनेक्शन को अपनी पसंद के मुताबिक बनाने के लिए, ये कार्रवाइयां की जा सकती हैं:- आपके ऐप्लिकेशन को
setConnectionProperties(int)
तरीके को तर्क के तौर परPROPERTY_SELF_MANAGED
कॉन्सटेंट के साथ कॉल करना चाहिए यह बताने के लिए कि कनेक्शन किसी कॉलिंग ऐप्लिकेशन से शुरू हुआ है. - अगर आपके ऐप्लिकेशन में कॉल को होल्ड पर रखने की सुविधा उपलब्ध है, तो
setConnectionCapabilities(int)
तरीके को कॉल करें औरCAPABILITY_HOLD
औरCAPABILITY_SUPPORT_HOLD
कॉन्सटेंट के बिट मास्क मान का तर्क. - कॉल करने वाले (कॉलर) का नाम सेट करने के लिए,
setCallerDisplayName(String, int)
तरीका इस्तेमाल करेंPRESENTATION_ALLOWED
से गुज़र रहा हैint
पैरामीटर के रूप में स्थिर है, जो बताता है कि कॉलर का नाम दिखाए जा सकते हैं. - यह सुनिश्चित करने के लिए कि आउटगोइंग कॉल में वीडियो की स्थिति सही है,
Connection
ऑब्जेक्ट काsetVideoState(int)
तरीका और इसके ज़रिए लौटाए गए मान को भेजेंgetVideoState()
तरीकाConnectionRequest
ऑब्जेक्ट.
- आपके ऐप्लिकेशन को
onCreateOutgoingConnectionFailed(PhoneAccountHandle, ConnectionRequest)
टेलीकॉम सबसिस्टम इस तरीके को तब कॉल करता है, जब आपका ऐप्लिकेशन
placeCall(Uri, Bundle)
तरीके को कॉल करता है और आउटगोइंग कॉल नहीं किया जा सकता उन्हें शामिल किया जाएगा. ऐसी स्थिति में, आपके ऐप्लिकेशन को उपयोगकर्ता को जानकारी देनी चाहिए (इसके लिए उदाहरण के लिए, किसी अलर्ट बॉक्स या टोस्ट का इस्तेमाल करके) कि आउटगोइंग कॉल नहीं किया जा सकता रखा गया है. अगर कोई कॉल जारी रहता है, तो हो सकता है कि आपका ऐप्लिकेशन कॉल न कर पाए आपातकालीन कॉल है या अगर किसी अन्य ऐप्लिकेशन में कोई कॉल चल रहा है, तो कॉल करने से पहले उसे होल्ड पर रख सकता है.onCreateIncomingConnection(PhoneAccountHandle, ConnectionRequest)
टेलिकॉम सबसिस्टम इस तरीके को तब कॉल करता है, जब आपका ऐप्लिकेशन
addNewIncomingCall(PhoneAccountHandle, Bundle)
तरीके को कॉल करता है का इस्तेमाल करें. आपका ऐप्लिकेशन आपकेConnection
को लागू करने का नया इंस्टेंस ( ज़्यादा जानकारी के लिए, कनेक्शन लागू करना देखें) का इस्तेमाल करें. आपके पास, कनेक्शन बनाने के लिए ये कार्रवाइयां करें:- आपके ऐप्लिकेशन को
setConnectionProperties(int)
तरीके को तर्क के तौर परPROPERTY_SELF_MANAGED
कॉन्सटेंट के साथ कॉल करना चाहिए यह बताने के लिए कि कनेक्शन किसी कॉलिंग ऐप्लिकेशन से शुरू हुआ है. - अगर आपके ऐप्लिकेशन में कॉल को होल्ड पर रखने की सुविधा उपलब्ध है, तो
setConnectionCapabilities(int)
तरीके को कॉल करें औरCAPABILITY_HOLD
औरCAPABILITY_SUPPORT_HOLD
कॉन्सटेंट के बिट मास्क मान का तर्क. - कॉल करने वाले (कॉलर) का नाम सेट करने के लिए,
setCallerDisplayName(String, int)
तरीका इस्तेमाल करेंPRESENTATION_ALLOWED
से गुज़र रहा हैint
पैरामीटर के रूप में स्थिर है, जो बताता है कि कॉलर का नाम दिखाए जा सकते हैं. - इनकमिंग कॉल का फ़ोन नंबर या पता दर्ज करने के लिए,
Connection
ऑब्जेक्ट में सेsetAddress(Uri, int)
तरीका. - यह सुनिश्चित करने के लिए कि आउटगोइंग कॉल में वीडियो की स्थिति सही है,
Connection
ऑब्जेक्ट काsetVideoState(int)
तरीका और इसके ज़रिए लौटाए गए मान को भेजेंgetVideoState()
तरीकाConnectionRequest
ऑब्जेक्ट.
- आपके ऐप्लिकेशन को
onCreateIncomingConnectionFailed(PhoneAccountHandle, ConnectionRequest)
टेलीकॉम सबसिस्टम इस तरीके को तब कॉल करता है, जब आपका ऐप्लिकेशन टेलीकॉम को सूचित करने के लिए
addNewIncomingCall(PhoneAccountHandle, Bundle)
तरीके को कॉल करता है नया इनकमिंग कॉल, लेकिन इनकमिंग कॉल की अनुमति नहीं है (अधिक जानकारी के लिए, कॉल करने से जुड़ी शर्तें देखें). आपके ऐप्लिकेशन को चाहिए आने वाले कॉल को बिना किसी सूचना के अस्वीकार करें. इसके अलावा, सूचना देने के लिए सूचना पोस्ट करें मिस्ड कॉल के उपयोगकर्ता का है.
कनेक्शन लागू करना
आपके ऐप्लिकेशन को Connection
की एक सब-क्लास बनानी चाहिए, ताकि
अपने ऐप्लिकेशन में कॉल का प्रतिनिधित्व करते हैं. आपको
लागू करने की प्रक्रिया:
onShowIncomingCallUi()
टेलिकॉम सबसिस्टम इस तरीके को तब कॉल करता है, जब कोई नया इनकमिंग कॉल जोड़ा जाता है और आपके ऐप्लिकेशन को इनकमिंग कॉल का यूज़र इंटरफ़ेस (यूआई) दिखाना चाहिए.
onCallAudioStateChanged(CallAudioState)
टेलिकॉम सबसिस्टम इस तरीके को कॉल करके, आपके ऐप्लिकेशन को यह बताता है कि मौजूदा ऑडियो रूट या मोड बदल गया है. यह तब कहा जाता है, जब आपका ऐप्लिकेशन
setAudioRoute(int)
का इस्तेमाल करने वाला ऑडियो मोड तरीका. अगर सिस्टम, ऑडियो रूट को बदलता है, तब भी इस तरीके को कॉल किया जा सकता है (उदाहरण के लिए, ब्लूटूथ हेडसेट डिसकनेक्ट होने पर).onHold()
टेलीकॉम सबसिस्टम इस तरीके को तब कॉल करता है, जब वह कॉल को होल्ड पर रखना चाहता है. इस अनुरोध के प्रतिसाद में, आपके एप्लिकेशन को कॉल को होल्ड पर रखना चाहिए और फिर सिस्टम को सूचना देने का
setOnHold()
तरीका कि कॉल होल्ड पर है. टेलीकॉम सबसिस्टम इस तरीके को तब कॉल कर सकता है, जब कोई इन-कॉल सेवा, जैसे कि Android Auto, जो यह दिखाती है कि आपको कॉल के दौरान कॉल को होल्ड पर रखने के लिए किसी उपयोगकर्ता के अनुरोध को आगे भेजना. टेलिकॉम सबसिस्टम, इस तरीके का इस्तेमाल तब ही किया जा सकता है, जब उपयोगकर्ता किसी दूसरे ऐप्लिकेशन में कॉल करता है. ज़्यादा के लिए कॉल के दौरान उपलब्ध सेवाओं के बारे में जानकारी,InCallService
देखें.onUnhold()
टेलीकॉम सबसिस्टम इस तरीके को तब कॉल करता है, जब वह होल्ड पर रखे गए कॉल को फिर से शुरू करना चाहता है. ऐप्लिकेशन को फिर से चालू करने के बाद कॉल है, तो उसे
setActive()
शुरू करना चाहिए का उपयोग करके सिस्टम को सूचित किया जाएगा कि कॉल अब होल्ड पर नहीं है. टेलिकॉम सबसिस्टम इस तरीके को तब कॉल कर सकता है, जब कॉल के दौरान सेवा, जैसे कि Android Auto जो आपका कॉल दिखा रहा है वह कॉल को फिर से शुरू करने के लिए एक अनुरोध को रिले करना चाहता है. इसके लिए कॉल के दौरान उपलब्ध सेवाओं के बारे में ज़्यादा जानकारी पाने के लिए,InCallService
पर जाएं.onAnswer()
टेलीकॉम सबसिस्टम, सूचना देने के इस तरीके का इस्तेमाल करता है कॉल का जवाब दिया जाना चाहिए. ऐप्लिकेशन पर जवाब देने के बाद कॉल है, तो उसे
setActive()
शुरू करना चाहिए कॉल का जवाब दिया जा चुका है. टेलिकॉम सबसिस्टम इस तरीके को तब कॉल कर सकता है, जब आपका ऐप्लिकेशन नया इनकमिंग कॉल जोड़ता है और किसी दूसरे ऐप्लिकेशन में पहले से ही कोई कॉल चल रहा है, जिसे होल्ड पर नहीं रखा जा सकता. टेलिकॉम सबसिस्टम आपके ऐप्लिकेशन की ओर से इनकमिंग कॉल का यूज़र इंटरफ़ेस (यूआई) दिखाता है इन मामलों में. फ़्रेमवर्क एक ओवरलोडेड तरीका देता है, जो का इस्तेमाल करें. ज़्यादा के लिए जानकारी,onAnswer(int)
देखें.onReject()
टेलिकॉम सबसिस्टम इस तरीके को तब कॉल करता है, जब वह किसी इनकमिंग कॉल को अस्वीकार करना चाहता है कॉल. जब आपका ऐप्लिकेशन कॉल अस्वीकार कर देगा, तो उसे
setDisconnected(DisconnectCause)
को कॉल करना चाहिए औरREJECTED
को पैरामीटर के तौर पर बताना चाहिए. आपके ऐप्लिकेशन को चाहिए इसके बाद, सूचना देने के लिएdestroy()
तरीके को कॉल करें ऐप्लिकेशन ने कॉल को प्रोसेस किया था. टेलीकॉम सबसिस्टम कॉल इस तरीके का इस्तेमाल तब ही किया जा सकता है, जब उपयोगकर्ता आपके ऐप्लिकेशन से आने वाले कॉल को अस्वीकार कर देता है.onDisconnect()
टेलीकॉम सबसिस्टम इस तरीके को तब कॉल करता है, जब वह किसी कॉल को डिसकनेक्ट करना चाहता है. कॉल खत्म होने के बाद, आपके ऐप्लिकेशन को
setDisconnected(DisconnectCause)
तरीके को कॉल करना चाहिए. साथ ही,LOCAL
को पैरामीटर के तौर पर तय करना चाहिए, ताकि यह पता चल सके कि उपयोगकर्ता के अनुरोध की वजह से कॉल डिसकनेक्ट हो गया. इसके बाद, आपका ऐप्लिकेशन टेलीकॉम को सूचित करने काdestroy()
तरीका ऐप्लिकेशन के कॉल को प्रोसेस करने वाला सबसिस्टम. सिस्टम इस तरीके को कॉल कर सकता है जब उपयोगकर्ता ने कॉल के दौरान उपलब्ध किसी दूसरी सेवा के ज़रिए कॉल डिसकनेक्ट कर दिया है, जैसे कि Android Auto. सिस्टम इस तरीके को तब भी कॉल करता है, जब आपका कॉल अन्य कॉल करने के लिए डिसकनेक्ट किया जा सकता है. उदाहरण के लिए, अगर उपयोगकर्ता चाहता है कि आपातकालीन कॉल करने के लिए. कॉल के दौरान उपलब्ध सेवाओं के बारे में ज़्यादा जानने के लिए, यहां देखेंInCallService
.
कॉल करने की सामान्य स्थितियों को मैनेज करना
अपने कॉल में ConnectionService
एपीआई का इस्तेमाल करना
फ़्लो में android.telecom
की अन्य क्लास से इंटरैक्ट करना शामिल होता है
पैकेज. यहां दिए सेक्शन में, कॉल करने की आम स्थितियों के बारे में बताया गया है. साथ ही,
ऐप्लिकेशन को इन्हें हैंडल करने के लिए एपीआई का इस्तेमाल करना चाहिए.
इनकमिंग कॉल का उत्तर दें
इनकमिंग कॉल को मैनेज करने का फ़्लो यह बदल जाता है कि क्या दूसरे ऐप्लिकेशन में कॉल किए जा रहे हैं या नहीं. फ़्लो अलग-अलग होने की वजह यह है कि टेलिकॉम फ़्रेमवर्क करने के लिए अन्य ऐप्लिकेशन में सक्रिय कॉल होने पर कुछ प्रतिबंध सेट करना ज़रूरी है पक्का करें कि डिवाइस पर कॉल करने वाले सभी ऐप्लिकेशन के लिए एक जैसा माहौल रहे. ज़्यादा के लिए जानकारी के लिए, कॉल करने से जुड़ी शर्तें देखें.
दूसरे ऐप्लिकेशन से कोई कॉल नहीं किया जा रहा है
अन्य ऐप्लिकेशन में कोई ऐक्टिव कॉल न होने पर, इनकमिंग कॉल का जवाब देने के लिए, फ़ॉलो करें यह तरीका अपनाएं:
- आपके ऐप्लिकेशन को नया इनकमिंग कॉल मिलता है. हालांकि, इसके लिए वे अपने सामान्य तरीके का इस्तेमाल करते हैं.
addNewIncomingCall(PhoneAccountHandle, Bundle)
तरीके का इस्तेमाल करके, नए इनकमिंग कॉल के बारे में टेलीकॉम सबसिस्टम को सूचित करेगा.- टेलिकॉम सबसिस्टम आपके ऐप्लिकेशन के
ConnectionService
को लागू करता है और एक नए इंस्टेंस का अनुरोध करता है नई इनकमिंग को दर्शाने वालीConnection
क्लास का कॉल करने के लिए,onCreateIncomingConnection(PhoneAccountHandle, ConnectionRequest)
तरीके का इस्तेमाल करें. - टेलिकॉम सबसिस्टम, आपके ऐप्लिकेशन को सूचना देता है कि उसे इनकमिंग कॉल की जानकारी दिखानी चाहिए
यूज़र इंटरफ़ेस का डेटा इकट्ठा करने के लिए
onShowIncomingCallUi()
तरीके का इस्तेमाल करना होगा. - आपका ऐप्लिकेशन,
फ़ुल-स्क्रीन पर सूचनाएं दिखाने की अनुमति दें. ज़्यादा जानकारी के लिए,
onShowIncomingCallUi()
देखें. setActive()
तरीके को कॉल करें, अगर उपयोगकर्ता आने वाले कॉल को स्वीकार करता है याsetDisconnected(DisconnectCause)
,REJECTED
को पैरामीटर के तौर पर डालकर,destroy()
तरीके को कॉल करने की सुविधा, अगर उपयोगकर्ता इनकमिंग कॉल को अस्वीकार कर देता है.
दूसरे ऐप्लिकेशन में चल रहे ऐसे कॉल जिन्हें होल्ड पर नहीं रखा जा सकता
इनकमिंग कॉल का जवाब देने के लिए, जब दूसरे ऐप्लिकेशन में ऐसे कॉल का जवाब दिया जा रहा हो जो उसे होल्ड पर रख सकता है, तो इन चरणों का पालन करें:
- आपके ऐप्लिकेशन को नया इनकमिंग कॉल मिलता है. हालांकि, इसके लिए वे अपने सामान्य तरीके का इस्तेमाल करते हैं.
addNewIncomingCall(PhoneAccountHandle, Bundle)
तरीके का इस्तेमाल करके, नए इनकमिंग कॉल के बारे में टेलीकॉम सबसिस्टम को सूचित करेगा.- टेलिकॉम सबसिस्टम आपके ऐप्लिकेशन के
ConnectionService
को लागू करता है और एक नए इंस्टेंस का अनुरोध करता हैConnection
ऑब्जेक्ट में से, जो नए ऑब्जेक्ट को दिखा रहा हैonCreateIncomingConnection(PhoneAccountHandle, ConnectionRequest)
तरीके से इनकमिंग कॉल. - टेलिकॉम सबसिस्टम आपके इनकमिंग कॉल के लिए इनकमिंग कॉल का यूज़र इंटरफ़ेस (यूआई) दिखाता है.
- अगर उपयोगकर्ता कॉल स्वीकार करता है, तो टेलिकॉम सबसिस्टम
onAnswer()
तरीके को कॉल करता है. टेलीकॉम नेटवर्क से संपर्क करने के लिए, आपकोsetActive()
तरीके को कॉल करना चाहिए सबसिस्टम, जहां से कॉल कनेक्ट किया गया है. - अगर उपयोगकर्ता कॉल अस्वीकार कर देता है, तो टेलिकॉम सबसिस्टम
onReject()
तरीके को कॉल करता है. आपकोsetDisconnected(DisconnectCause)
तरीके को कॉल करना चाहिए, जिसमेंREJECTED
को पैरामीटर के तौर पर शामिल किया गया है. इसके बाद,destroy()
तरीके को कॉल करें.
आउटगोइंग कॉल करें
आउटगोइंग कॉल करने के फ़्लो में यह संभावना मैनेज की जाती है कि टेलिकॉम फ़्रेमवर्क की ओर से लगाई गई पाबंदियों की वजह से, कॉल नहीं किया जा सकता. ज़्यादा जानकारी के लिए, कॉल करने से जुड़ी शर्तें देखें.
आउटगोइंग कॉल करने के लिए, यह तरीका अपनाएं:
- उपयोगकर्ता आपके ऐप्लिकेशन में आउटगोइंग कॉल शुरू करता है.
placeCall(Uri, Bundle)
तरीके का इस्तेमाल करके नए आउटगोइंग कॉल के बारे में टेलीकॉम सबसिस्टम. इन्हें लें इन बातों पर ध्यान दें:Uri
पैरामीटर वह पता दिखाता है जहां कॉल किया जा रहा है. सामान्य फ़ोन नंबर के लिए,tel:
यूआरआई का इस्तेमाल करें स्कीम.Bundle
पैरामीटर की मदद से, यह जानकारी दी जा सकती हैEXTRA_PHONE_ACCOUNT_HANDLE
अतिरिक्त में अपने ऐप्लिकेशन केPhoneAccountHandle
ऑब्जेक्ट को जोड़कर, कॉल करने की सुविधा देने वाले ऐप्लिकेशन के बारे में जानकारी पाएं. आपका ऐप्लिकेशन को हर आउटगोइंग कॉल के लिएPhoneAccountHandle
ऑब्जेक्ट देना होगा.Bundle
पैरामीटर की मदद से, यह भी तय किया जा सकता है कि आउटगोइंग कॉल में वीडियो शामिल होता है. इसके लिए,EXTRA_START_CALL_WITH_VIDEO_STATE
के अतिरिक्त विकल्प मेंSTATE_BIDIRECTIONAL
वैल्यू बताई जाती है. ध्यान रखें कि डिफ़ॉल्ट रूप से, टेलीकॉम सबसिस्टम, वीडियो कॉल को स्पीकरफ़ोन.
- टेलिकॉम सबसिस्टम आपके ऐप्लिकेशन के
ConnectionService
से जुड़ा होता है लागू करना. - अगर आपके ऐप्लिकेशन से आउटगोइंग कॉल नहीं किया जा सकता, तो टेलीकॉम सबसिस्टम कॉल
onCreateOutgoingConnectionFailed(PhoneAccountHandle, ConnectionRequest)
तरीका अपने ऐप्लिकेशन को बताएं कि इस समय कॉल नहीं किया जा सकता. आपका ऐप्लिकेशन उपयोगकर्ता को सूचित करना चाहिए कि कॉल नहीं किया जा सकता. - अगर आपके ऐप्लिकेशन से आउटगोइंग कॉल किया जा सकता है, तो टेलीकॉम सबसिस्टम कॉल
onCreateOutgoingConnection(PhoneAccountHandle, ConnectionRequest)
तरीका. नया आउटगोइंग कॉल दिखाने के लिए, आपके ऐप्लिकेशन को आपकीConnection
क्लास का इंस्टेंस दिखाना चाहिए. इसके लिए कनेक्शन में सेट की जाने वाली प्रॉपर्टी के बारे में ज़्यादा जानकारी के लिए, कनेक्शन सेवा लागू करना देखें. - आउटगोइंग कॉल कनेक्ट हो जाने पर,
setActive()
तरीके को कॉल करके टेलीकॉम सबसिस्टम को सूचना दें कि कॉल सक्रिय है.
कॉल ख़त्म करना
कॉल खत्म करने के लिए, यह तरीका अपनाएं:
LOCAL
को भेजने वालेsetDisconnected(DisconnectCause)
को पैरामीटर के रूप में कॉल करें, अगर उपयोगकर्ता कॉल खत्म हो गया याREMOTE
भेजें का इस्तेमाल पैरामीटर के तौर पर तब करें, जब दूसरे पक्ष ने कॉल खत्म कर दिया हो.destroy()
तरीके को कॉल करें.
कॉलिंग कंस्ट्रेंट
यह पक्का करने के लिए कि आपके उपयोगकर्ताओं को एक जैसा और आसान कॉल करने का अनुभव मिले, टेलिकॉम
फ़्रेमवर्क, डिवाइस पर कॉल मैनेज करने के लिए कुछ पाबंदियां लागू करता है. इसके लिए
उदाहरण के लिए, मान लीजिए कि उपयोगकर्ता ने कॉल करने के लिए दो ऐप्लिकेशन इंस्टॉल किए हैं
सेल्फ़-मैनेज किया जा रहा ConnectionService
API, FooTalk और
BarTalk. इस मामले में, कॉन्टेंट पर ये पाबंदियां लागू होती हैं:
एपीआई लेवल 27 या इससे पहले के लेवल पर चल रहे डिवाइसों पर, सिर्फ़ एक ऐप्लिकेशन किसी भी समय पर चल रही कॉल. इस कंस्ट्रेंट का मतलब है कि जब किसी उपयोगकर्ता के पास जब आप FooTalk ऐप्लिकेशन इस्तेमाल कर रहे हों, तब BarTalk ऐप्लिकेशन, कॉल शुरू नहीं कर सकता या उसे कॉल नहीं कर सकता कॉल करें.
एपीआई लेवल 28 या उसके बाद के लेवल वाले डिवाइसों पर, अगर FooTalk और BarTalk दोनों एलान करें
CAPABILITY_SUPPORT_HOLD
औरCAPABILITY_HOLD
अनुमतियां दी हैं, तो उपयोगकर्ता एक बार में एक से ज़्यादा कॉल को बनाए रख सकता है दूसरी कॉल करने या उस कॉल का जवाब देने के लिए, एक ऐप्लिकेशन से दूसरे ऐप्लिकेशन पर स्विच करना.अगर उपयोगकर्ता, मैनेज किए जाने वाले सामान्य कॉल में शामिल है (उदाहरण के लिए, पहले से मौजूद फ़ोन या डायलर ऐप्लिकेशन), तो उपयोगकर्ता उन कॉल में शामिल नहीं हो सकते जो इनसे किए गए हैं कॉलिंग ऐप्लिकेशन. इसका यह अर्थ है कि अगर उपयोगकर्ता अपने मोबाइल और इंटरनेट सेवा देने वाली कंपनी के साथ, वे एक साथ FooTalk या BarTalk कॉल में नहीं शामिल हो सकते.
अगर उपयोगकर्ता कोई आपातकालीन कॉल.
जब उपयोगकर्ता आपातकालीन कॉल में हो, तब आपका ऐप्लिकेशन न तो कॉल रिसीव कर सकता है और न ही कर सकता है.
अगर आपके ऐप्लिकेशन को कॉल करने के बाद, किसी दूसरे ऐप्लिकेशन में पहले से कॉल चल रहा है इनकमिंग कॉल, इनकमिंग कॉल का जवाब देने से अन्य ऐप्लिकेशन. आपके ऐप्लिकेशन को आम तौर पर, इनकमिंग कॉल का यूज़र इंटरफ़ेस नहीं दिखाना चाहिए. टेलिकॉम फ़्रेमवर्क, इनकमिंग कॉल का यूज़र इंटरफ़ेस दिखाता है. साथ ही, नए कॉल का जवाब देने वाला उपयोगकर्ता, मौजूदा कॉल को खत्म कर देगा. यह इसका मतलब है कि अगर उपयोगकर्ता FooTalk कॉल में है और BarTalk ऐप्लिकेशन को इनकमिंग कॉल के लिए इस्तेमाल किया जाता है, तो टेलिकॉम फ़्रेमवर्क उपयोगकर्ता को बताता है कि उनके पास नया इनकमिंग BarTalk कॉल और BarTalk कॉल का जवाब देने से उनका FooTalk कॉल.
डिफ़ॉल्ट फ़ोन ऐप्लिकेशन बनना
डिफ़ॉल्ट डायलर/फ़ोन ऐप्लिकेशन वह होता है जो कॉल के दौरान यूज़र इंटरफ़ेस उपलब्ध कराता है, जबकि डिवाइस
का इस्तेमाल किया जा सकता है. इससे उपयोगकर्ता को कॉल करने और कॉल का इतिहास देखने की सुविधा भी मिलती है
Google Chrome का इस्तेमाल करके साइन इन किया जा सकता है. डिवाइस को सिस्टम से बंडल किए गए डिफ़ॉल्ट डायलर/फ़ोन ऐप्लिकेशन के साथ बंडल किया जाता है. किसी उपयोगकर्ता
सिस्टम ऐप्लिकेशन से यह भूमिका लेने के लिए, कोई एक ऐप्लिकेशन चुन सकता है. ऐसा ऐप्लिकेशन जो
इस भूमिका को पूरा करने के लिए, RoleManager
का इस्तेमाल करके यह अनुरोध किया जाता है कि वे
RoleManager.ROLE_DIALER
की भूमिका.
कॉल के दौरान, डिफ़ॉल्ट फ़ोन ऐप्लिकेशन एक यूज़र इंटरफ़ेस उपलब्ध कराता है. साथ ही, डिवाइस
कार मोड में नहीं है (यानी UiModeManager#getCurrentModeType()
नहीं है
Configuration.UI_MODE_TYPE_CAR
).
RoleManager.ROLE_DIALER
की भूमिका पूरी करने के लिए, ऐप्लिकेशन को
ज़रूरतों की संख्या:
- इसे
Intent#ACTION_DIAL
इंटेंट को हैंडल करना चाहिए. इसका मतलब है कि ऐप्लिकेशन को डायल पैड यूज़र इंटरफ़ेस (यूआई), जिसका इस्तेमाल करके उपयोगकर्ता आउटगोइंग कॉल कर सकते हैं. - इसे
InCallService
एपीआई को पूरी तरह से लागू करना होगा. साथ ही, इनकमिंग कॉल की सुविधा देनी होगी यूज़र इंटरफ़ेस (यूआई) और मौजूदा कॉल का यूज़र इंटरफ़ेस (यूआई).
ध्यान दें: यदि RoleManager.ROLE_DIALER
को भरने वाला ऐप्लिकेशन
बाइंडिंग के दौरान null
InCallService
, टेलीकॉम फ़्रेमवर्क अपने-आप हट जाएगा
डिवाइस पर पहले से लोड किए गए डायलर ऐप्लिकेशन का इस्तेमाल करने के लिए. सिस्टम इस पर एक सूचना दिखाएगा
उपयोगकर्ता को सूचित करना होगा कि उनका कॉल पहले से लोड किए गए डायलर ऐप्लिकेशन का इस्तेमाल करके जारी रखा गया है. आपका
ऐप्लिकेशन को कभी भी null
बाइंडिंग नहीं लौटाना चाहिए; ऐसा करने का मतलब है कि वह
RoleManager.ROLE_DIALER
की ज़रूरी शर्तें.
ध्यान दें: अगर आपका ऐप्लिकेशन RoleManager.ROLE_DIALER
में जानकारी भरता है और इसमें बदलाव करता है
रनटाइम की वजह से, यह इस भूमिका की ज़रूरी शर्तों को पूरा नहीं करता है,
RoleManager
, आपके ऐप्लिकेशन को इस भूमिका से अपने-आप हटा देगा और बंद कर देगा
आपका ऐप्लिकेशन. उदाहरण के लिए, अगर आपको
PackageManager.setComponentEnabledSetting(ComponentName, int, int)
से
आपका ऐप्लिकेशन अपने मेनिफ़ेस्ट में बताए गए InCallService
को प्रोग्राम के हिसाब से बंद करता है
अब आपकी वेबसाइट पर
RoleManager.ROLE_DIALER
.
पहले से लोड किए गए डायलर का इस्तेमाल तब किया जाएगा, जब उपयोगकर्ता आपातकालीन कॉल करेगा. भले ही,
ऐप्लिकेशन, RoleManager.ROLE_DIALER
की भूमिका को पूरा करता है. बेहतर नतीजे पाने के लिए
का अनुभव प्राप्त करने के लिए, डिफ़ॉल्ट डायलर को हमेशा
कॉल करने के लिए TelecomManager.placeCall(Uri, Bundle)
(ये मामले शामिल हैं
आपातकालीन कॉल). इससे यह पक्का होता है कि प्लैटफ़ॉर्म यह पुष्टि कर सके कि अनुरोध उसी सोर्स से आया है
डिफ़ॉल्ट डायलर के आधार पर फ़िल्टर किया जा सकता है. यदि पहले से लोड नहीं किया गया कोई डायलर ऐप्लिकेशन किसी फ़ाइल को एम्बेड करने के लिए Intent#ACTION_CALL
का उपयोग करता है
तो आपातकालीन कॉल के लिए Intent#ACTION_DIAL
का इस्तेमाल करके, पहले से लोड किए गए डायलर ऐप्लिकेशन में कॉल किया जाएगा
पुष्टि के लिए; यह उपयोगकर्ता के अनुभव पर बुरा असर डाल सकता है.
नीचे, InCallService
के लिए मेनिफ़ेस्ट रजिस्ट्रेशन का एक उदाहरण दिया गया है. मेटा-डेटा
TelecomManager#METADATA_IN_CALL_SERVICE_UI
से पता चलता है कि
InCallService
को लागू करने का मकसद, पहले से मौजूद कॉल के यूज़र इंटरफ़ेस (यूआई) की जगह लागू करना है.
मेटा-डेटा TelecomManager#METADATA_IN_CALL_SERVICE_RINGING
से पता चलता है कि
InCallService
, इनकमिंग कॉल के लिए रिंगटोन चलाएगा. यहां जाएं:
इनकमिंग कॉल दिखाने के बारे में ज़्यादा जानकारी के लिए यहां दिया गया है
यूज़र इंटरफ़ेस (यूआई) और ऐप्लिकेशन में रिंगटोन चलाना.
<service android:name="your.package.YourInCallServiceImplementation"
android:permission="android.permission.BIND_INCALL_SERVICE"
android:exported="true">
<meta-data android:name="android.telecom.IN_CALL_SERVICE_UI" android:value="true" />
<meta-data android:name="android.telecom.IN_CALL_SERVICE_RINGING"
android:value="true" />
<intent-filter>
<action android:name="android.telecom.InCallService"/>
</intent-filter>
</service>
ध्यान दें: आपको अपने InCallService
पर एट्रिब्यूट का निशान नहीं लगाना चाहिए
android:exported="false"
; ऐसा करने से, हो सकता है कि आप लागू करने की प्रक्रिया से बाध्य न हो पाएं
कॉल के दौरान.
InCallService
एपीआई को लागू करने के अलावा, आपको इसमें किसी गतिविधि का एलान भी करना होगा
आपका मेनिफ़ेस्ट जो Intent#ACTION_DIAL
इंटेंट को हैंडल करता है. नीचे दिया गया उदाहरण दिखाता है
इसे कैसे किया जाता है:
<activity android:name="your.package.YourDialerActivity"
android:label="@string/yourDialerActivityLabel">
<intent-filter>
<action android:name="android.intent.action.DIAL" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.DIAL" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="tel" />
</intent-filter>
</activity>
जब कोई उपयोगकर्ता आपका ऐप्लिकेशन इंस्टॉल करता है और उसे पहली बार चलाता है, तो आपको
RoleManager
, ताकि उपयोगकर्ता से यह पूछा जा सके कि वे आपका ऐप्लिकेशन इस्तेमाल करना चाहते हैं या नहीं
नया डिफ़ॉल्ट फ़ोन ऐप्लिकेशन होना चाहिए.
नीचे दिया गया कोड दिखाता है कि आपका ऐप्लिकेशन, डिफ़ॉल्ट फ़ोन/डायलर ऐप्लिकेशन बनने का अनुरोध किस तरह कर सकता है:
private static final int REQUEST_ID = 1;
public void requestRole() {
RoleManager roleManager = (RoleManager) getSystemService(ROLE_SERVICE);
Intent intent = roleManager.createRequestRoleIntent(RoleManager.ROLE_DIALER);
startActivityForResult(intent, REQUEST_ID);
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_ID) {
if (resultCode == android.app.Activity.RESULT_OK) {
// Your app is now the default dialer app
} else {
// Your app is not the default dialer app
}
}
}
पहने जाने वाले डिवाइसों के लिए InCallService का ऐक्सेस
-
अगर आपका ऐप्लिकेशन तीसरे पक्ष का साथी ऐप्लिकेशन है और उसे InCallService API ऐक्सेस करना है, तो
ऐप्लिकेशन ये काम कर सकते हैं:
- अपने मेनिफ़ेस्ट में MANAGE_ONGOING_CALLS अनुमति का एलान करें
- इसके माध्यम से किसी भौतिक पहने जाने वाले डिवाइस से संबद्ध करें
CompanionDeviceManager
एपीआई को साथी ऐप्लिकेशन के तौर पर इस्तेमाल करें. देखें: https://developer.android.com/guide/topics/connectivity/companion-device-pairing - BIND_INCALL_SERVICE अनुमति के साथ इस InCallService को लागू करें
इनकमिंग कॉल की सूचना दिखाई जा रही है
जब आपके ऐप्लिकेशन कोInCallService#onCallAdded(Call)
से नया इनकमिंग कॉल मिलता है, तो
जो इनकमिंग कॉल के लिए, इनकमिंग कॉल का यूज़र इंटरफ़ेस (यूआई) दिखाता है. इसे इसका उपयोग करके ऐसा करना चाहिए
इनकमिंग कॉल की नई सूचना पोस्ट करने के लिए NotificationManager
एपीआई.
जहां आपका ऐप्लिकेशन, मेटा-डेटा TelecomManager#METADATA_IN_CALL_SERVICE_RINGING
की जानकारी देता है, वहां वह
इनकमिंग कॉल के लिए रिंगटोन बजाने के लिए ज़िम्मेदार है. आपके ऐप्लिकेशन को
NotificationChannel
जो पसंदीदा रिंगटोन के बारे में बताता है. उदाहरण के लिए:
NotificationChannel channel = new NotificationChannel(YOUR_CHANNEL_ID, "Incoming Calls",
NotificationManager.IMPORTANCE_MAX);
// other channel setup stuff goes here.
// We'll use the default system ringtone for our incoming call notification channel. You can
// use your own audio resource here.
Uri ringtoneUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);
channel.setSound(ringtoneUri, new AudioAttributes.Builder()
// Setting the AudioAttributes is important as it identifies the purpose of your
// notification sound.
.setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE)
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.build());
NotificationManager mgr = getSystemService(NotificationManager.class);
mgr.createNotificationChannel(channel);
जब आपके ऐप्लिकेशन को कोई नया इनकमिंग कॉल मिलता है, तो वहNotification
इनकमिंग कॉल को आपके इनकमिंग कॉल की सूचना देने वाले चैनल से जोड़ता है. आप
PendingIntent
सूचना पर, जिससे फ़ुल स्क्रीन मोड चालू हो जाएगा
इनकमिंग कॉल का यूज़र इंटरफ़ेस (यूआई). नोटिफ़िकेशन मैनेजर फ़्रेमवर्क आपकी सूचना को
अगर उपयोगकर्ता सक्रिय रूप से फ़ोन का इस्तेमाल कर रहा है, तो आपको हेड-अप नोटिफ़िकेशन मिलेगा. जब उपयोगकर्ता,
फ़ोन है, तो इसके बजाय आपके फ़ुल-स्क्रीन इनकमिंग कॉल यूज़र इंटरफ़ेस (यूआई) का इस्तेमाल किया गया है.
उदाहरण के लिए:
// Create an intent which triggers your fullscreen incoming call user interface.
Intent intent = new Intent(Intent.ACTION_MAIN, null);
intent.setFlags(Intent.FLAG_ACTIVITY_NO_USER_ACTION | Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setClass(context, YourIncomingCallActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 1, intent, PendingIntent.FLAG_MUTABLE_UNAUDITED);
// Build the notification as an ongoing high priority item; this ensures it will show as
// a heads up notification which slides down over top of the current content.
final Notification.Builder builder = new Notification.Builder(context);
builder.setOngoing(true);
builder.setPriority(Notification.PRIORITY_HIGH);
// Set notification content intent to take user to the fullscreen UI if user taps on the
// notification body.
builder.setContentIntent(pendingIntent);
// Set full screen intent to trigger display of the fullscreen UI when the notification
// manager deems it appropriate.
builder.setFullScreenIntent(pendingIntent, true);
// Setup notification content.
builder.setSmallIcon( yourIconResourceId );
builder.setContentTitle("Your notification title");
builder.setContentText("Your notification content.");
// Use builder.addAction(..) to add buttons to answer or reject the call.
NotificationManager notificationManager = mContext.getSystemService(
NotificationManager.class);
notificationManager.notify(YOUR_CHANNEL_ID, YOUR_TAG, YOUR_ID, builder.build());
```