Core-Telecom
লাইব্রেরি আপনার কলিং অ্যাপ্লিকেশনকে অ্যান্ড্রয়েড প্ল্যাটফর্মের সাথে একীভূত করার প্রক্রিয়াটিকে সুগম করে এবং এপিআইগুলির একটি শক্তিশালী সেট প্রদান করে
আপনি যদি ব্যবহারিক বাস্তবায়নগুলি অন্বেষণ করতে চান, আপনি GitHub-এ নমুনা অ্যাপ্লিকেশনগুলি খুঁজে পেতে পারেন:
- লাইটওয়েট নমুনা অ্যাপ -
Core-Telecom
এপিআই ব্যবহার প্রদর্শনের একটি ন্যূনতম উদাহরণ। মৌলিক ধারণাগুলি দ্রুত বোঝার জন্য আদর্শ। - ব্যাপক নমুনা অ্যাপ (কোর-টেলিকম টিম দ্বারা তৈরি) — উন্নত টেলিকম কার্যকারিতা এবং সর্বোত্তম অনুশীলনগুলি প্রদর্শন করে আরও বৈশিষ্ট্য সমৃদ্ধ অ্যাপ্লিকেশন। জটিল ইন্টিগ্রেশন পরিস্থিতি বোঝার জন্য এটি একটি দুর্দান্ত সম্পদ।
কোর-টেলিকম সেট আপ করুন
আপনার অ্যাপের build.gradle
ফাইলে androidx.core:core-telecom
নির্ভরতা যোগ করুন:
dependencies {
implementation ("androidx.core:core-telecom:1.0.0")
}
আপনার AndroidManifest.xml
এ MANAGE_OWN_CALLS
অনুমতি ঘোষণা করুন:
<uses-permission android:name="android.permission.MANAGE_OWN_CALLS" />
আপনার অ্যাপ নিবন্ধন করুন
সিস্টেমে কল যোগ করা শুরু করতে CallsManager
ব্যবহার করে Android এর সাথে আপনার কলিং অ্যাপ নিবন্ধন করুন। নিবন্ধন করার সময়, আপনার অ্যাপের ক্ষমতা নির্দিষ্ট করুন (উদাহরণস্বরূপ, অডিও, ভিডিও সমর্থন):
val callsManager = CallsManager(context)
val capabilities: @CallsManager.Companion.Capability Int =
(CallsManager.CAPABILITY_BASELINE or
CallsManager.CAPABILITY_SUPPORTS_VIDEO_CALLING)
callsManager.registerAppWithTelecom(capabilities)
কল ব্যবস্থাপনা
একটি কল লাইফসাইকেল তৈরি এবং পরিচালনা করতে Core-Telecom APIs ব্যবহার করুন।
একটি কল তৈরি করুন
CallAttributesCompat
অবজেক্ট একটি অনন্য কলের বৈশিষ্ট্যগুলিকে সংজ্ঞায়িত করে, যার নিম্নলিখিত বৈশিষ্ট্য থাকতে পারে:
-
displayName
: কলার নাম। -
address
: কল ঠিকানা (উদাহরণস্বরূপ, ফোন নম্বর, মিটিং লিঙ্ক)। -
direction
: আগত বা বহির্গামী। -
callType
: অডিও বা ভিডিও। -
callCapabilities
: স্থানান্তর এবং ধরে রাখা সমর্থন করে।
কিভাবে একটি ইনকামিং কল তৈরি করতে হয় তার একটি উদাহরণ এখানে দেওয়া হল:
fun createIncomingCallAttributes(
callerName: String,
callerNumber: String,
isVideoCall: Boolean): CallAttributesCompat {
val addressUri = Uri.parse("YourAppScheme:$callerNumber")
// Define capabilities supported by your call.
val callCapabilities = CallAttributesCompat.CallCapability(
supportsSetInactive = CallAttributesCompat.SUPPORTS_SET_INACTIVE // Call can be made inactive (implies hold)
)
return CallAttributesCompat(
displayName = callerName,
address = addressUri,
direction = CallAttributesCompat.DIRECTION_INCOMING,
callType = if (isVideoCall) CallAttributesCompat.CALL_TYPE_VIDEO_CALL else CallAttributesCompat.CALL_TYPE_AUDIO_CALL,
callCapabilitiesCompat = callCapabilities
)
}
একটি কল যোগ করুন
সিস্টেমে একটি নতুন কল যোগ করতে এবং দূরবর্তী পৃষ্ঠের আপডেটগুলি পরিচালনা করতে CallAttributesCompat
এবং কলব্যাক সহ callsManager.addCall
ব্যবহার করুন৷ addCall
ব্লকের মধ্যে থাকা callControlScope
প্রাথমিকভাবে আপনার অ্যাপটিকে কলের অবস্থা পরিবর্তন করতে এবং অডিও আপডেট পেতে অনুমতি দেয়:
try {
callsManager.addCall(
INCOMING_CALL_ATTRIBUTES,
onAnswerCall, // Watch needs to know if it can answer the call.
onSetCallDisconnected,
onSetCallActive,
onSetCallInactive
) {
// The call was successfully added once this scope runs.
callControlScope = this
}
}
catch(addCallException: Exception){
// Handle the addCall failure.
}
একটি কল উত্তর
CallControlScope
এর মধ্যে একটি ইনকামিং কলের উত্তর দিন:
when (val result = answer(CallAttributesCompat.CALL_TYPE_AUDIO_CALL)) {
is CallControlResult.Success -> { /* Call answered */ }
is CallControlResult.Error -> { /* Handle error */ }
}
একটি কল প্রত্যাখ্যান করুন
DisconnectCause.REJECTED
সাথে disconnect()
ব্যবহার করে একটি কল প্রত্যাখ্যান করুন CallControlScope
মধ্যে REJECTED:
disconnect(DisconnectCause(DisconnectCause.REJECTED))
একটি বহির্গামী কল সক্রিয় করুন
একবার রিমোট পার্টি উত্তর দিলে একটি বহির্গামী কল সক্রিয় করতে সেট করুন:
when (val result = setActive()) {
is CallControlResult.Success -> { /* Call active */ }
is CallControlResult.Error -> { /* Handle error */ }
}
হোল্ডে একটি কল রাখুন
একটি কল হোল্ডে রাখতে setInactive()
ব্যবহার করুন:
when (val result = setInactive()) {
is CallControlResult.Success -> { /* Call on hold */ }
is CallControlResult.Error -> { /* Handle error */ }
}
একটি কল সংযোগ বিচ্ছিন্ন করুন
একটি DisconnectCause
দিয়ে disconnect()
ব্যবহার করে একটি কল সংযোগ বিচ্ছিন্ন করুন:
disconnect(DisconnectCause(DisconnectCause.LOCAL))
কল অডিও এন্ডপয়েন্ট পরিচালনা করুন
CallControlScope
এর মধ্যে currentCallEndpoint
, availableEndpoints
, এবং isMuted
Flow
ব্যবহার করে অডিও এন্ডপয়েন্টগুলি পর্যবেক্ষণ ও পরিচালনা করুন
fun observeAudioStateChanges(callControlScope: CallControlScope) {
with(callControlScope) {
launch { currentCallEndpoint.collect { /* Update UI */ } }
launch { availableEndpoints.collect { /* Update UI */ } }
launch { isMuted.collect { /* Handle mute state */ } }
}
}
requestEndpointChange()
ব্যবহার করে সক্রিয় অডিও ডিভাইস পরিবর্তন করুন:
coroutineScope.launch {
callControlScope.requestEndpointChange(callEndpoint)
}
ফোরগ্রাউন্ড সমর্থন
লাইব্রেরিটি ফোরগ্রাউন্ড সমর্থনের জন্য ConnectionService
(Android 13 API স্তর 33 এবং নিম্ন) বা foregroundtypes (Android 14 API স্তর 34 এবং উচ্চতর) ব্যবহার করে।
ফোরগ্রাউন্ড প্রয়োজনীয়তার অংশ হিসাবে, অ্যাপ্লিকেশনটিকে অবশ্যই একটি বিজ্ঞপ্তি পোস্ট করতে হবে যাতে ব্যবহারকারীরা জানতে পারেন যে অ্যাপ্লিকেশনটি ফোরগ্রাউন্ডে চলছে।
আপনার অ্যাপ ফোরগ্রাউন্ড এক্সিকিউশনের অগ্রাধিকার পায় তা নিশ্চিত করতে, একবার আপনি প্ল্যাটফর্মের সাথে কল যোগ করার পরে একটি বিজ্ঞপ্তি তৈরি করুন। যখন আপনার অ্যাপ কলটি বন্ধ করে দেয় বা আপনার বিজ্ঞপ্তি আর বৈধ থাকে না তখন ফোরগ্রাউন্ড অগ্রাধিকার সরানো হয়।
ফোরগ্রাউন্ড পরিষেবা সম্পর্কে আরও জানুন ।
দূরবর্তী পৃষ্ঠ সমর্থন
দূরবর্তী ডিভাইস (স্মার্টওয়াচ, ব্লুটুথ হেডসেট, অ্যান্ড্রয়েড অটো) সরাসরি ফোন ইন্টারঅ্যাকশন ছাড়াই কল পরিচালনা করতে সক্ষম। এই ডিভাইসগুলি দ্বারা শুরু করা ক্রিয়াগুলি পরিচালনা করতে আপনার অ্যাপটিকে অবশ্যই কলব্যাক ল্যাম্বডাস ( onAnswerCall
, onSetCallDisconnected
, onSetCallActive
, onSetCallInactive
) প্রদান করতে হবে CallsManager.addCall
যখন একটি দূরবর্তী ক্রিয়া ঘটে, তখন সংশ্লিষ্ট ল্যাম্বডাকে আহ্বান করা হয়।
ল্যাম্বডা সিগন্যালের সফল সমাপ্তি যে কমান্ডটি প্রক্রিয়া করা হয়েছিল। যদি আদেশ মান্য করা না যায়, ল্যাম্বদা একটি ব্যতিক্রম নিক্ষেপ করা উচিত.
সঠিক বাস্তবায়ন বিভিন্ন ডিভাইস জুড়ে বিরামহীন কল নিয়ন্ত্রণ নিশ্চিত করে। বিভিন্ন দূরবর্তী পৃষ্ঠের সাথে পুঙ্খানুপুঙ্খভাবে পরীক্ষা করুন।
কল এক্সটেনশন
আপনার কলের কল স্টেট এবং অডিও রুট পরিচালনা করার পাশাপাশি, লাইব্রেরি কল এক্সটেনশনগুলিকেও সমর্থন করে, যেগুলি ঐচ্ছিক বৈশিষ্ট্য যা আপনার অ্যাপটি Android Auto-এর মতো দূরবর্তী সারফেসগুলিতে একটি সমৃদ্ধ কলিং অভিজ্ঞতার জন্য প্রয়োগ করতে পারে৷ এই বৈশিষ্ট্যগুলির মধ্যে রয়েছে মিটিং রুম, কল সাইলেন্স এবং অতিরিক্ত কল আইকন। যখন আপনার অ্যাপ একটি এক্সটেনশন প্রয়োগ করে, অ্যাপটি যে তথ্য প্রদান করে তা সমস্ত সংযুক্ত ডিভাইসের সাথে সিঙ্ক্রোনাইজ করা হবে যা তাদের UI তে এই এক্সটেনশনগুলি প্রদর্শন করতেও সমর্থন করে। এর মানে হল যে এই বৈশিষ্ট্যগুলি ব্যবহারকারীদের সাথে যোগাযোগ করার জন্য দূরবর্তী ডিভাইসগুলিতেও উপলব্ধ হবে।
এক্সটেনশন সহ একটি কল তৈরি করুন
একটি কল তৈরি করার সময়, কল তৈরি করতে CallManager#addCall
ব্যবহার করার পরিবর্তে, আপনি CallManager#addCallWithExtensions ব্যবহার করতে পারেন, যা অ্যাপটিকে ExtensionInitializationScope
নামে একটি ভিন্ন সুযোগে অ্যাক্সেস দেয়। এই সুযোগটি অ্যাপ্লিকেশনটিকে সমর্থন করে এমন ঐচ্ছিক এক্সটেনশনের সেটটি শুরু করতে দেয়। অতিরিক্তভাবে, এই সুযোগটি একটি অতিরিক্ত পদ্ধতি প্রদান করে, onCall
, যা এক্সটেনশন ক্ষমতা বিনিময় এবং প্রাথমিককরণ সম্পূর্ণ হওয়ার পরে অ্যাপে ফিরে একটি CallControlScope
প্রদান করে।
scope.launch {
mCallsManager.addCallWithExtensions(
attributes,
onAnswer,
onDisconnect,
onSetActive,
onSetInactive
) {
// Initialize extension-specific code...
// After the call has been initialized, perform in-call actions
onCall {
// Example: process call state updates
callStateFlow.onEach { newState ->
// handle call state updates and notify telecom
}.launchIn(this)
// Use initialized extensions...
}
}
}
সমর্থন কল অংশগ্রহণকারীদের
আপনার অ্যাপ যদি মিটিং বা গ্রুপ কলের জন্য কল অংশগ্রহণকারীদের সমর্থন করে, তাহলে এই এক্সটেনশনের জন্য সমর্থন ঘোষণা করতে addParticipantExtension
ব্যবহার করুন এবং অংশগ্রহণকারীরা পরিবর্তন হলে দূরবর্তী সারফেস আপডেট করতে সম্পর্কিত API ব্যবহার করুন।
mCallsManager.addCallWithExtensions(...) {
// Initialize extensions...
// Notifies Jetpack that this app supports the participant
// extension and provides the initial participants state in the call.
val participantExtension = addParticipantExtension(
initialParticipants,
initialActiveParticipant
)
// After the call has been initialized, perform in-call control actions
onCall {
// other in-call control and extension actions...
// Example: update remote surfaces when the call participants change
participantsFlow.onEach { newParticipants ->
participantExtension.updateParticipants(newParticipants)
}.launchIn(this)
}
}
কলে অংশগ্রহণকারীরা কী আছে তা দূরবর্তী সারফেসগুলিকে জানানোর পাশাপাশি, সক্রিয় অংশগ্রহণকারীকে ParticipantExtension#updateActiveParticipant
ব্যবহার করে আপডেট করা যেতে পারে।
কল অংশগ্রহণকারীদের সাথে সম্পর্কিত ঐচ্ছিক ক্রিয়াগুলির জন্যও সমর্থন রয়েছে৷ অ্যাপটি অংশগ্রহণকারীদের কলে তাদের হাত তোলার ধারণাকে সমর্থন করার জন্য ParticipantExtension#addRaiseHandSupport
ব্যবহার করতে পারে এবং অন্য কোন অংশগ্রহণকারীরাও তাদের হাত তুলেছে তা দেখতে পারে।
mCallsManager.addCallWithExtensions(...) {
// Initialize extensions...
// Notifies Jetpack that this app supports the participant
// extension and provides the initial list of participants in the call.
val participantExtension = addParticipantExtension(initialParticipants)
// Notifies Jetpack that this app supports the notion of participants
// being able to raise and lower their hands.
val raiseHandState = participantExtension.addRaiseHandSupport(
initialRaisedHands
) { onHandRaisedStateChanged ->
// handle this user's raised hand state changed updates from
// remote surfaces.
}
// After the call has been initialized, perform in-call control actions
onCall {
// other in-call control and extension actions...
// Example: update remote surfaces when the call participants change
participantsFlow.onEach { newParticipants ->
participantExtension.updateParticipants(newParticipants)
}.launchIn(this)
// notify remote surfaces of which of the participants have their
// hands raised
raisedHandsFlow.onEach { newRaisedHands ->
raiseHandState.updateRaisedHands(newRaisedHands)
}.launchIn(this)
}
}
সমর্থন কল নীরবতা
কল নীরবতা একজন ব্যবহারকারীকে অনুরোধ করতে দেয় যে অ্যাপটি ডিভাইসের মাইক্রোফোনকে শারীরিকভাবে নিঃশব্দ না করে একটি কলের আউটগোয়িং অডিও নীরব করে। এই বৈশিষ্ট্যটি প্রতি কলে পরিচালিত হয়, তাই জেটপ্যাক একটি VOIP কল সক্রিয় থাকাকালীন চলমান সেলুলার কলগুলির বিশ্বব্যাপী নিঃশব্দ অবস্থা পরিচালনার জটিলতা পরিচালনা করে। এটি মাল্টি-কল পরিস্থিতিতে আউটগোয়িং অডিওকে কম ত্রুটির প্রবণতা তৈরি করে যখন ব্যবহারকারী কল নীরবতা সক্ষম করা হয়েছে তা উপলব্ধি না করার সময় "আপনি কি কথা বলছেন" ইঙ্গিতগুলির মতো সহায়ক বৈশিষ্ট্যগুলির জন্য অনুমতি দেয়৷
mCallsManager.addCallWithExtensions(...) {
// Initialize extensions...
// Add support for locally silencing the call's outgoing audio and
// register a handler for when the user changes the call silence state
// from a remote surface.
val callSilenceExtension = addLocalCallSilenceExtension(
initialCallSilenceState = false
) { newCallSilenceStateRequest ->
// handle the user's request to enable/disable call silence from
// a remote surface
}
// After the call has been initialized, perform in-call control actions
onCall {
// other in-call control and extension actions...
// When the call's call silence state changes, update remote
// surfaces of the new state.
callSilenceState.onEach { isSilenced ->
callSilenceExtension.updateIsLocallySilenced(isSilenced)
}.launchIn(this)
}
}
সমর্থন কল আইকন
একটি কল আইকন অ্যাপটিকে একটি কাস্টম আইকন নির্দিষ্ট করতে দেয় যা কলের সময় দূরবর্তী সারফেসগুলিতে প্রদর্শিত হবে। এই আইকনটি কলের জীবদ্দশায় আপডেট করা যেতে পারে।
mCallsManager.addCallWithExtensions(...) {
// Initialize extensions...
// Add support for a custom call icon to be displayed during the
// lifetime of the call.
val callIconExtension = addCallIconExtension(
initialCallIconUri = initialUri
)
// After the call has been initialized, perform in-call control actions
onCall {
// other in-call control and extension actions...
// When the call's icon changes, update remote surfaces by providing
// the new URI.
callIconUri.onEach { newIconUri ->
callIconExtension.updateCallIconUri(newIconUri)
}.launchIn(this)
}
}