ই-সিম ও সিম কার্ড শনাক্ত করা
কার্ড শনাক্ত করা হচ্ছে
সিম কার্ড ও eSIM সহ Android ডিভাইস টেলিফোনি API-তে নিম্নলিখিত আইডি ব্যবহার করে, যার মধ্যে [`TelephonyManager`](/reference/android/telephony/TelephonyManager) ও [`SubscriptionManager`](/reference/android/telephony/SubscriptionManager) অন্তর্ভুক্ত: * সাবস্ক্রিপশন আইডি: মোবাইল সাবস্ক্রিপশনের জন্য অনন্য আইডি। * লজিক্যাল স্লট ইনডেক্স বা আইডি: লজিক্যাল সিম স্লটকে রেফার করে এমন অনন্য ইনডেক্স। লজিক্যাল স্লট আইডি ০ থেকে শুরু হয় এবং ডিভাইসে যতগুলি অ্যাক্টিভ স্লট কাজ করে তার উপর নির্ভর করে বাড়ে। যেমন, ডুয়াল সিম ডিভাইসে সাধারণত স্লট ০ ও স্লট ১ থাকে। কোনও ডিভাইসে একাধিক ফিজিক্যাল স্লট থাকলেও যদি শুধুমাত্র একটি অ্যাক্টিভ স্লট কাজ করে, তাহলে সেটিতে শুধুমাত্র লজিক্যাল স্লট আইডি 0 থাকবে। * ফিজিক্যাল স্লট ইনডেক্স বা আইডি: ফিজিক্যাল সিম স্লটকে রেফার করে এমন অনন্য ইনডেক্স। ফিজিক্যাল স্লট আইডি ০ থেকে শুরু হয় এবং ডিভাইসে ফিজিক্যাল স্লটের সংখ্যার উপর নির্ভর করে বৃদ্ধি পায়। এটি কোনও ডিভাইসের লজিক্যাল স্লটের সংখ্যা থেকে আলাদা, যা কোনও ডিভাইস ব্যবহার করতে সক্ষম এমন অ্যাক্টিভ স্লটের সংখ্যার সাথে সম্পর্কিত। যেমন, ডুয়াল-সিম ও সিঙ্গল-সিম মোডের মধ্যে পরিবর্তন করে এমন ডিভাইসে সবসময় দুটি ফিজিক্যাল স্লট থাকতে পারে, কিন্তু সিঙ্গল-সিম মোডে এতে শুধুমাত্র একটি লজিক্যাল স্লট থাকবে। * কার্ড আইডি: UiccCard শনাক্ত করার জন্য ব্যবহৃত অনন্য আইডি।  উপরের ডায়াগ্রামে: * ডিভাইসে দুটি লজিক্যাল স্লট আছে। * ফিজিক্যাল স্লট ০-তে অ্যাক্টিভ প্রোফাইল সহ একটি ফিজিক্যাল UICC কার্ড আছে। * ফিজিক্যাল স্লট ২-এ অ্যাক্টিভ প্রোফাইল সহ eUICC আছে। * ফিজিক্যাল স্লট ১ বর্তমানে ব্যবহার করা হচ্ছে না।  উপরের ডায়াগ্রামে: * ডিভাইসে তিনটি লজিক্যাল স্লট আছে। * ফিজিক্যাল স্লট ০-তে অ্যাক্টিভ প্রোফাইল সহ একটি ফিজিক্যাল UICC কার্ড আছে। * ফিজিক্যাল স্লট ১-এ একটি eUICC আছে যাতে দুটি ডাউনলোড করা প্রোফাইল আছে, দুটিই MEP (একাধিক চালু করা প্রোফাইল) ব্যবহার করে অ্যাক্টিভ আছে।
সেশন ইনিশিয়েশন প্রোটোকল ওভারভিউ
Android এমন একটি API প্রদান করে যা Session Initiation Protocol (SIP)-এর সাথে কাজ করে। এটি আপনাকে অ্যাপ্লিকেশনে SIP-ভিত্তিক ইন্টারনেট টেলিফোনি ফিচার যোগ করতে দেয়। Android-এ সম্পূর্ণ SIP প্রোটোকল স্ট্যাক এবং ইন্টিগ্রেটেড কল ম্যানেজমেন্ট পরিষেবা অন্তর্ভুক্ত থাকে যা সেশন, ট্রান্সপোর্ট-লেভেল কমিউনিকেশন বা অডিও রেকর্ড বা প্লেব্যাক সরাসরি ম্যানেজ না করেই অ্যাপ্লিকেশনকে সহজেই আউটগোয়িং এবং ইনকামিং ভয়েস কল সেট-আপ করতে দেয়।
SIP API ব্যবহার করতে পারে এমন ধরনের অ্যাপ্লিকেশনের উদাহরণ এখানে দেওয়া হল:
- ভিডিও কনফারেন্সিং
- তাত্ক্ষণিক বার্তাপ্রেরণ
প্রয়োজনীয়তা ও সীমাবদ্ধতা
SIP অ্যাপ্লিকেশন ডেভেলপ করার জন্য প্রয়োজনীয়তা এখানে দেওয়া হল:
- আপনার মোবাইল ডিভাইসে Android 2.3 বা তার পরবর্তী যেকোনও ভার্সন থাকতে হবে।
- SIP ওয়্যারলেস ডেটা কানেকশনের মাধ্যমে চলে, তাই আপনার ডিভাইসে ডেটা কানেকশন (মোবাইল ডেটা পরিষেবা বা ওয়াই-ফাইয়ের মাধ্যমে) থাকতে হবে। এর অর্থ হল, আপনি AVD-তে পরীক্ষা করতে পারবেন না—আপনি শুধুমাত্র ফিজিক্যাল ডিভাইসে পরীক্ষা করতে পারবেন। আরও বিবরণের জন্য, SIP অ্যাপ্লিকেশন পরীক্ষা করা দেখুন।
- অ্যাপ্লিকেশনের কমিউনিকেশন সেশনে অংশগ্রহণকারী প্রত্যেক ব্যক্তির একটি করে SIP অ্যাকাউন্ট থাকতে হবে। অনেক SIP পরিষেবা প্রদানকারী আছে যারা SIP অ্যাকাউন্ট অফার করে।
মনে রাখবেন: android.net.sip লাইব্রেরিতে ভিডিও কল
কাজ করে না। আপনি যদি
android.net.sip-এর মতো SIP স্ট্যাক ব্যবহার করে VOIP কলিং প্রয়োগ করতে চান, তাহলে যেকোনও VOIP কলিং প্রয়োগের ভিত্তি হিসেবে অনেক আধুনিক ওপেন সোর্স
বিকল্পের মধ্যে একটি দেখুন। বিকল্প হিসেবে,
আপনি
ConnectionService
API প্রয়োগ করতে পারেন যাতে ডিভাইসের ডায়ালার অ্যাপে এইসব কল আরও ভালোভাবে ইন্টিগ্রেট করা যায়।
SIP API ক্লাস ও ইন্টারফেস
এখানে ক্লাস এবং একটি ইন্টারফেসের (SipRegistrationListener) সারসংক্ষেপ দেওয়া হল যা Android SIP API-তে অন্তর্ভুক্ত:
| ক্লাস/ইন্টারফেস | বর্ণনা |
|---|---|
SipAudioCall |
SIP-এর মাধ্যমে ইন্টারনেট অডিও কল ম্যানেজ করে। |
SipAudioCall.Listener |
SIP কলের সাথে সম্পর্কিত ইভেন্টের জন্য লিসেনার, যেমন কল রিসিভ করার সময় ("রিং হওয়ার সময়") বা কল করার সময় ("কল করার সময়")। |
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_SIPandroid.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" />
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 ইনস্ট্যান্টিয়েট করেন:
Kotlin
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 অ্যাপ্লিকেশন লোকাল SipProfile-এর মাধ্যমে SIP সার্ভারে লগ-ইন করলে, এটি আপনার SIP অ্যাড্রেসের জন্য SIP কল পাঠানোর লোকেশন হিসেবে
ডিভাইসটিকে কার্যকরভাবে রেজিস্টার করে।
এই বিভাগে দেখানো হয়েছে যে কীভাবে SipProfile তৈরি করতে হয়,
SIP সার্ভারের সাথে এটি রেজিস্টার করতে হয় এবং রেজিস্ট্রেশন ইভেন্ট ট্র্যাক করতে হয়।
আপনি নিম্নলিখিত উপায়ে একটি SipProfile অবজেক্ট তৈরি করেন:
Kotlin
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 সেট করে, যা ডিভাইস কল রিসিভ করলে ইনটেন্ট
ফিল্টার দ্বারা ব্যবহার করা হবে (কল রিসিভ করার জন্য
ইনটেন্ট ফিল্টার সেট-আপ করা দেখুন)। এটি হল রেজিস্ট্রেশনের ধাপ:
Kotlin
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 পরিষেবা প্রদানকারীর সাথে সফলভাবে রেজিস্টার করা হয়েছে কিনা:
Kotlin
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."); } }
আপনার অ্যাপ্লিকেশন কোনও প্রোফাইল ব্যবহার করা শেষ করলে, মেমরিতে সংশ্লিষ্ট অবজেক্ট খালি করতে এবং সার্ভার থেকে ডিভাইসটি আনরেজিস্টার করতে এটি বন্ধ করা উচিত। যেমন:
Kotlin
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 কীভাবে জিনিসগুলি সেট আপ করে:
Kotlin
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থেকে কল ইভেন্ট শোনার জন্যSipAudioCall.Listener। এটিnullহতে পারে, তবে উপরে যেমন দেখানো হয়েছে, কল স্থাপিত হওয়ার পরে জিনিস সেট-আপ করতে লিসেনার ব্যবহার করা হয়।- টাইমআউট ভ্যালু, সেকেন্ডে।
যেমন:
Kotlin
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 কল ম্যানেজ করে এবং কল রিসিভ করলে "ইনকামিং
কল" ইনটেন্ট (অ্যাপ্লিকেশন দ্বারা সংজ্ঞায়িত) ব্রডকাস্ট করে। এখানে SipDemo স্যাম্পেল থেকে
সাবক্লাস করা BroadcastReceiver কোড দেওয়া হল।
Kotlin
/** * 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 অবজেক্ট ব্রডকাস্ট করবে:
Kotlin
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 স্যাম্পেল অ্যাপ্লিকেশনের Activity-এর onCreate() পদ্ধতিতে কোডে এটি করতে পারেন:
Kotlin
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 ওয়্যারলেস নেটওয়ার্কে রান করে, তাই আপনাকে অবশ্যই একটি আসল ডিভাইসে পরীক্ষা করতে হবে। AVD-তে টেস্ট করা যাবে না।
- একটি SIP অ্যাকাউন্ট। অনেক SIP পরিষেবা প্রদানকারী আছে যারা SIP অ্যাকাউন্ট অফার করে।
- আপনি কল করলে, সেটিও সঠিক SIP অ্যাকাউন্টে করতে হবে।
SIP অ্যাপ্লিকেশন টেস্ট করতে:
- আপনার ডিভাইসে, ওয়্যারলেস নেটওয়ার্কে কানেক্ট করুন (সেটিংস > ওয়্যারলেস ও নেটওয়ার্ক > ওয়াই-ফাই > ওয়াই-ফাই সেটিংস)।
- ডিভাইসে ডেভেলপ করা বিভাগে যেভাবে বর্ণনা করা হয়েছে সেই অনুযায়ী আপনার মোবাইল ডিভাইস টেস্টিংয়ের জন্য সেট-আপ করুন।
- ডিভাইসে ডেভেলপ করা বিভাগে যেভাবে বর্ণনা করা হয়েছে, সেইভাবে আপনার মোবাইল ডিভাইসে অ্যাপ্লিকেশন রান করুন।
- আপনি Android Studio ব্যবহার করলে, ইভেন্ট লগ কনসোল (দেখুন > টুল উইন্ডো > ইভেন্ট লগ) খুলে অ্যাপ্লিকেশন লগ আউটপুট দেখতে পারবেন।
- আপনার অ্যাপ্লিকেশনটি রান করার সময় Logcat অটোমেটিক চালু করার জন্য কনফিগার করা হয়েছে কিনা তা নিশ্চিত করুন:
- রান করুন > কনফিগারেশন এডিট করুন বিকল্প বেছে নিন।
- রান/ডিবাগ কনফিগারেশন উইন্ডোতে বিবিধ ট্যাব বেছে নিন।
- Logcat বিকল্পের মধ্যে, অটোমেটিক Logcat দেখুন বিকল্প বেছে নিন, তারপর ঠিক আছে বিকল্প বেছে নিন।