ডিফল্ট ফোন অ্যাপ্লিকেশন, Android টেলিকম ফ্রেমওয়ার্ককে, রোল ম্যানেজার ও ইন-কল পরিষেবা ব্যবহার করে আপনার অ্যাপ্লিকেশনকে কলিং স্ট্যাটাস সম্পর্কে জানাতে দেয়, যাতে 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ক্লাস ইমপ্লিমেন্টেশনের (আরও তথ্যের জন্য, কানেকশন ইমপ্লিমেন্ট করুন দেখুন) নতুন ইনস্ট্যান্স রিটার্ন করে। আপনি নিম্নলিখিত অ্যাকশনগুলি করে আউটগোয়িং কানেকশন আরও কাস্টমাইজ করতে পারবেন:- আপনার অ্যাপের উচিত
PROPERTY_SELF_MANAGEDকনস্ট্যান্টকে আর্গুমেন্ট হিসেবে ব্যবহার করেsetConnectionProperties(int)মেথড কল করা, যাতে বোঝা যায় যে কানেকশনটি কোনও কলিং অ্যাপ থেকে শুরু হয়েছে। - আপনার অ্যাপে কল হোল্ডে রাখার সুবিধা থাকলে,
setConnectionCapabilities(int)মেথড কল করুন এবং আর্গুমেন্টকেCAPABILITY_HOLDওCAPABILITY_SUPPORT_HOLDকনস্ট্যান্টের বিট মাস্ক ভ্যালুতে সেট করুন। - কলারের নাম সেট করতে,
setCallerDisplayName(String, int)পদ্ধতি ব্যবহার করুনPRESENTATION_ALLOWEDধ্রুবকটিintপ্যারামিটার হিসেবে পাস করে ইঙ্গিত করুন যে কলারের নাম দেখানো উচিত। - আউটগোয়িং কলে উপযুক্ত ভিডিও স্টেট আছে কিনা তা নিশ্চিত করতে,
Connectionঅবজেক্টেরsetVideoState(int)মেথড কল করুন এবংConnectionRequestঅবজেক্টেরgetVideoState()মেথড দ্বারা রিটার্ন করা ভ্যালু পাঠান।
- আপনার অ্যাপের উচিত
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)মেথড কল করুন এবংConnectionRequestঅবজেক্টেরgetVideoState()মেথড দ্বারা রিটার্ন করা ভ্যালু পাঠান।
- আপনার অ্যাপের
onCreateIncomingConnectionFailed(PhoneAccountHandle, ConnectionRequest)নতুন ইনকামিং কলের বিষয়ে টেলিকমকে জানাতে আপনার অ্যাপ
addNewIncomingCall(PhoneAccountHandle, Bundle)মেথড কল করলে, টেলিকম সাবসিস্টেম এই মেথড কল করে, তবে ইনকামিং কলের অনুমতি দেওয়া হয় না (আরও তথ্যের জন্য, কলিং সংক্রান্ত সীমাবদ্ধতা দেখুন)। আপনার অ্যাপের উচিত ইনকামিং কল সাইলেন্টলি বাতিল করা, ঐচ্ছিকভাবে মিসড কল সম্পর্কে ব্যবহারকারীকে জানাতে একটি বিজ্ঞপ্তি পোস্ট করা।
কানেকশন প্রয়োগ করুন
আপনার অ্যাপে কল দেখানোর জন্য অ্যাপে Connection-এর সাবক্লাস তৈরি করতে হবে।
আপনার ইমপ্লিমেন্টেশনে নিম্নলিখিত পদ্ধতিগুলি ওভাররাইড করতে হবে:
onShowIncomingCallUi()আপনি নতুন ইনকামিং কল যোগ করলে, টেলিকম সাবসিস্টেম এই পদ্ধতিকে কল করে এবং আপনার অ্যাপের ইনকামিং কল UI দেখানো উচিত।
onCallAudioStateChanged(CallAudioState)বর্তমান অডিও রুট বা মোড পরিবর্তন হয়েছে কিনা তা আপনার অ্যাপকে জানাতে, টেলিকম সাবসিস্টেম এই পদ্ধতিকে কল করে।
setAudioRoute(int)পদ্ধতি ব্যবহার করে আপনার অ্যাপ অডিও মোড পরিবর্তন করার প্রতিক্রিয়ায় এটি কল করা হয়। সিস্টেম অডিও রুট পরিবর্তন করলে এই পদ্ধতিও কল করা হতে পারে (যেমন, ব্লুটুথ হেডসেট ডিসকানেক্ট হয়ে গেলে)।onHold()টেলিকম সাবসিস্টেম কোনও কল হোল্ডে রাখতে চাইলে এই মেথড কল করে। এই অনুরোধের উত্তরে, আপনার অ্যাপকে কল হোল্ড করতে হবে এবং তারপরে
setOnHold()মেথড কল করতে হবে যাতে সিস্টেমকে জানানো যায় যে কল হোল্ড করা হচ্ছে। টেলিকম সাবসিস্টেম এই পদ্ধতিকে কল করতে পারে যখন ইন-কল পরিষেবা, যেমন Android Auto, যা আপনার কল দেখাচ্ছে, সেটি কল হোল্ডে রাখার জন্য ব্যবহারকারীর অনুরোধ রিলে করতে চায়। ব্যবহারকারী অন্য কোনও অ্যাপে কল অ্যাক্টিভ করলে, টেলিকম সাবসিস্টেমও এই পদ্ধতিতে কল করে। কল-মধ্যস্থ পরিষেবা সম্পর্কে আরও জানতে,InCallServiceদেখুন।onUnhold()টেলিকম সাবসিস্টেম এই পদ্ধতিকে কল করে যখন এটি হোল্ডে রাখা কল আবার শুরু করতে চায়। আপনার অ্যাপ কলটি আবার শুরু করলে, কলটি আর হোল্ডে নেই তা সিস্টেমকে জানাতে এটিকে
setActive()পদ্ধতিটি চালু করতে হবে। টেলিকম সাবসিস্টেম এই পদ্ধতিকে কল করতে পারে যখন ইন-কল পরিষেবা, যেমন Android Auto, যা আপনার কল দেখাচ্ছে, কল আবার শুরু করার জন্য অনুরোধ রিলে করতে চায়। কল-মধ্যস্থ পরিষেবা সম্পর্কে আরও তথ্যের জন্য,InCallServiceদেখুন।onAnswer()ইনকামিং কলের উত্তর দিতে হবে, আপনার অ্যাপকে এই তথ্য জানাতে টেলিকম সাবসিস্টেম এই পদ্ধতিকে কল করে। আপনার অ্যাপ কলের উত্তর দিলে, কলের উত্তর দেওয়া হয়েছে বলে সিস্টেমকে জানাতে, এটি
setActive()মেথডকে কল করবে। আপনার অ্যাপ নতুন ইনকামিং কল যোগ করলে এবং অন্য অ্যাপে আগে থেকেই কোনও কল চলতে থাকলে, যা হোল্ডে রাখা যাবে না, তখন টেলিকম সাবসিস্টেম এই পদ্ধতি কল করতে পারে। এইসব ক্ষেত্রে টেলিকম সাবসিস্টেম আপনার অ্যাপের হয়ে ইনকামিং কল UI দেখায়। ফ্রেমওয়ার্কটি একটি ওভারলোড করা পদ্ধতি প্রদান করে যা কলের উত্তর দেওয়ার জন্য ভিডিওর অবস্থা নির্দিষ্ট করতে সহায়তা প্রদান করে। আরও তথ্যের জন্য,onAnswer(int)দেখুন।onReject()টেলিকম সাবসিস্টেম এই পদ্ধতিকে কল করে যখন এটি কোনও ইনকামিং কল বাতিল করতে চায়। আপনার অ্যাপ কলটি প্রত্যাখ্যান করার পরে, এটি
setDisconnected(DisconnectCause)-এ কল করবে এবং প্যারামিটার হিসেবেREJECTEDনির্দিষ্ট করবে। অ্যাপটি যে কল প্রসেস করেছে তা সিস্টেমকে জানাতে আপনার অ্যাপকেdestroy()মেথড কল করতে হবে। ব্যবহারকারী আপনার অ্যাপ থেকে আসা ইনকামিং কল প্রত্যাখ্যান করলে, টেলিকম সাবসিস্টেম এই মেথড কল করে।onDisconnect()টেলিকম সাবসিস্টেম কোনও কল ডিসকানেক্ট করতে চাইলে এই মেথড কল করে। কল শেষ হয়ে গেলে, আপনার অ্যাপের
setDisconnected(DisconnectCause)মেথড কল করা উচিত এবং প্যারামিটার হিসেবেLOCALউল্লেখ করা উচিত যাতে বোঝা যায় যে ব্যবহারকারীর অনুরোধের কারণে কল ডিসকানেক্ট করা হয়েছে। এরপর, অ্যাপটি যে কল প্রসেস করেছে তা টেলিকম সাবসিস্টেমকে জানাতে আপনার অ্যাপেরdestroy()মেথড কল করা উচিত। ব্যবহারকারী Android Auto-এর মতো অন্য কোনও ইন-কল পরিষেবার মাধ্যমে কল ডিসকানেক্ট করলে, সিস্টেম এই পদ্ধতি কল করতে পারে। অন্য কল করার জন্য আপনার কল ডিসকানেক্ট করতে হলে, সিস্টেম এই পদ্ধতি ব্যবহার করে। যেমন, ব্যবহারকারী কোনও জরুরি কল করতে চাইলে। কল-মধ্যস্থ পরিষেবা সম্পর্কে আরও জানতে,InCallServiceদেখুন।
কল করার সাধারণ পরিস্থিতি ম্যানেজ করা
আপনার কল ফ্লোতে ConnectionService API ব্যবহার করার অর্থ হল android.telecom
প্যাকেজের অন্যান্য ক্লাসের সাথে ইন্টার্যাক্ট করা। নিম্নলিখিত বিভাগগুলি সাধারণ কলিং পরিস্থিতি বর্ণনা করে এবং কীভাবে আপনার
অ্যাপ API ব্যবহার করে সেগুলি পরিচালনা করবে তা জানায়।
ইনকামিং কলের উত্তর দিন
অন্য অ্যাপে কল আছে কিনা তার উপর নির্ভর করে ইনকামিং কল ম্যানেজ করার ফ্লো পরিবর্তিত হয়। ফ্লোতে পার্থক্যের কারণ হল, ডিভাইসে সব কলিং অ্যাপের জন্য একটি স্থিতিশীল পরিবেশ নিশ্চিত করতে অন্যান্য অ্যাপে অ্যাক্টিভ কল থাকলে, টেলিকম ফ্রেমওয়ার্ককে অবশ্যই কিছু সীমাবদ্ধতা স্থাপন করতে হবে। আরও তথ্যের জন্য, কল করার ক্ষেত্রে সীমাবদ্ধতা দেখুন।
অন্যান্য অ্যাপে কোনও অ্যাক্টিভ কল নেই
অন্য কোনও অ্যাপে অ্যাক্টিভ কল না থাকলে ইনকামিং কলের উত্তর দিতে, এইসব ধাপ অনুসরণ করুন:
- আপনার অ্যাপ স্বাভাবিক মেকানিজম ব্যবহার করে নতুন ইনকামিং কল রিসিভ করে।
- নতুন ইনকামিং কল সম্পর্কে টেলিকম সাবসিস্টেমকে জানাতে
addNewIncomingCall(PhoneAccountHandle, Bundle)পদ্ধতি ব্যবহার করুন। - টেলিকম সাবসিস্টেম আপনার অ্যাপের
ConnectionServiceইমপ্লিমেন্টেশনের সাথে বাইন্ড করে এবংonCreateIncomingConnection(PhoneAccountHandle, ConnectionRequest)পদ্ধতি ব্যবহার করে নতুন ইনকামিং কলকে উপস্থাপনকারীConnectionক্লাসের একটি নতুন ইনস্ট্যান্সের জন্য অনুরোধ করে। - টেলিকম সাবসিস্টেম আপনার অ্যাপকে জানায় যে
onShowIncomingCallUi()পদ্ধতি ব্যবহার করে ইনকামিং কল ইউজার ইন্টারফেস দেখানো উচিত। - আপনার অ্যাপ, সংশ্লিষ্ট ফুল-স্ক্রিন ইনটেন্ট সহ বিজ্ঞপ্তি ব্যবহার করে,
ইনকামিং UI দেখায়। আরও তথ্যের জন্য,
onShowIncomingCallUi()দেখুন। - ব্যবহারকারী ইনকামিং কল গ্রহণ করলে
setActive()মেথড কল করুন, অথবা ব্যবহারকারী ইনকামিং কল প্রত্যাখ্যান করলেsetDisconnected(DisconnectCause)মেথড কল করুন, যেখানে প্যারামিটার হিসেবেREJECTEDউল্লেখ করা থাকবে এবং এর পরেdestroy()মেথড কল করা হবে।
অন্যান্য অ্যাপে অ্যাক্টিভ কল যা হোল্ডে রাখা যাবে না
অন্য অ্যাপে অ্যাক্টিভ কল থাকলে, ইনকামিং কলের উত্তর দিতে, যা হোল্ডে রাখা যাবে না, এই ধাপগুলি অনুসরণ করুন:
- আপনার অ্যাপ স্বাভাবিক মেকানিজম ব্যবহার করে নতুন ইনকামিং কল রিসিভ করে।
- নতুন ইনকামিং কল সম্পর্কে টেলিকম সাবসিস্টেমকে জানাতে
addNewIncomingCall(PhoneAccountHandle, Bundle)পদ্ধতি ব্যবহার করুন। - টেলিকম সাবসিস্টেম আপনার অ্যাপের
ConnectionServiceইমপ্লিমেন্টেশনের সাথে বাইন্ড করে এবংonCreateIncomingConnection(PhoneAccountHandle, ConnectionRequest)পদ্ধতি ব্যবহার করে নতুন ইনকামিং কলকে উপস্থাপনকারীConnectionঅবজেক্টের একটি নতুন ইনস্ট্যান্সের জন্য অনুরোধ করে। - টেলিকম সাবসিস্টেম আপনার ইনকামিং কলের জন্য ইনকামিং কল UI দেখায়।
- ব্যবহারকারী কল রিসিভ করলে, টেলিকম সাবসিস্টেম
onAnswer()মেথডকে কল করে। কল এখন কানেক্ট করা হয়েছে তা টেলিকম সাবসিস্টেমকে জানাতে আপনাকেsetActive()মেথড কল করতে হবে। - ব্যবহারকারী কল বাতিল করলে, টেলিকম সাবসিস্টেম
onReject()মেথড কল করে। আপনারsetDisconnected(DisconnectCause)পদ্ধতি কল করা উচিত, যেখানে প্যারামিটার হিসেবেREJECTEDউল্লেখ করা থাকবে এবং তারপরেdestroy()পদ্ধতি কল করতে হবে।
আউটগোয়িং কল করা
আউটগোয়িং কল করার ফ্লোতে এমন সম্ভাবনাও সামলাতে হয় যেখানে টেলিকম ফ্রেমওয়ার্কের আরোপ করা সীমাবদ্ধতার কারণে কল করা যায় না। আরও তথ্যের জন্য, কল করার ক্ষেত্রে সীমাবদ্ধতা দেখুন।
আউটগোয়িং কল করতে, এই ধাপগুলি অনুসরণ করুন:
- ব্যবহারকারী আপনার অ্যাপের মধ্যে থেকে আউটগোয়িং কল শুরু করেন।
- নতুন আউটগোয়িং কল সম্পর্কে টেলিকম সাবসিস্টেমকে জানাতে
placeCall(Uri, Bundle)পদ্ধতি ব্যবহার করুন। পদ্ধতির প্যারামিটারের জন্য নিম্নলিখিত বিষয়গুলি বিবেচনা করুন:Uriপ্যারামিটারটি সেই ঠিকানা দেখায় যেখানে কল করা হচ্ছে। সাধারণ ফোন নম্বরের জন্য,tel:URI স্কিম ব্যবহার করুন।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
প্রয়োগ করে। এই ক্ষেত্রে, নিম্নলিখিত সীমাবদ্ধতা প্রযোজ্য:
API লেভেল ২৭ বা তার নিচের ভার্সনে চলা ডিভাইসে, যেকোনও সময়ে শুধুমাত্র একটি অ্যাপই চলমান কল বজায় রাখতে পারে। এই সীমাবদ্ধতার অর্থ হল, কোনও ব্যবহারকারী FooTalk অ্যাপ ব্যবহার করে কল করার সময়, BarTalk অ্যাপ নতুন কল শুরু বা রিসিভ করতে পারবে না।
API লেভেল ২৮ বা তার চেয়ে উন্নত ভার্সনে রান করা ডিভাইসে, FooTalk ও BarTalk উভয়ই যদি
CAPABILITY_SUPPORT_HOLDএবংCAPABILITY_HOLDঅনুমতি ঘোষণা করে, তাহলে ব্যবহারকারী একটি অ্যাপ থেকে অন্য অ্যাপে পাল্টে একাধিক কল চালু রাখতে পারবেন, যাতে অন্য কল শুরু করা বা উত্তর দেওয়া যায়।ব্যবহারকারী যদি নিয়মিত ম্যানেজ করা কলে ব্যস্ত থাকেন (যেমন, বিল্ট-ইন ফোন বা ডায়ালার অ্যাপ ব্যবহার করে), তাহলে তিনি কলিং অ্যাপ থেকে শুরু হওয়া কলে অংশগ্রহণ করতে পারবেন না। এর অর্থ হল, ব্যবহারকারী যদি তার মোবাইল পরিষেবা প্রদানকারী ব্যবহার করে একটি সাধারণ কলে থাকেন, তাহলে তিনি একই সাথে FooTalk বা BarTalk কলে থাকতে পারবেন না।
ব্যবহারকারী কোনও জরুরি নম্বরে কল করলে, টেলিকম সাবসিস্টেম আপনার অ্যাপের কল ডিসকানেক্ট করে দেয়।
ব্যবহারকারী জরুরি কলে থাকলে আপনার অ্যাপ কল রিসিভ বা করতে পারবে না।
আপনার অ্যাপে ইনকামিং কল আসার সময় অন্য কোনও কলিং অ্যাপে কল চলতে থাকলে, ইনকামিং কলের উত্তর দিলে অন্য অ্যাপে চলা কলটি কেটে যাবে। আপনার অ্যাপে ইনকামিং কলের সাধারণ ইউজার ইন্টারফেস দেখানো উচিত নয়। টেলিকম ফ্রেমওয়ার্ক ইনকামিং কলের ইউজার ইন্টারফেস দেখায় এবং ব্যবহারকারীকে জানায় যে নতুন কলের উত্তর দিলে তার বর্তমান কল(গুলি) কেটে যাবে। এর অর্থ হল, ব্যবহারকারী FooTalk কলে থাকলে এবং BarTalk অ্যাপে কোনও ইনকামিং কল এলে, টেলিকম ফ্রেমওয়ার্ক ব্যবহারকারীকে জানায় যে তার কাছে একটি নতুন ইনকামিং BarTalk কল এসেছে এবং BarTalk কলের উত্তর দিলে তার FooTalk কল শেষ হয়ে যাবে।
ডিফল্ট ফোন অ্যাপ হিসেবে সেট করা হচ্ছে
ডিফল্ট ডায়ালার/ফোন অ্যাপ হল এমন একটি অ্যাপ যা ডিভাইস কলে থাকাকালীন ইন-কল ইউজার ইন্টারফেস প্রদান করে। এছাড়াও, এটি ব্যবহারকারীকে কল শুরু করার এবং তার ডিভাইসে কলের ইতিহাস দেখার সুবিধা প্রদান করে। সিস্টেমের মাধ্যমে প্রদান করা ডিফল্ট ডায়ালার/ফোন অ্যাপের সাথে ডিভাইস বান্ডেল করা থাকে। ব্যবহারকারী
সিস্টেম অ্যাপ থেকে এই ভূমিকা নেওয়ার জন্য একটি অ্যাপ বেছে নিতে পারেন। যে অ্যাপ এই ভূমিকা
পালন করতে চায় সেটি RoleManager ব্যবহার করে RoleManager.ROLE_DIALER ভূমিকা
পালন করার জন্য অনুরোধ করে।
ডিভাইস কলে থাকাকালীন ডিফল্ট ফোন অ্যাপ একটি ইউজার ইন্টারফেস প্রদান করে এবং ডিভাইসটি
কার মোডে থাকে না (যেমন UiModeManager#getCurrentModeType()
Configuration.UI_MODE_TYPE_CAR নয়)।
RoleManager.ROLE_DIALER ভূমিকা পূরণ করতে, অ্যাপকে অবশ্যই বেশ কিছু
প্রয়োজনীয়তা পূরণ করতে হবে:
- এটিকে অবশ্যই
Intent#ACTION_DIALইনটেন্ট ম্যানেজ করতে হবে। এর অর্থ হল, ব্যবহারকারী যাতে আউটগোয়িং কল করতে পারেন, তার জন্য অ্যাপে অবশ্যই ডায়াল প্যাড UI থাকতে হবে। - এটিকে অবশ্যই
InCallServiceAPI সম্পূর্ণভাবে প্রয়োগ করতে হবে এবং ইনকামিং কল UI ও চলমান কল UI, দুটিই প্রদান করতে হবে।
মনে রাখবেন: 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 ইমপ্লিমেন্টেশন বিল্ট-ইন ইন-কল UI-কে প্রতিস্থাপন করতে চায়।
মেটা-ডেটা TelecomManager#METADATA_IN_CALL_SERVICE_RINGING থেকে বোঝা যায় যে এই
InCallService ইনকামিং কলের জন্য রিংটোন বাজাবে। আপনার অ্যাপে ইনকামিং কল UI দেখানো এবং রিংটোন বাজানো সম্পর্কে আরও তথ্যের জন্য
নিচে দেখুন।
<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 API প্রয়োগ করার পাশাপাশি, আপনাকে ম্যানিফেস্টে এমন একটি অ্যাক্টিভিটি ঘোষণা করতে হবে যা 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 অনুমতি ঘোষণা করুন
-
CompanionDeviceManagerAPI-এর মাধ্যমে কম্প্যানিয়ন অ্যাপ হিসেবে পরে থাকা যায় এমন ফিজিক্যাল ডিভাইসের সাথে অ্যাসোসিয়েট করুন। দেখুন: https://developer.android.com/guide/topics/connectivity/companion-device-pairing - BIND_INCALL_SERVICE অনুমতির সাথে এই InCallService প্রয়োগ করুন
ইনকামিং কলের বিজ্ঞপ্তি দেখানো হচ্ছে
আপনার অ্যাপInCallService#onCallAdded(Call)-এর মাধ্যমে নতুন ইনকামিং কল পেলে, ইনকামিং কলের জন্য ইনকামিং কল UI দেখানোর
দায়িত্ব এটির। নতুন ইনকামিং কল বিজ্ঞপ্তি পোস্ট করার জন্য এটি
NotificationManager API ব্যবহার করে করা উচিত।
যেখানে আপনার অ্যাপ মেটা-ডেটা 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 নির্দিষ্ট করতে পারেন যা আপনার ফুল স্ক্রিন
ইনকামিং কল UI চালু করবে। ব্যবহারকারী সক্রিয়ভাবে ফোন ব্যবহার করলে, বিজ্ঞপ্তি ম্যানেজার ফ্রেমওয়ার্ক আপনার বিজ্ঞপ্তি
হেডস আপ বিজ্ঞপ্তি হিসেবে দেখাবে। ব্যবহারকারী ফোন ব্যবহার না করলে, আপনার ফুল-স্ক্রিন ইনকামিং কল UI পরিবর্তে ব্যবহার করা হয়।
যেমন:
// 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());
```