eSIM এবং SIM কার্ড শনাক্ত করুন
কার্ড সনাক্তকরণ
SIM কার্ড এবং eSIM সহ Android ডিভাইসগুলি [`TelephonyManager`](/reference/android/telephony/TelephonyManager) এবং [`SubscriptionManager`](/reference/android/telephony/SubscriptionManager) সহ টেলিফোনি API-এ নিম্নলিখিত আইডিগুলি ব্যবহার করে: * সাবস্ক্রিপশন আইডি: একটি মোবাইল সাবস্ক্রিপশনের জন্য অনন্য আইডি। * লজিক্যাল স্লট সূচক বা আইডি: একটি লজিক্যাল সিম স্লটের উল্লেখ করে অনন্য সূচক। লজিক্যাল স্লট আইডিগুলি 0 থেকে শুরু হয় এবং একটি ডিভাইসে সমর্থিত সক্রিয় স্লটের সংখ্যার উপর নির্ভর করে উপরে যায়। উদাহরণস্বরূপ, একটি ডুয়াল-সিম ডিভাইসে সাধারণত স্লট 0 এবং স্লট 1 থাকে। যদি একটি ডিভাইসে একাধিক শারীরিক স্লট থাকে কিন্তু শুধুমাত্র একটি সক্রিয় স্লট সমর্থন করে, তবে এটিতে শুধুমাত্র লজিক্যাল স্লট আইডি 0 থাকবে। * ফিজিক্যাল স্লট সূচক বা আইডি: অনন্য সূচক উল্লেখ করে একটি ফিজিক্যাল সিম স্লটে। ভৌত স্লট আইডিগুলি 0 থেকে শুরু হয় এবং ডিভাইসে শারীরিক স্লটের সংখ্যার উপর নির্ভর করে উপরে যায়৷ এটি একটি ডিভাইসের যৌক্তিক স্লটের সংখ্যা থেকে পৃথক, যা একটি ডিভাইস ব্যবহার করতে সক্ষম সক্রিয় স্লটের সংখ্যার সাথে মিলে যায়। উদাহরণস্বরূপ, একটি ডিভাইস যা ডুয়াল-সিম এবং সিঙ্গেল-সিম মোডের মধ্যে স্যুইচ করে তার সবসময় দুটি ফিজিক্যাল স্লট থাকতে পারে, কিন্তু সিঙ্গেল-সিম মোডে এটি শুধুমাত্র একটি লজিক্যাল স্লট থাকবে। * কার্ড আইডি: ইউনিক আইডি একটি UiccCard সনাক্ত করতে ব্যবহৃত হয়। ![দুটি লজিক্যাল স্লট এবং তিনটি ফিজিক্যাল স্লট সহ একটি ক্ষেত্রে আইডি কীভাবে ব্যবহার করা হয় তার একটি চিত্র](/images/guide/topics/connectivity/tel-ids.png) উপরের চিত্রে: * ডিভাইসটিতে দুটি লজিক্যাল স্লট রয়েছে। * ফিজিক্যাল স্লট 0-এ একটি সক্রিয় প্রোফাইল সহ একটি ফিজিক্যাল UICC কার্ড রয়েছে। * শারীরিক স্লট 2-এ একটি সক্রিয় প্রোফাইল সহ একটি eUICC। * ভৌত স্লট 1 বর্তমানে ব্যবহার করা হচ্ছে না। ! স্লট * ফিজিক্যাল স্লট 0-এ একটি সক্রিয় প্রোফাইল সহ একটি ফিজিক্যাল UICC কার্ড রয়েছে। * ফিজিক্যাল স্লটে 1 হল একটি eUICC যার দুটি ডাউনলোড করা প্রোফাইল রয়েছে, উভয়ই MEP (একাধিক সক্রিয় প্রোফাইল) ব্যবহার করে সক্রিয়।
সেশন সূচনা প্রোটোকল ওভারভিউ
অ্যান্ড্রয়েড একটি API প্রদান করে যা সেশন ইনিশিয়েশন প্রোটোকল (SIP) সমর্থন করে। এটি আপনাকে আপনার অ্যাপ্লিকেশনগুলিতে SIP-ভিত্তিক ইন্টারনেট টেলিফোনি বৈশিষ্ট্যগুলি যোগ করতে দেয়৷ অ্যান্ড্রয়েডে একটি সম্পূর্ণ SIP প্রোটোকল স্ট্যাক এবং ইন্টিগ্রেটেড কল ম্যানেজমেন্ট পরিষেবা রয়েছে যা অ্যাপ্লিকেশনগুলিকে সেশন, পরিবহন-স্তরের যোগাযোগ, বা সরাসরি অডিও রেকর্ড বা প্লেব্যাক পরিচালনা না করে সহজেই আউটগোয়িং এবং ইনকামিং ভয়েস কল সেট আপ করতে দেয়।
এখানে SIP API ব্যবহার করতে পারে এমন অ্যাপ্লিকেশনের ধরনের উদাহরণ রয়েছে:
- ভিডিও কনফারেন্সিং
- ইনস্ট্যান্ট মেসেজিং
প্রয়োজনীয়তা এবং সীমাবদ্ধতা
এখানে একটি SIP অ্যাপ্লিকেশন বিকাশের প্রয়োজনীয়তা রয়েছে:
- আপনার অবশ্যই একটি মোবাইল ডিভাইস থাকতে হবে যা Android 2.3 বা তার বেশি চলমান।
- SIP একটি ওয়্যারলেস ডেটা সংযোগের মাধ্যমে চলে, তাই আপনার ডিভাইসের একটি ডেটা সংযোগ থাকতে হবে (একটি মোবাইল ডেটা পরিষেবা বা Wi-Fi সহ)। এর মানে হল আপনি AVD-তে পরীক্ষা করতে পারবেন না—আপনি শুধুমাত্র একটি শারীরিক ডিভাইসে পরীক্ষা করতে পারেন। বিস্তারিত জানার জন্য, এসআইপি অ্যাপ্লিকেশন পরীক্ষা করা দেখুন।
- আবেদনের যোগাযোগ সেশনে প্রতিটি অংশগ্রহণকারীর অবশ্যই একটি SIP অ্যাকাউন্ট থাকতে হবে। SIP অ্যাকাউন্টগুলি অফার করে এমন অনেকগুলি বিভিন্ন SIP প্রদানকারী রয়েছে৷
দ্রষ্টব্য: android.net.sip
লাইব্রেরি ভিডিও কল সমর্থন করে না। আপনি যদি android.net.sip
এর মতো একটি SIP স্ট্যাক ব্যবহার করে VOIP কলিং বাস্তবায়ন করতে চান, তাহলে যেকোনো VOIP কলিং বাস্তবায়নের ভিত্তি হিসাবে অনেকগুলি আধুনিক ওপেন সোর্স বিকল্পগুলির মধ্যে একটি দেখুন৷ বিকল্পভাবে, আপনি ডিভাইসের ডায়ালার অ্যাপে এই কলগুলির একটি শক্ত ইন্টিগ্রেশন প্রদান করতে ConnectionService
API প্রয়োগ করতে পারেন।
SIP API ক্লাস এবং ইন্টারফেস
এখানে ক্লাসের একটি সারাংশ এবং একটি ইন্টারফেস ( SipRegistrationListener
) যা অ্যান্ড্রয়েড এসআইপি এপিআইতে অন্তর্ভুক্ত রয়েছে:
ক্লাস/ইন্টারফেস | বর্ণনা |
---|---|
SipAudioCall | SIP এর মাধ্যমে একটি ইন্টারনেট অডিও কল পরিচালনা করে। |
SipAudioCall.Listener | একটি এসআইপি কল সম্পর্কিত ইভেন্টগুলির জন্য শ্রোতা, যেমন যখন একটি কল রিসিভ করা হচ্ছে ("অন রিংিং") বা একটি কল আউটগোয়িং ("কলিংয়ে")। |
SipErrorCode | SIP ক্রিয়াকলাপের সময় ফেরত আসা ত্রুটি কোডগুলিকে সংজ্ঞায়িত করে৷ |
SipManager | SIP কাজের জন্য API প্রদান করে, যেমন SIP সংযোগ শুরু করা, এবং সম্পর্কিত SIP পরিষেবাগুলিতে অ্যাক্সেস প্রদান করে। |
SipProfile | একটি SIP অ্যাকাউন্ট, ডোমেন এবং সার্ভারের তথ্য সহ একটি SIP প্রোফাইল সংজ্ঞায়িত করে৷ |
SipProfile.Builder | একটি SipProfile তৈরির জন্য সহায়ক শ্রেণী। |
SipSession | একটি SIP সেশনের প্রতিনিধিত্ব করে যা একটি SIP ডায়ালগ বা একটি স্বতন্ত্র লেনদেনের সাথে সম্পর্কিত যা একটি ডায়ালগের মধ্যে নয়৷ |
SipSession.Listener | একটি SIP সেশন সম্পর্কিত ইভেন্টগুলির জন্য শ্রোতা, যেমন যখন একটি সেশন নিবন্ধিত হচ্ছে ("রেজিস্টার করা হচ্ছে") বা একটি কল আউটগোয়িং ("কলিংয়ে")। |
SipSession.State | SIP সেশন স্টেট সংজ্ঞায়িত করে, যেমন "রেজিস্টার করা", "আউটগোয়িং কল", এবং "ইন কল"। |
SipRegistrationListener | একটি ইন্টারফেস যা SIP নিবন্ধন ইভেন্টগুলির জন্য একটি শ্রোতা। |
ম্যানিফেস্ট তৈরি করা
আপনি যদি SIP API ব্যবহার করে এমন একটি অ্যাপ্লিকেশন তৈরি করছেন, মনে রাখবেন যে বৈশিষ্ট্যটি শুধুমাত্র Android 2.3 (API স্তর 9) এবং প্ল্যাটফর্মের উচ্চতর সংস্করণে সমর্থিত। এছাড়াও, Android 2.3 (API স্তর 9) বা উচ্চতর চলমান ডিভাইসগুলির মধ্যে, সমস্ত ডিভাইস SIP সমর্থন অফার করবে না।
SIP ব্যবহার করতে, আপনার অ্যাপ্লিকেশনের ম্যানিফেস্টে নিম্নলিখিত অনুমতিগুলি যোগ করুন:
-
android.permission.USE_SIP
-
android.permission.INTERNET
আপনার অ্যাপ্লিকেশন শুধুমাত্র SIP সমর্থন করতে সক্ষম এমন ডিভাইসগুলিতে ইনস্টল করা যেতে পারে তা নিশ্চিত করতে, আপনার অ্যাপ্লিকেশনের ম্যানিফেস্টে নিম্নলিখিত যোগ করুন:
<uses-sdk android:minSdkVersion="9" />
এটি ইঙ্গিত করে যে আপনার অ্যাপ্লিকেশনটির জন্য Android 2.3 বা উচ্চতর সংস্করণ প্রয়োজন৷ আরও তথ্যের জন্য, API লেভেল এবং <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" />
এখানে সিপডেমো ম্যানিফেস্ট থেকে উদ্ধৃতাংশ রয়েছে:
<?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>
সিপ ম্যানেজার তৈরি করা হচ্ছে
SIP API ব্যবহার করতে, আপনার অ্যাপ্লিকেশনটিকে অবশ্যই একটি SipManager
অবজেক্ট তৈরি করতে হবে। আপনার আবেদনে SipManager
নিম্নলিখিত বিষয়গুলির যত্ন নেয়:
- এসআইপি সেশন শুরু করা হচ্ছে।
- কল শুরু করা এবং গ্রহণ করা।
- একটি SIP প্রদানকারীর সাথে নিবন্ধন এবং নিবন্ধনমুক্ত করা।
- সেশন সংযোগ যাচাই করা হচ্ছে।
আপনি নিম্নরূপ একটি নতুন SipManager
তাত্ক্ষণিক করুন:
কোটলিন
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 অ্যাপ্লিকেশন স্থানীয় SipProfile
এর সাথে SIP সার্ভারে লগ ইন করে, তখন এটি কার্যকরভাবে ডিভাইসটিকে আপনার SIP ঠিকানার জন্য SIP কল পাঠানোর অবস্থান হিসাবে নিবন্ধিত করে।
এই বিভাগটি দেখায় কিভাবে একটি SipProfile
তৈরি করতে হয়, এটি একটি SIP সার্ভারের সাথে নিবন্ধন করতে হয় এবং নিবন্ধীকরণ ইভেন্টগুলি ট্র্যাক করতে হয়।
আপনি নিম্নরূপ একটি SipProfile
অবজেক্ট তৈরি করুন:
কোটলিন
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();
নিম্নলিখিত কোডের উদ্ধৃতিটি কল করা এবং/অথবা জেনেরিক এসআইপি কল গ্রহণের জন্য স্থানীয় প্রোফাইল খোলে। কলার mSipManager.makeAudioCall
এর মাধ্যমে পরবর্তী কল করতে পারে। এই উদ্ধৃতিটি android.SipDemo.INCOMING_CALL
অ্যাকশনও সেট করে, যেটি একটি ইন্টেন্ট ফিল্টার দ্বারা ব্যবহার করা হবে যখন ডিভাইসটি একটি কল রিসিভ করবে ( কল রিসিভ করার জন্য একটি ইন্টেন্ট ফিল্টার সেট আপ করা দেখুন)৷ এটি নিবন্ধন ধাপ:
কোটলিন
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 পরিষেবা প্রদানকারীর সাথে নিবন্ধিত হয়েছে কিনা:
কোটলিন
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."); } }
যখন আপনার অ্যাপ্লিকেশনটি একটি প্রোফাইল ব্যবহার করে সম্পন্ন করা হয়, তখন এটিকে মেমরিতে সংযুক্ত বস্তুগুলিকে মুক্ত করতে এটি বন্ধ করা উচিত এবং সার্ভার থেকে ডিভাইসটিকে নিবন্ধনমুক্ত করা উচিত। যেমন:
কোটলিন
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
যা কল করছে ("স্থানীয় প্রোফাইল"), এবং কলটি গ্রহণ করার জন্য একটি বৈধ এসআইপি ঠিকানা ("পিয়ার প্রোফাইল")। - একটি
SipManager
অবজেক্ট।
একটি অডিও কল করতে, আপনাকে একটি SipAudioCall.Listener
সেট আপ করতে হবে। SIP স্ট্যাকের সাথে ক্লায়েন্টের বেশিরভাগ মিথস্ক্রিয়া শ্রোতাদের মাধ্যমে ঘটে। এই স্নিপেটে, আপনি দেখতে পাচ্ছেন কিভাবে SipAudioCall.Listener
কল স্থাপনের পরে জিনিসগুলি সেট আপ করে:
কোটলিন
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 প্রোফাইল (কলার)।
- একটি পিয়ার এসআইপি প্রোফাইল (ব্যবহারকারীকে বলা হচ্ছে)।
- একটি
SipAudioCall.Listener
থেকে কল ইভেন্টগুলি শোনার জন্য শ্রোতাSipAudioCall
এটিnull
হতে পারে, কিন্তু উপরে দেখানো হিসাবে, শ্রোতা কলটি প্রতিষ্ঠিত হয়ে গেলে জিনিসগুলি সেট আপ করতে ব্যবহৃত হয়। - সময়সীমার মান, সেকেন্ডে।
যেমন:
কোটলিন
val call: SipAudioCall? = sipManager?.makeAudioCall( sipProfile?.uriString, sipAddress, listener, 30 )
জাভা
call = sipManager.makeAudioCall(sipProfile.getUriString(), sipAddress, listener, 30);
কল রিসিভ করা হচ্ছে
কল রিসিভ করার জন্য, একটি SIP অ্যাপ্লিকেশনে অবশ্যই BroadcastReceiver
এর একটি সাবক্লাস অন্তর্ভুক্ত করতে হবে যেটিতে একটি ইনকামিং কল আছে তা ইঙ্গিত করে একটি অভিপ্রায়ে সাড়া দেওয়ার ক্ষমতা রয়েছে। সুতরাং, আপনার আবেদনে আপনাকে অবশ্যই নিম্নলিখিতগুলি করতে হবে:
-
AndroidManifest.xml
এ, একটি<receiver>
ঘোষণা করুন। সিপডেমোতে , এটি হল<receiver android:name=".IncomingCallReceiver" android:label="Call Receiver" />
- রিসিভার প্রয়োগ করুন, যা
BroadcastReceiver
এর একটি সাবক্লাস। সিপডেমোতে , এটিIncomingCallReceiver
। - একটি মুলতুবি অভিপ্রায় সহ স্থানীয় প্রোফাইল (
SipProfile
) আরম্ভ করুন যা কেউ স্থানীয় প্রোফাইলে কল করলে আপনার রিসিভারকে বরখাস্ত করে। - একটি ইনটেন্ট ফিল্টার সেট আপ করুন যা একটি ইনকামিং কলের প্রতিনিধিত্ব করে এমন ক্রিয়া দ্বারা ফিল্টার করে৷ সিপডেমোতে , এই অ্যাকশনটি হল
android.SipDemo.INCOMING_CALL
।
সাবক্লাসিং ব্রডকাস্ট রিসিভার
কল রিসিভ করার জন্য, আপনার SIP অ্যাপ্লিকেশনকে অবশ্যই BroadcastReceiver
সাবক্লাস করতে হবে। অ্যান্ড্রয়েড সিস্টেম ইনকামিং এসআইপি কলগুলি পরিচালনা করে এবং একটি "আগত কল" সম্প্রচার করে অভিপ্রায় (অ্যাপ্লিকেশন দ্বারা সংজ্ঞায়িত) যখন এটি একটি কল পায়। এখানে SipDemo নমুনা থেকে উপশ্রেণীর
BroadcastReceiver
কোড আছে।
কোটলিন
/** * 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 পরিষেবা একটি নতুন কল পায়, তখন এটি অ্যাপ্লিকেশন দ্বারা প্রদত্ত অ্যাকশন স্ট্রিং সহ একটি অভিপ্রায় পাঠায়৷ সিপডেমোতে, এই অ্যাকশন স্ট্রিংটি হল android.SipDemo.INCOMING_CALL
।
SipDemo থেকে এই কোড উদ্ধৃতি দেখায় কিভাবে SipProfile
অবজেক্টটি অ্যাকশন স্ট্রিং android.SipDemo.INCOMING_CALL
এর উপর ভিত্তি করে একটি মুলতুবি অভিপ্রায়ে তৈরি হয়। PendingIntent
অবজেক্ট একটি সম্প্রচার করবে যখন SipProfile
একটি কল পাবে:
কোটলিন
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
) ফায়ার করবে। আপনি আপনার অ্যাপ্লিকেশনের ম্যানিফেস্ট ফাইলে একটি অভিপ্রায় ফিল্টার নির্দিষ্ট করতে পারেন, অথবা অ্যাপ্লিকেশনটির Activity
SipDemo নমুনা অ্যাপ্লিকেশনের onCreate()
পদ্ধতির মতো কোডে এটি করতে পারেন:
কোটলিন
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); ... } ... }
এসআইপি অ্যাপ্লিকেশন পরীক্ষা করা হচ্ছে
এসআইপি অ্যাপ্লিকেশন পরীক্ষা করার জন্য, আপনার নিম্নলিখিতগুলি প্রয়োজন:
- একটি মোবাইল ডিভাইস যেটি Android 2.3 বা উচ্চতর সংস্করণে চলছে৷ SIP ওয়্যারলেসের মাধ্যমে চলে, তাই আপনাকে অবশ্যই একটি প্রকৃত ডিভাইসে পরীক্ষা করতে হবে। AVD তে পরীক্ষা করা কাজ করবে না।
- একটি SIP অ্যাকাউন্ট। SIP অ্যাকাউন্টগুলি অফার করে এমন অনেকগুলি বিভিন্ন SIP প্রদানকারী রয়েছে৷
- আপনি যদি একটি কল করেন তবে এটি অবশ্যই একটি বৈধ SIP অ্যাকাউন্টে হতে হবে৷
একটি SIP অ্যাপ্লিকেশন পরীক্ষা করতে:
- আপনার ডিভাইসে, ওয়্যারলেস ( সেটিংস > ওয়্যারলেস এবং নেটওয়ার্ক > ওয়াই-ফাই > ওয়াই-ফাই সেটিংস ) সংযোগ করুন।
- আপনার মোবাইল ডিভাইসটি পরীক্ষার জন্য সেট আপ করুন, যেমনটি Developing on a Device এ বর্ণিত।
- আপনার মোবাইল ডিভাইসে আপনার অ্যাপ্লিকেশন চালান, যেমনটি Developing on a Device এ বর্ণিত।
- আপনি যদি অ্যান্ড্রয়েড স্টুডিও ব্যবহার করেন, আপনি ইভেন্ট লগ কনসোল ( দেখুন > টুল উইন্ডোজ > ইভেন্ট লগ ) খুলে অ্যাপ্লিকেশন লগ আউটপুট দেখতে পারেন।
- আপনার অ্যাপ্লিকেশানটি যখন চলে তখন স্বয়ংক্রিয়ভাবে Logcat চালু করার জন্য কনফিগার করা হয়েছে তা নিশ্চিত করুন:
- রান > কনফিগারেশন সম্পাদনা নির্বাচন করুন।
- রান/ডিবাগ কনফিগারেশন উইন্ডোতে বিবিধ ট্যাব নির্বাচন করুন।
- লগক্যাটের অধীনে, স্বয়ংক্রিয়ভাবে লগক্যাট দেখান নির্বাচন করুন তারপর ঠিক আছে নির্বাচন করুন।