सेशन इनिशिएशन प्रोटोकॉल की खास जानकारी

ई-सिम और सिम कार्ड का पता लगाएं

कार्ड की पहचान की जा रही है

सिम कार्ड और ई-सिम वाले Android डिवाइस, टेलीफ़ोनी में इन आईडी का इस्तेमाल करते हैं एपीआई, जिनमें शामिल हैं [`TelephonyManager`](/reference/android/telephony/TelephonyManager) और [`SubscriptionManager`](/reference/android/Telephony/SubscriptionManager): * सदस्यता आईडी: मोबाइल सदस्यता के लिए विशेष आईडी. * लॉजिकल स्लॉट इंडेक्स या आईडी: यूनीक इंडेक्स, जो लॉजिकल सिम स्लॉट से जुड़ा होता है. लॉजिकल स्लॉट आईडी 0 से शुरू होते हैं और किसी डिवाइस पर काम करने वाले ऐक्टिव स्लॉट. उदाहरण के लिए, आम तौर पर ड्यूअल-सिम वाले डिवाइस पर स्लॉट 0 और स्लॉट 1 है. अगर किसी डिवाइस में कई फ़िज़िकल स्लॉट हैं, लेकिन एक चालू स्लॉट का इस्तेमाल करता है, तो इसका सिर्फ़ लॉजिकल स्लॉट आईडी 0 होगा. * फ़िज़िकल स्लॉट इंडेक्स या आईडी: ऐसा यूनीक इंडेक्स जो फ़िज़िकल सिम स्लॉट को रेफ़र करता है. फ़िज़िकल स्लॉट आईडी 0 से शुरू होते हैं और फ़िज़िकल स्लॉट आईडी की संख्या के आधार पर ऊपर जाते हैं डिवाइस पर स्लॉट हैं. यह डिवाइस में मौजूद लॉजिकल स्लॉट की संख्या से अलग है है, जो डिवाइस के चालू स्लॉट की संख्या से मेल खाता है का उपयोग करके. उदाहरण के लिए, ऐसा डिवाइस जो ड्यूअल-सिम और एक सिम के बीच स्विच करता है मोड में हमेशा दो फ़िज़िकल स्लॉट हो सकते हैं, लेकिन एक सिम वाले मोड में यह होगा सिर्फ़ एक लॉजिकल स्लॉट हो. * कार्ड आईडी: Uicccard की पहचान करने के लिए इस्तेमाल किया जाने वाला यूनीक आईडी. ![दो लॉजिकल स्लॉट और तीन फ़िज़िकल स्लॉट](/images/guide/topics/connectivity/tel-ids.png) वाले केस में, आईडी के इस्तेमाल का तरीका दिखाने वाला डायग्राम ऊपर दिए गए डायग्राम में: * डिवाइस में दो लॉजिकल स्लॉट होते हैं. * फ़िज़िकल स्लॉट 0 में एक फ़िज़िकल यूआईसीसी कार्ड है, जिसकी प्रोफ़ाइल चालू है. * फ़िज़िकल स्लॉट 2 में एक eUICC है, जिसकी प्रोफ़ाइल चालू है. * फ़िज़िकल स्लॉट 1 का फ़िलहाल इस्तेमाल नहीं किया जा रहा है. ![तीन लॉजिकल स्लॉट और दो फ़िज़िकल स्लॉट वाले एक केस में, आईडी के इस्तेमाल का तरीका दिखाने वाला डायग्राम](/images/guide/topics/connectivity/tel-ids-2.png) ऊपर दिए गए डायग्राम में: * डिवाइस में तीन लॉजिकल स्लॉट होते हैं. * फ़िज़िकल स्लॉट 0 में एक फ़िज़िकल यूआईसीसी कार्ड है, जिसकी प्रोफ़ाइल चालू है. * फ़िज़िकल स्लॉट 1 में एक eUICC है, जिसमें डाउनलोड की गई दो प्रोफ़ाइलें हैं. ये दोनों प्रोफ़ाइलें एमईपी (एक से ज़्यादा चालू प्रोफ़ाइल) का इस्तेमाल करके चालू की गई हैं.

सेशन इनिशिएशन प्रोटोकॉल की खास जानकारी

Android, सेशन इनिशिएशन प्रोटोकॉल (SIP) के साथ काम करने वाला एपीआई उपलब्ध कराता है. इससे आपको अपने ऐप्लिकेशन में SIP आधारित इंटरनेट टेलीफ़ोनी सुविधाएं जोड़ने की सुविधा मिलती है. Android में फ़ुल SIP प्रोटोकॉल स्टैक और इंटिग्रेटेड कॉल मैनेजमेंट की सुविधा है ऐसी सेवाएं जो ऐप्लिकेशन को आसानी से आउटगोइंग और इनकमिंग वॉइस कॉल सेट करने देती हैं, वह भी सेशन, ट्रांसपोर्ट-लेवल कम्यूनिकेशन या ऑडियो रिकॉर्ड करने या वीडियो चलाने के लिए किया जा सकता है.

यहां इस तरह के ऐप्लिकेशन के उदाहरण दिए गए हैं जो SIP API का इस्तेमाल कर सकते हैं:

  • वीडियो कॉन्फ़्रेंसिंग
  • इंस्टेंट मैसेजिंग

शर्तें और सीमाएं

SIP ऐप्लिकेशन बनाने की ज़रूरी शर्तें यहां दी गई हैं:

  • आपके पास Android 2.3 या इसके बाद के वर्शन पर चलने वाला मोबाइल डिवाइस होना चाहिए.
  • SIP, वायरलेस डेटा कनेक्शन पर चलता है, इसलिए आपके डिवाइस में डेटा होना चाहिए कनेक्शन (किसी मोबाइल डेटा सेवा या वाई-फ़ाई के साथ). इसका मतलब है कि AVD पर टेस्ट नहीं किया जा सकता—इसे सिर्फ़ किसी फ़िज़िकल डिवाइस पर टेस्ट किया जा सकता है. जानकारी के लिए, यह देखें SIP ऐप्लिकेशन की जांच करना.
  • ऐप्लिकेशन के कम्यूनिकेशन सेशन में हिस्सा लेने वाले हर व्यक्ति के पास SIP खाता. SIP की सेवा देने वाली कई अलग-अलग कंपनियां, SIP खाते उपलब्ध कराती हैं.

ध्यान दें: android.net.sip लाइब्रेरी में वीडियो नहीं चलाया जा सकता कॉल. अगर आपको SIP स्टैक का इस्तेमाल करके, वीओआईपी कॉलिंग की सुविधा चालू करनी है, जैसे कि android.net.sip, कई आधुनिक ओपन सोर्स में से एक को देखें के विकल्पों के आधार पर, वीओआईपी कॉल को लागू किया जा सकता है. इसके अलावा, लागू किया जा सकता है, ConnectionService एपीआई, ताकि इन कॉल को डिवाइस के डायलर में बेहतर तरीके से इंटिग्रेट किया जा सके है.

SIP API क्लास और इंटरफ़ेस

यहां क्लास की खास जानकारी और एक इंटरफ़ेस दिया गया है (SipRegistrationListener) जो Android SIP में शामिल हैं एपीआई:

क्लास/इंटरफ़ेस ब्यौरा
SipAudioCall SIP पर इंटरनेट ऑडियो कॉल को हैंडल करती है.
SipAudioCall.Listener SIP कॉल से जुड़े इवेंट को सुनने की सुविधा, जैसे कि कॉल के दौरान मिला ("कॉल करने पर") या कॉल आउटगोइंग ("कॉल करने पर") हो.
SipErrorCode SIP कार्रवाइयों के दौरान मिले गड़बड़ी कोड के बारे में बताता है.
SipManager यह SIP टास्क के लिए एपीआई उपलब्ध कराता है, जैसे कि SIP कनेक्शन शुरू करना और ऐक्सेस देना को ऐक्सेस किया जा सकता है.
SipProfile SIP प्रोफ़ाइल के बारे में बताता है, जिसमें SIP खाता, डोमेन, और सर्वर की जानकारी शामिल होती है.
SipProfile.Builder SipProfile बनाने के लिए हेल्पर क्लास.
SipSession यह ऐसे SIP सेशन को दिखाता है जो SIP डायलॉग या स्टैंडअलोन लेन-देन से जुड़ा होता है डायलॉग के अंदर नहीं जा सकता.
SipSession.Listener SIP सेशन से जुड़े इवेंट को सुनने की सुविधा, जैसे कि सेशन के रजिस्टर होने के समय ("रजिस्टर करने पर") या कॉल आउटगोइंग ("कॉल करने पर") हो.
SipSession.State SIP सेशन की स्थितियों के बारे में बताता है, जैसे कि "रजिस्टर किया जा रहा है", "आउटगोइंग कॉल", और "कॉल में".
SipRegistrationListener ऐसा इंटरफ़ेस जो SIP रजिस्ट्रेशन इवेंट को सुनने की सुविधा देता है.

मेनिफ़ेस्ट बनाया जा रहा है

यदि आप SIP API का उपयोग करने वाला कोई ऐप्लिकेशन डेवलप कर रहे हैं, तो याद रखें कि यह सुविधा सिर्फ़ Android 2.3 (एपीआई लेवल 9) और इसके बाद वाले वर्शन पर काम करती है प्लैटफ़ॉर्म. साथ ही, Android 2.3 (एपीआई लेवल 9) या इसके बाद के वर्शन वाले डिवाइसों में, सभी डिवाइस, SIP की सुविधा नहीं देते.

SIP का इस्तेमाल करने के लिए, अपने ऐप्लिकेशन के मेनिफ़ेस्ट में इन अनुमतियों को जोड़ें:

  • android.permission.USE_SIP
  • android.permission.INTERNET

यह पक्का करने के लिए कि आपका ऐप्लिकेशन सिर्फ़ उन डिवाइसों पर इंस्टॉल किया जाए जिन्हें SIP पर काम कर सकता है, इसलिए अपने ऐप्लिकेशन के मेनिफ़ेस्ट:

<uses-sdk android:minSdkVersion="9" />

इससे पता चलता है कि आपके ऐप्लिकेशन के लिए Android 2.3 या इसके बाद का वर्शन होना ज़रूरी है. इसके लिए ज़्यादा जानकारी के लिए, देखें एपीआई लेवल और दस्तावेज़ के लिए <uses-sdk> एलिमेंट.

यह कंट्रोल करने के लिए कि आपका ऐप्लिकेशन उन डिवाइसों से कैसे फ़िल्टर किया जाए जो सपोर्ट नहीं करते SIP (उदाहरण के लिए, Google Play पर), अपने ऐप्लिकेशन के मेनिफ़ेस्ट:

<uses-feature android:name="android.software.sip.voip" />

इसमें बताया गया है कि आपका ऐप्लिकेशन, SIP API का इस्तेमाल करता है. एलान में android:required एट्रिब्यूट शामिल करें. इससे पता चलेगा कि क्या ऐप्लिकेशन को उन डिवाइस से फ़िल्टर करना चाहते हैं जो SIP समर्थन नहीं करते. अन्य <uses-feature> एलानों की भी ज़रूरत पड़ सकती है, लागू किया जाएगा. ज़्यादा जानकारी के लिए, दस्तावेज़ देखें के लिए <uses-feature> अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है एलिमेंट.

अगर आपके ऐप्लिकेशन को कॉल रिसीव करने के लिए डिज़ाइन किया गया है, तो आपको ऐप्लिकेशन के मेनिफ़ेस्ट में रिसीवर (BroadcastReceiver सब-क्लास) को भी तय करना होगा:

<receiver android:name=".IncomingCallReceiver" android:label="Call Receiver" />

यहां SipDemo मेनिफ़ेस्ट के कुछ हिस्से दिए गए हैं:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
         
package="com.example.android.sip">
  ...
     
<receiver android:name=".IncomingCallReceiver" android:label="Call Receiver" />
  ...
 
<uses-sdk android:minSdkVersion="9" />
 
<uses-permission android:name="android.permission.USE_SIP" />
 
<uses-permission android:name="android.permission.INTERNET" />
  ...
 
<uses-feature android:name="android.software.sip.voip" android:required="true" />
 
<uses-feature android:name="android.hardware.wifi" android:required="true" />
 
<uses-feature android:name="android.hardware.microphone" android:required="true" />
</manifest>

SipManager बनाया जा रहा है

SIP API का इस्तेमाल करने के लिए, आपके ऐप्लिकेशन को SipManager ऑब्जेक्ट बनाना होगा. SipManager को ध्यान रखें:

  • SIP सेशन शुरू किए जा रहे हैं.
  • कॉल करना और पाना.
  • SIP की सेवा देने वाली कंपनी के साथ रजिस्टर करना और रजिस्ट्रेशन रद्द करना.
  • सेशन की कनेक्टिविटी की पुष्टि की जा रही है.

नया SipManager इंस्टैंशिएट इस तरह होता है:

KotlinJava
val sipManager: SipManager? by lazy(LazyThreadSafetyMode.NONE) {
   
SipManager.newInstance(this)
}
public SipManager sipManager = null;
...
if (sipManager == null) {
    sipManager
= SipManager.newInstance(this);
}

SIP सर्वर के साथ रजिस्टर किया जा रहा है

आम तौर पर, Android SIP ऐप्लिकेशन में एक या एक से ज़्यादा उपयोगकर्ता होते हैं. इन उपयोगकर्ताओं में हर उपयोगकर्ता के लिए ज़रूरी होता है कि एक SIP खाता है. किसी Android SIP ऐप्लिकेशन में, हर SIP खाता SipProfile ऑब्जेक्ट से दिखाया जाता है.

SipProfile, SIP प्रोफ़ाइल के बारे में जानकारी देता है. इसमें SIP प्रोफ़ाइल भी शामिल है और डोमेन और सर्वर की जानकारी हासिल करें. SIP से जुड़ी प्रोफ़ाइल जिस डिवाइस पर ऐप्लिकेशन चल रहा है उस पर मौजूद खाते को स्थानीय कहा जाता है प्रोफ़ाइल पर जाएं. जिस प्रोफ़ाइल से सत्र कनेक्ट है, उसे मिलते-जुलते ऐप्लिकेशन की प्रोफ़ाइल. जब आपका SIP ऐप्लिकेशन, इस तरीके से SIP सर्वर में लॉग इन करता है स्थानीय SipProfile, इससे डिवाइस को आपके SIP पते पर SIP कॉल भेजने की जगह के तौर पर सेट करें.

इस सेक्शन में, SipProfile बनाने का तरीका बताया गया है, उसे किसी SIP सर्वर पर रजिस्टर करें और रजिस्ट्रेशन इवेंट ट्रैक करें.

SipProfile ऑब्जेक्ट इस तरह बनाया जाता है:

KotlinJava
private var sipProfile: SipProfile? = null
...

val builder = SipProfile.Builder(username, domain)
       
.setPassword(password)
sipProfile
= builder.build()
public SipProfile sipProfile = null;
...

SipProfile.Builder builder = new SipProfile.Builder(username, domain);
builder
.setPassword(password);
sipProfile
= builder.build();

इस कोड का हिस्सा, कॉल करने और/या सामान्य SIP कॉल पाना. कॉलर इसके ज़रिए बाद में कॉल कर सकता है mSipManager.makeAudioCall. इस अंश से, यह भी पता चलता है कि android.SipDemo.INCOMING_CALL, जिसका इस्तेमाल इंटेंट के लिए किया जाएगा डिवाइस पर कॉल आने पर फ़िल्टर करें (सेट अप करना कॉल रिसीव करने के लिए इंटेंट फ़िल्टर). रजिस्ट्रेशन का तरीका:

KotlinJava
val intent = Intent("android.SipDemo.INCOMING_CALL")
val pendingIntent: PendingIntent = PendingIntent.getBroadcast(this, 0, intent, Intent.FILL_IN_DATA)
sipManager
?.open(sipProfile, pendingIntent, null)
Intent intent = new Intent();
intent
.setAction("android.SipDemo.INCOMING_CALL");
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, Intent.FILL_IN_DATA);
sipManager
.open(sipProfile, pendingIntent, null);

आखिर में, यह कोड SipManager पर SipRegistrationListener सेट करता है. इससे यह ट्रैक किया जाता है कि SipProfile आपकी SIP सेवा के साथ रजिस्टर हुआ है या नहीं कंपनी:

KotlinJava
sipManager?.setRegistrationListener(sipProfile?.uriString, object : SipRegistrationListener {

   
override fun onRegistering(localProfileUri: String) {
        updateStatus
("Registering with SIP Server...")
   
}

   
override fun onRegistrationDone(localProfileUri: String, expiryTime: Long) {
        updateStatus
("Ready")
   
}

   
override fun onRegistrationFailed(
            localProfileUri
: String,
            errorCode
: Int,
            errorMessage
: String
   
) {
        updateStatus
("Registration failed. Please check settings.")
   
}
})
sipManager.setRegistrationListener(sipProfile.getUriString(), new SipRegistrationListener() {

   
public void onRegistering(String localProfileUri) {
        updateStatus
("Registering with SIP Server...");
   
}

   
public void onRegistrationDone(String localProfileUri, long expiryTime) {
        updateStatus
("Ready");
   
}

   
public void onRegistrationFailed(String localProfileUri, int errorCode,
       
String errorMessage) {
        updateStatus
("Registration failed.  Please check settings.");
   
}
}

जब आपके ऐप्लिकेशन में प्रोफ़ाइल का इस्तेमाल किया जाएगा, तो वह मुफ़्त में बंद हो जाएगी मेमोरी में सेव करने और सर्वर से डिवाइस का रजिस्ट्रेशन रद्द करने का काम करती है. इसके लिए उदाहरण:

KotlinJava
fun closeLocalProfile() {
   
try {
        sipManager
?.close(sipProfile?.uriString)
   
} catch (ee: Exception) {
       
Log.d("WalkieTalkieActivity/onDestroy", "Failed to close local profile.", ee)
   
}
}
public void closeLocalProfile() {
   
if (sipManager == null) {
       
return;
   
}
   
try {
       
if (sipProfile != null) {
          sipManager
.close(sipProfile.getUriString());
       
}
     
} catch (Exception ee) {
       
Log.d("WalkieTalkieActivity/onDestroy", "Failed to close local profile.", ee);
     
}
}

ऑडियो कॉल किया जा रहा है

ऑडियो कॉल करने के लिए, आपके पास ये चीज़ें होनी चाहिए:

  • एक SipProfile जो कॉल कर रहा है ( "स्थानीय प्रोफ़ाइल") और कॉल पाने के लिए एक मान्य SIP पता ( "पीयर प्रोफ़ाइल").
  • SipManager ऑब्जेक्ट.

ऑडियो कॉल करने के लिए, SipAudioCall.Listener सेट अप करें. क्लाइंट के इंटरैक्शन के बारे में, SIP स्टैक को सुनने वाले लोगों के ज़रिए प्रोसेस किया जाता है. इस स्निपेट में, आपको दिखता है कि SipAudioCall.Listener, कॉल के बाद चीज़ों को कैसे सेट अप करता है स्थापित:

KotlinJava
var listener: SipAudioCall.Listener = object : SipAudioCall.Listener() {

   
override fun onCallEstablished(call: SipAudioCall) {
        call
.apply {
            startAudio
()
            setSpeakerMode
(true)
            toggleMute
()
       
}
   
}

   
override fun onCallEnded(call: SipAudioCall) {
       
// Do something.
   
}
}
SipAudioCall.Listener listener = new SipAudioCall.Listener() {

   
@Override
   
public void onCallEstablished(SipAudioCall call) {
      call
.startAudio();
      call
.setSpeakerMode(true);
      call
.toggleMute();
         
...
   
}

   
@Override

   
public void onCallEnded(SipAudioCall call) {
     
// Do something.
   
}
};

SipAudioCall.Listener सेट अप करने के बाद, ये काम किए जा सकते हैं कॉल करो. SipManager तरीका makeAudioCall में ये पैरामीटर इस्तेमाल होते हैं:

  • लोकल SIP प्रोफ़ाइल (कॉलर).
  • मिलती-जुलती SIP प्रोफ़ाइल (उपयोगकर्ता को कॉल किया जा रहा है).
  • कॉल सुनने के लिए SipAudioCall.Listener SipAudioCall के इवेंट. यह null, लेकिन जैसा कि ऊपर दिखाया गया है, लिसनर का इस्तेमाल कॉल के बाद चीज़ों को सेट अप करने के लिए किया जाता है स्थापित किया गया.
  • टाइम आउट की वैल्यू, सेकंड में.

उदाहरण के लिए:

KotlinJava
val call: SipAudioCall? = sipManager?.makeAudioCall(
        sipProfile
?.uriString,
        sipAddress
,
        listener
,
       
30
)
call = sipManager.makeAudioCall(sipProfile.getUriString(), sipAddress, listener, 30);

कॉल प्राप्त करना

कॉल रिसीव करने के लिए, SIP ऐप्लिकेशन में BroadcastReceiver की सब-क्लास होनी चाहिए, जो किसी इंटेंट का जवाब दे सके यह बताता है कि कोई इनकमिंग कॉल है. इसलिए, आपको आपका ऐप्लिकेशन:

  • AndroidManifest.xml में, एलान करें <receiver>. SipDemo में, यह <receiver android:name=".IncomingCallReceiver" android:label="Call Receiver" />.
  • रिसीवर को लागू करें, जो कि BroadcastReceiver की सब-क्लास है. SipDemo में, यह IncomingCallReceiver.
  • स्थानीय प्रोफ़ाइल (SipProfile) को इसके साथ शुरू करें ऐसा इंटेंट, जो स्थानीय प्रोफ़ाइल पर किसी के कॉल करने पर आपके पाने वाले को सक्रिय कर देता है.
  • एक ऐसा इंटेंट फ़िल्टर सेट अप करें जो इनकमिंग कॉल. SipDemo में, यह कार्रवाई android.SipDemo.INCOMING_CALL.

सब-क्लासिंग BroadcastReceiver

कॉल रिसीव करने के लिए, आपके SIP ऐप्लिकेशन को BroadcastReceiver सब-क्लास करना होगा. यह Android सिस्टम, आने वाले SIP कॉल को मैनेज करता है और "इनकमिंग" कॉल" इंटेंट (ऐप्लिकेशन के बताए गए तरीके के मुताबिक) को मिलने पर उसे कॉल करें कॉल. BroadcastReceiver का सब-क्लास किया गया डेटा यहां दिया गया है SipDemo सैंपल से मिला कोड.

KotlinJava
/**
 * Listens for incoming SIP calls, intercepts and hands them off to WalkieTalkieActivity.
 */

class IncomingCallReceiver : BroadcastReceiver() {

   
/**
     * Processes the incoming call, answers it, and hands it over to the
     * WalkieTalkieActivity.
     * @param context The context under which the receiver is running.
     * @param intent The intent being received.
     */

   
override fun onReceive(context: Context, intent: Intent) {
       
val wtActivity = context as WalkieTalkieActivity

       
var incomingCall: SipAudioCall? = null
       
try {
            incomingCall
= wtActivity.sipManager?.takeAudioCall(intent, listener)
            incomingCall
?.apply {
                answerCall
(30)
                startAudio
()
                setSpeakerMode
(true)
               
if (isMuted) {
                    toggleMute
()
               
}
                wtActivity
.call = this
                wtActivity
.updateStatus(this)
           
}
       
} catch (e: Exception) {
            incomingCall
?.close()
       
}
   
}

   
private val listener = object : SipAudioCall.Listener() {

       
override fun onRinging(call: SipAudioCall, caller: SipProfile) {
           
try {
                call
.answerCall(30)
           
} catch (e: Exception) {
                e
.printStackTrace()
           
}
       
}
   
}
}
/**
 * Listens for incoming SIP calls, intercepts and hands them off to WalkieTalkieActivity.
 */

public class IncomingCallReceiver extends BroadcastReceiver {
   
/**
     * Processes the incoming call, answers it, and hands it over to the
     * WalkieTalkieActivity.
     * @param context The context under which the receiver is running.
     * @param intent The intent being received.
     */

   
@Override
   
public void onReceive(Context context, Intent intent) {
       
SipAudioCall incomingCall = null;
       
try {
           
SipAudioCall.Listener listener = new SipAudioCall.Listener() {
               
@Override
               
public void onRinging(SipAudioCall call, SipProfile caller) {
                   
try {
                        call
.answerCall(30);
                   
} catch (Exception e) {
                        e
.printStackTrace();
                   
}
               
}
           
};
           
WalkieTalkieActivity wtActivity = (WalkieTalkieActivity) context;
            incomingCall
= wtActivity.sipManager.takeAudioCall(intent, listener);
            incomingCall
.answerCall(30);
            incomingCall
.startAudio();
            incomingCall
.setSpeakerMode(true);
           
if(incomingCall.isMuted()) {
                incomingCall
.toggleMute();
           
}
            wtActivity
.call = incomingCall;
            wtActivity
.updateStatus(incomingCall);
       
} catch (Exception e) {
           
if (incomingCall != null) {
                incomingCall
.close();
           
}
       
}
   
}
}

कॉल पाने के लिए इंटेंट फ़िल्टर सेट अप करना

SIP सेवा को नया कॉल मिलने पर, यह ऐप्लिकेशन से मिली कार्रवाई स्ट्रिंग. SipDemo में, यह कार्रवाई स्ट्रिंग android.SipDemo.INCOMING_CALL.

SipDemo से लिया गया कोड का यह हिस्सा दिखाता है कि कैसे SipProfile ऑब्जेक्ट, इन चीज़ों के आधार पर बिना मंज़ूरी वाले इंटेंट से बनाया जाता है कार्रवाई स्ट्रिंग android.SipDemo.INCOMING_CALL. कॉन्टेंट बनाने SipProfile को कॉल आने पर PendingIntent ऑब्जेक्ट ब्रॉडकास्ट करेगा:

KotlinJava
val sipManager: SipManager? by lazy(LazyThreadSafetyMode.NONE) {
   
SipManager.newInstance(this)
}

var sipProfile: SipProfile? = null
...

val intent = Intent("android.SipDemo.INCOMING_CALL")
val pendingIntent: PendingIntent = PendingIntent.getBroadcast(this, 0, intent, Intent.FILL_IN_DATA)
sipManager
?.open (sipProfile, pendingIntent, null)
public SipManager sipManager = null;
public SipProfile sipProfile = null;
...

Intent intent = new Intent();
intent
.setAction("android.SipDemo.INCOMING_CALL");
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, Intent.FILL_IN_DATA);
sipManager
.open(sipProfile, pendingIntent, null);

ब्रॉडकास्ट को इंटेंट फ़िल्टर की मदद से रोका जाएगा. इसके बाद, यह फ़ायर हो जाएगा पाने वाला (IncomingCallReceiver). आपके पास कोई इंटेंट तय करने का विकल्प है अपने ऐप्लिकेशन की मेनिफ़ेस्ट फ़ाइल में फ़िल्टर लगाएं या उसे SipDemo की तरह कोड में करें ऐप्लिकेशन की onCreate() तरीके का सैंपल आवेदन के Activity में से.

KotlinJava
class WalkieTalkieActivity : Activity(), View.OnTouchListener {
   
...
    lateinit
var callReceiver: IncomingCallReceiver
   
...

   
override fun onCreate(savedInstanceState: Bundle) {
       
val filter = IntentFilter().apply {
            addAction
("android.SipDemo.INCOMING_CALL")
       
}
        callReceiver
= IncomingCallReceiver()
       
this.registerReceiver(callReceiver, filter)
       
...
   
}
   
...
}
public class WalkieTalkieActivity extends Activity implements View.OnTouchListener {
...
   
public IncomingCallReceiver callReceiver;
   
...

   
@Override
   
public void onCreate(Bundle savedInstanceState) {

       
IntentFilter filter = new IntentFilter();
       filter
.addAction("android.SipDemo.INCOMING_CALL");
       callReceiver
= new IncomingCallReceiver();
       
this.registerReceiver(callReceiver, filter);
       
...
   
}
   
...
}

SIP ऐप्लिकेशन का परीक्षण किया जा रहा है

SIP ऐप्लिकेशन की जांच करने के लिए, आपको इनकी ज़रूरत होगी:

  • Android 2.3 या इसके बाद वाले वर्शन पर चलने वाला मोबाइल डिवाइस. SIP चालू है इसलिए, आपको किसी असल डिवाइस पर टेस्ट करना होगा. एवीडी पर टेस्ट करने से काम नहीं होगा.
  • SIP खाता. SIP की सेवा देने वाली कई अलग-अलग कंपनियां, SIP खाते उपलब्ध कराती हैं.
  • कॉल करने के लिए, यह ज़रूरी है कि वह किसी मान्य SIP खाते से जुड़ा हो.

किसी SIP ऐप्लिकेशन की जांच करने के लिए:

  1. अपने डिवाइस को वायरलेस से कनेक्ट करें (सेटिंग > वायरलेस और नेटवर्क &gt; वाई-फ़ाई > वाई-फ़ाई की सेटिंग).
  2. डिवाइस पर डेवलप करना में बताए गए तरीके से, अपने मोबाइल डिवाइस को जांच के लिए सेट अप करें.
  3. डिवाइस पर डेवलप करना में बताए गए तरीके से, अपने ऐप्लिकेशन को मोबाइल डिवाइस पर चलाएं.
  4. अगर Android Studio का इस्तेमाल किया जा रहा है, तो ऐप्लिकेशन का लॉग आउटपुट इवेंट लॉग कंसोल खोलें (व्यू > टूल Windows > इवेंट लॉग).
  5. पक्का करें कि आपका ऐप्लिकेशन इस तरह से कॉन्फ़िगर किया गया हो कि इसके चलने पर Logcat अपने-आप लॉन्च हो जाए:
    1. Run > कॉन्फ़िगरेशन में बदलाव करना.
    2. रन/डीबग कॉन्फ़िगरेशन विंडो में, अन्य टैब चुनें.
    3. Logcat में जाकर, लॉगकैट अपने-आप दिखाएं चुनें और फिर ठीक है को चुनें.