একটি ডিফল্ট ফোন অ্যাপ্লিকেশন তৈরি করুন

একটি ডিফল্ট ফোন অ্যাপ্লিকেশন Android টেলিকম ফ্রেমওয়ার্ককে Android ডিভাইসে ডিফল্ট ফোন অ্যাপের জন্য একটি প্রতিস্থাপন তৈরি করতে ভূমিকা ব্যবস্থাপক এবং ইন-কল পরিষেবা ব্যবহার করে কলিং অবস্থা সম্পর্কে আপনার অ্যাপ্লিকেশনকে অবহিত করতে দেয়, InCallService API প্রয়োগ করুন৷ আপনার বাস্তবায়ন নিম্নলিখিত প্রয়োজনীয়তা পূরণ করতে হবে:

এটির কোন কলিং ক্ষমতা থাকতে হবে না এবং কল করার জন্য শুধুমাত্র ইউজার ইন্টারফেস থাকতে হবে। টেলিকম ফ্রেমওয়ার্ক যে সমস্ত কল সম্পর্কে সচেতন তা অবশ্যই পরিচালনা করতে হবে এবং কলের প্রকৃতি সম্পর্কে অনুমান করতে হবে না। উদাহরণস্বরূপ, কলগুলিকে সিম-ভিত্তিক টেলিফোনি কলগুলিকে অনুমান করা উচিত নয়, বা যে কোনও একটি সংযোগ পরিষেবার উপর ভিত্তি করে কলিং বিধিনিষেধ প্রয়োগ করা উচিত নয়, যেমন ভিডিও কলের জন্য টেলিফোনি বিধিনিষেধ প্রয়োগ করা৷

একটি কলিং অ্যাপ ব্যবহারকারীদের তাদের ডিভাইসে অডিও বা ভিডিও কল গ্রহণ করতে বা রাখতে দেয়। কলিং অ্যাপগুলি ডিফল্ট ফোন অ্যাপ ইন্টারফেস ব্যবহার করার পরিবর্তে কলের জন্য তাদের নিজস্ব ইউজার ইন্টারফেস ব্যবহার করে, যেমনটি নিম্নলিখিত স্ক্রিনশটে দেখানো হয়েছে।

একটি কলিং অ্যাপের উদাহরণ
নিজস্ব ইউজার ইন্টারফেস ব্যবহার করে একটি কলিং অ্যাপের উদাহরণ

অ্যান্ড্রয়েড ফ্রেমওয়ার্কের মধ্যে রয়েছে 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 ধ্রুবকের বিট মাস্ক মানতে আর্গুমেন্ট সেট করুন।
  • কলারের নাম সেট করতে, কলারের নাম দেখানো উচিত তা নির্দেশ করতে int প্যারামিটার হিসাবে PRESENTATION_ALLOWED ধ্রুবক পাস করে setCallerDisplayName(String, int) পদ্ধতি ব্যবহার করুন।
  • বহির্গামী কলের উপযুক্ত ভিডিও অবস্থা আছে তা নিশ্চিত করতে, Connection বস্তুর setVideoState(int) পদ্ধতিতে কল করুন এবং ConnectionRequest অবজেক্টের getVideoState() পদ্ধতি দ্বারা ফেরত মানটি পাঠান।
onCreateOutgoingConnectionFailed(PhoneAccountHandle, ConnectionRequest)

টেলিকম সাবসিস্টেম এই পদ্ধতিটিকে কল করে যখন আপনার অ্যাপ placeCall(Uri, Bundle) পদ্ধতিতে কল করে এবং আউটগোয়িং কল করা যায় না। এই পরিস্থিতির প্রতিক্রিয়া হিসাবে, আপনার অ্যাপ ব্যবহারকারীকে জানাতে হবে (উদাহরণস্বরূপ, একটি সতর্কতা বাক্স বা টোস্ট ব্যবহার করে) যে আউটগোয়িং কল করা যাবে না। একটি চলমান জরুরী কল থাকলে বা অন্য অ্যাপে একটি চলমান কল থাকলে আপনার অ্যাপটি কল করতে সক্ষম নাও হতে পারে যা আপনার কল করার আগে হোল্ডে রাখা যাবে না।

onCreateIncomingConnection(PhoneAccountHandle, ConnectionRequest)

টেলিকম সাবসিস্টেম এই পদ্ধতিটিকে কল করে যখন আপনার অ্যাপ আপনার অ্যাপে একটি নতুন ইনকামিং কলের সিস্টেমকে জানাতে addNewIncomingCall(PhoneAccountHandle, Bundle) পদ্ধতিতে কল করে। নতুন ইনকামিং কলের প্রতিনিধিত্ব করতে আপনার অ্যাপটি আপনার Connection বাস্তবায়নের একটি নতুন উদাহরণ প্রদান করে (আরো তথ্যের জন্য, সংযোগ বাস্তবায়ন দেখুন)। আপনি নিম্নলিখিত ক্রিয়াগুলি সম্পাদন করে ইনকামিং সংযোগটি আরও কাস্টমাইজ করতে পারেন:

  • আপনার অ্যাপটি একটি কলিং অ্যাপ থেকে সংযোগটি উদ্ভূত হয়েছে তা বোঝাতে আর্গুমেন্ট হিসাবে PROPERTY_SELF_MANAGED ধ্রুবক সহ setConnectionProperties(int) পদ্ধতিতে কল করা উচিত।
  • যদি আপনার অ্যাপ কলগুলি হোল্ডে রাখা সমর্থন করে, setConnectionCapabilities(int) পদ্ধতিতে কল করুন এবং CAPABILITY_HOLD এবং CAPABILITY_SUPPORT_HOLD ধ্রুবকের বিট মাস্ক মানতে আর্গুমেন্ট সেট করুন।
  • কলারের নাম সেট করতে, কলারের নাম দেখানো উচিত তা নির্দেশ করতে int প্যারামিটার হিসাবে PRESENTATION_ALLOWED ধ্রুবক পাস করে setCallerDisplayName(String, 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() পদ্ধতিটি চালু করা উচিত যে কলটি অনুষ্ঠিত হচ্ছে৷ টেলিকম সাবসিস্টেম এই পদ্ধতিতে কল করতে পারে যখন একটি ইন-কল পরিষেবা, যেমন অ্যান্ড্রয়েড অটো, যেটি আপনার কলটি দেখায় যে কল হোল্ডে রাখার জন্য একটি ব্যবহারকারীর অনুরোধ রিলে করতে চায়৷ ব্যবহারকারী অন্য অ্যাপে কল করলে টেলিকম সাবসিস্টেমও এই পদ্ধতিটিকে কল করে। ইন-কল পরিষেবা সম্পর্কে আরও তথ্যের জন্য, InCallService দেখুন।

onUnhold()

টেলিকম সাবসিস্টেম এই পদ্ধতিটিকে কল করে যখন এটি হোল্ডে রাখা একটি কল পুনরায় শুরু করতে চায়। একবার আপনার অ্যাপ কলটি পুনরায় চালু করলে, এটি setActive() পদ্ধতিটি চালু করা উচিত যাতে সিস্টেমকে জানানো হয় যে কলটি আর হোল্ডে নেই। টেলিকম সাবসিস্টেম এই পদ্ধতিতে কল করতে পারে যখন একটি ইন-কল পরিষেবা, যেমন অ্যান্ড্রয়েড অটো, যেটি আপনার কলটি পুনরায় চালু করার জন্য একটি অনুরোধ রিলে করতে চায়। ইন-কল পরিষেবা সম্পর্কে আরও তথ্যের জন্য, InCallService দেখুন।

onAnswer()

টেলিকম সাবসিস্টেম এই পদ্ধতিতে কল করে আপনার অ্যাপকে জানাতে যে একটি ইনকামিং কলের উত্তর দেওয়া উচিত। একবার আপনার অ্যাপ কলটির উত্তর দিলে, এটিকে setActive() পদ্ধতিতে কল করা উচিত যাতে সিস্টেমকে জানানো হয় যে কলটির উত্তর দেওয়া হয়েছে। টেলিকম সাবসিস্টেম এই পদ্ধতিতে কল করতে পারে যখন আপনার অ্যাপ একটি নতুন ইনকামিং কল যোগ করে এবং ইতিমধ্যেই অন্য একটি অ্যাপে একটি চলমান কল রয়েছে যা হোল্ডে রাখা যাবে না। এই ক্ষেত্রে টেলিকম সাবসিস্টেম আপনার অ্যাপের পক্ষ থেকে ইনকামিং কল UI প্রদর্শন করে। ফ্রেমওয়ার্ক একটি ওভারলোডেড পদ্ধতি প্রদান করে যা ভিডিও স্টেট নির্দিষ্ট করতে সহায়তা প্রদান করে যেখানে কলটির উত্তর দিতে হবে। আরও তথ্যের জন্য, onAnswer(int) দেখুন।

onReject()

টেলিকম সাবসিস্টেম এই পদ্ধতিটিকে কল করে যখন এটি একটি ইনকামিং কল প্রত্যাখ্যান করতে চায়। একবার আপনার অ্যাপ কলটি প্রত্যাখ্যান করলে, এটি setDisconnected(DisconnectCause) কল করা উচিত এবং প্যারামিটার হিসাবে REJECTED উল্লেখ করা উচিত। আপনার অ্যাপটি তারপরে সিস্টেমকে জানাতে destroy() পদ্ধতিতে কল করবে যে অ্যাপটি কলটি প্রক্রিয়া করেছে। টেলিকম সাবসিস্টেম এই পদ্ধতিতে কল করে যখন ব্যবহারকারী আপনার অ্যাপ থেকে একটি ইনকামিং কল প্রত্যাখ্যান করে।

onDisconnect()

টেলিকম সাবসিস্টেম এই পদ্ধতিতে কল করে যখন এটি একটি কল সংযোগ বিচ্ছিন্ন করতে চায়। একবার কলটি শেষ হয়ে গেলে, আপনার অ্যাপটিকে setDisconnected(DisconnectCause) পদ্ধতিতে কল করা উচিত এবং একটি ব্যবহারকারীর অনুরোধের কারণে কলটি সংযোগ বিচ্ছিন্ন হয়েছে তা নির্দেশ করার জন্য প্যারামিটার হিসাবে LOCAL উল্লেখ করা উচিত। আপনার অ্যাপটি তারপরে টেলিকম সাবসিস্টেমকে জানাতে destroy() পদ্ধতিতে কল করবে যে অ্যাপটি কলটি প্রক্রিয়া করেছে। ব্যবহারকারী যখন অ্যান্ড্রয়েড অটোর মতো অন্য ইন-কল পরিষেবার মাধ্যমে একটি কল সংযোগ বিচ্ছিন্ন করে তখন সিস্টেমটি এই পদ্ধতিতে কল করতে পারে। সিস্টেমটি এই পদ্ধতিটিকেও কল করে যখন আপনার কলটি অন্য কল করার অনুমতি দেওয়ার জন্য সংযোগ বিচ্ছিন্ন করা আবশ্যক, উদাহরণস্বরূপ, যদি ব্যবহারকারী একটি জরুরি কল করতে চান। ইন-কল পরিষেবা সম্পর্কে আরও তথ্যের জন্য, InCallService দেখুন।

সাধারণ কলিং পরিস্থিতি পরিচালনা করুন

আপনার কল ফ্লোতে ConnectionService API ব্যবহার করার জন্য android.telecom প্যাকেজের অন্যান্য ক্লাসের সাথে ইন্টারঅ্যাক্ট করা জড়িত। নিম্নলিখিত বিভাগগুলি সাধারণ কলিং পরিস্থিতিগুলি বর্ণনা করে এবং সেগুলি পরিচালনা করার জন্য আপনার অ্যাপের APIগুলি কীভাবে ব্যবহার করা উচিত।

ইনকামিং কল উত্তর

ইনকামিং কল পরিচালনার প্রবাহ অন্য অ্যাপে কল আছে কি না তা পরিবর্তিত হয়। প্রবাহের পার্থক্যের কারণ হল যে ডিভাইসে সমস্ত কলিং অ্যাপের জন্য একটি স্থিতিশীল পরিবেশ নিশ্চিত করতে অন্যান্য অ্যাপে সক্রিয় কল থাকলে টেলিকম ফ্রেমওয়ার্ককে অবশ্যই কিছু সীমাবদ্ধতা স্থাপন করতে হবে। আরও তথ্যের জন্য, কলিং সীমাবদ্ধতা দেখুন।

অন্যান্য অ্যাপে কোনো সক্রিয় কল নেই

অন্যান্য অ্যাপে কোনো সক্রিয় কল না থাকলে ইনকামিং কলের উত্তর দিতে, এই ধাপগুলি অনুসরণ করুন:

  1. আপনার অ্যাপ তার স্বাভাবিক প্রক্রিয়া ব্যবহার করে একটি নতুন ইনকামিং কল গ্রহণ করে।
  2. নতুন ইনকামিং কল সম্পর্কে টেলিকম সাবসিস্টেমকে জানাতে addNewIncomingCall(PhoneAccountHandle, Bundle) পদ্ধতি ব্যবহার করুন।
  3. টেলিকম সাবসিস্টেমটি আপনার অ্যাপের ConnectionService বাস্তবায়নের সাথে আবদ্ধ হয় এবং onCreateIncomingConnection(PhoneAccountHandle, ConnectionRequest) পদ্ধতি ব্যবহার করে নতুন ইনকামিং কলের প্রতিনিধিত্ব করে Connection ক্লাসের একটি নতুন উদাহরণের অনুরোধ করে।
  4. টেলিকম সাবসিস্টেমটি আপনার অ্যাপকে জানায় যে এটির onShowIncomingCallUi() পদ্ধতি ব্যবহার করে তার ইনকামিং কল ইউজার ইন্টারফেস দেখাতে হবে।
  5. আপনার অ্যাপটি একটি সম্পর্কিত পূর্ণ-স্ক্রীন অভিপ্রায় সহ একটি বিজ্ঞপ্তি ব্যবহার করে তার ইনকামিং UI দেখায়। আরও তথ্যের জন্য, onShowIncomingCallUi() দেখুন।
  6. যদি ব্যবহারকারী ইনকামিং কল গ্রহণ করে তাহলে setActive() পদ্ধতিতে কল করুন, অথবা ব্যবহারকারী যদি ইনকামিং কল প্রত্যাখ্যান করে তাহলে setDisconnected(DisconnectCause) প্যারামিটার হিসাবে REJECTED উল্লেখ করে তারপর destroy() পদ্ধতিতে কল করুন।

অন্যান্য অ্যাপে সক্রিয় কল যা হোল্ডে রাখা যাবে না

অন্যান্য অ্যাপ্লিকেশানগুলিতে যখন সক্রিয় কল থাকে যা হোল্ডে রাখা যায় না তখন ইনকামিং কলগুলির উত্তর দিতে, এই পদক্ষেপগুলি অনুসরণ করুন:

  1. আপনার অ্যাপ তার স্বাভাবিক প্রক্রিয়া ব্যবহার করে একটি নতুন ইনকামিং কল গ্রহণ করে।
  2. নতুন ইনকামিং কল সম্পর্কে টেলিকম সাবসিস্টেমকে জানাতে addNewIncomingCall(PhoneAccountHandle, Bundle) পদ্ধতি ব্যবহার করুন।
  3. টেলিকম সাবসিস্টেমটি আপনার অ্যাপের ConnectionService বাস্তবায়নের সাথে আবদ্ধ হয় এবং onCreateIncomingConnection(PhoneAccountHandle, ConnectionRequest) পদ্ধতি ব্যবহার করে নতুন ইনকামিং কলের প্রতিনিধিত্ব করে Connection বস্তুর একটি নতুন উদাহরণের অনুরোধ করে।
  4. টেলিকম সাবসিস্টেম আপনার ইনকামিং কলের জন্য ইনকামিং কল UI প্রদর্শন করে।
  5. ব্যবহারকারী কলটি গ্রহণ করলে, টেলিকম সাবসিস্টেম onAnswer() পদ্ধতিতে কল করে। টেলিকম সাবসিস্টেমে যে কলটি এখন কানেক্ট করা হয়েছে তা নির্দেশ করার জন্য আপনাকে setActive() পদ্ধতিতে কল করতে হবে।
  6. ব্যবহারকারী কলটি প্রত্যাখ্যান করলে, টেলিকম সাবসিস্টেম onReject() পদ্ধতিতে কল করে। আপনি setDisconnected(DisconnectCause) পদ্ধতিটিকে REJECTED উল্লেখ করে পরামিতি হিসাবে কল করুন এবং তারপর destroy() পদ্ধতিতে কল করুন।

আউটগোয়িং কল করুন

একটি আউটগোয়িং কল করার প্রবাহে টেলিকম ফ্রেমওয়ার্কের দ্বারা আরোপিত সীমাবদ্ধতার কারণে কলটি স্থাপন করা যাবে না এমন সম্ভাবনা পরিচালনা করা জড়িত। আরও তথ্যের জন্য, কলিং সীমাবদ্ধতা দেখুন।

একটি বহির্গামী কল করতে, এই পদক্ষেপগুলি অনুসরণ করুন:

  1. ব্যবহারকারী আপনার অ্যাপের মধ্যে একটি বহির্গামী কল শুরু করে।
  2. নতুন আউটগোয়িং কল সম্পর্কে টেলিকম সাবসিস্টেমকে জানাতে placeCall(Uri, Bundle) পদ্ধতি ব্যবহার করুন। পদ্ধতির পরামিতিগুলির জন্য নিম্নলিখিত বিবেচনাগুলি নিন:
    • Uri প্যারামিটারটি সেই ঠিকানাকে উপস্থাপন করে যেখানে কল করা হচ্ছে। নিয়মিত ফোন নম্বরের জন্য, tel: URI স্কিম ব্যবহার করুন।
    • Bundle প্যারামিটার আপনাকে EXTRA_PHONE_ACCOUNT_HANDLE অতিরিক্তে আপনার অ্যাপের PhoneAccountHandle অবজেক্ট যোগ করে আপনার কলিং অ্যাপ সম্পর্কে তথ্য প্রদান করতে দেয়। আপনার অ্যাপটিকে অবশ্যই প্রতিটি আউটগোয়িং কলে PhoneAccountHandle অবজেক্ট প্রদান করতে হবে।
    • Bundle প্যারামিটার আপনাকে EXTRA_START_CALL_WITH_VIDEO_STATE অতিরিক্ত STATE_BIDIRECTIONAL মান উল্লেখ করে আউটগোয়িং কলে ভিডিও অন্তর্ভুক্ত কিনা তা নির্দিষ্ট করার অনুমতি দেয়। বিবেচনা করুন যে ডিফল্টরূপে, টেলিকম সাবসিস্টেম স্পিকারফোনে ভিডিও কলগুলিকে রুট করে।
  3. টেলিকম সাবসিস্টেম আপনার অ্যাপের ConnectionService বাস্তবায়নের সাথে আবদ্ধ।
  4. যদি আপনার অ্যাপ একটি আউটগোয়িং কল করতে সক্ষম না হয়, তাহলে টেলিকম সাবসিস্টেম onCreateOutgoingConnectionFailed(PhoneAccountHandle, ConnectionRequest) পদ্ধতিতে কল করে আপনার অ্যাপকে জানাতে যে কলটি বর্তমান সময়ে করা যাবে না। আপনার অ্যাপ ব্যবহারকারীকে জানানো উচিত যে কল করা যাবে না।
  5. আপনার অ্যাপ যদি আউটগোয়িং কল করতে সক্ষম হয়, তাহলে টেলিকম সাবসিস্টেম onCreateOutgoingConnection(PhoneAccountHandle, ConnectionRequest) পদ্ধতিতে কল করে। নতুন বহির্গামী কল প্রতিনিধিত্ব করার জন্য আপনার অ্যাপটি আপনার Connection শ্রেণীর একটি উদাহরণ প্রদান করবে। সংযোগে আপনার যে বৈশিষ্ট্যগুলি সেট করা উচিত সে সম্পর্কে আরও তথ্যের জন্য, সংযোগ পরিষেবা বাস্তবায়ন দেখুন।
  6. আউটগোয়িং কল সংযুক্ত হয়ে গেলে, টেলিকম সাবসিস্টেমকে জানানোর জন্য setActive() পদ্ধতিতে কল করুন যে কলটি সক্রিয়।

একটি কল শেষ করুন

একটি কল শেষ করতে, এই পদক্ষেপগুলি অনুসরণ করুন:

  1. ব্যবহারকারী কলটি বন্ধ করে দিলে প্যারামিটার হিসাবে LOCAL পাঠাতে সেটটিকে কল করুন setDisconnected(DisconnectCause) অথবা অন্য পক্ষ কলটি বন্ধ করলে প্যারামিটার হিসাবে REMOTE পাঠান।
  2. destroy() পদ্ধতিতে কল করুন।

কলিং সীমাবদ্ধতা

আপনার ব্যবহারকারীদের জন্য একটি সামঞ্জস্যপূর্ণ এবং সহজ কলিং অভিজ্ঞতা নিশ্চিত করতে, টেলিকম ফ্রেমওয়ার্ক ডিভাইসে কল পরিচালনার জন্য কিছু সীমাবদ্ধতা প্রয়োগ করে। উদাহরণস্বরূপ, বিবেচনা করুন যে ব্যবহারকারী দুটি কলিং অ্যাপ ইনস্টল করেছেন যা স্ব-পরিচালিত ConnectionService API, FooTalk এবং BarTalk বাস্তবায়ন করে। এই ক্ষেত্রে, নিম্নলিখিত সীমাবদ্ধতা প্রযোজ্য:

  • এপিআই লেভেল 27 বা তার নিচের ডিভাইসে, শুধুমাত্র একটি অ্যাপ যেকোন সময়ে একটি চলমান কল বজায় রাখতে পারে। এই সীমাবদ্ধতার অর্থ হল যে যখন একজন ব্যবহারকারীর FooTalk অ্যাপ ব্যবহার করে একটি চলমান কল থাকে, তখন BarTalk অ্যাপটি একটি নতুন কল শুরু করতে বা গ্রহণ করতে পারে না।

    API স্তর 28 বা উচ্চতর ডিভাইসে চলমান ডিভাইসগুলিতে, যদি FooTalk এবং BarTalk উভয়ই CAPABILITY_SUPPORT_HOLD এবং CAPABILITY_HOLD অনুমতিগুলি ঘোষণা করে, তাহলে ব্যবহারকারী অন্য একটি কল শুরু করতে বা উত্তর দেওয়ার জন্য অ্যাপগুলির মধ্যে স্যুইচ করে একাধিক চলমান কল বজায় রাখতে পারেন৷

  • ব্যবহারকারী যদি নিয়মিত ম্যানেজড কলে নিযুক্ত থাকেন (উদাহরণস্বরূপ, বিল্ট-ইন ফোন বা ডায়ালার অ্যাপ ব্যবহার করে), ব্যবহারকারী কলিং অ্যাপ থেকে উদ্ভূত কলে থাকতে পারবেন না। এর মানে হল যে ব্যবহারকারী যদি তাদের মোবাইল ক্যারিয়ার ব্যবহার করে একটি নিয়মিত কলে থাকে, তাহলে তারা একই সাথে FooTalk বা BarTalk কলে থাকতে পারবে না।

  • যদি ব্যবহারকারী একটি জরুরী কল ডায়াল করে তাহলে টেলিকম সাবসিস্টেম আপনার অ্যাপের কলগুলিকে সংযোগ বিচ্ছিন্ন করে দেয়৷

  • ব্যবহারকারী জরুরী কলে থাকাকালীন আপনার অ্যাপ গ্রহণ করতে বা কল করতে পারে না।

  • অন্য কলিং অ্যাপে যদি একটি চলমান কল থাকে যখন আপনার অ্যাপ একটি ইনকামিং কল পায়, তাহলে ইনকামিং কলের উত্তর দিলে অন্য অ্যাপে চলমান কলগুলি শেষ হয়ে যায়। আপনার অ্যাপের স্বাভাবিক ইনকামিং কল ইউজার ইন্টারফেস প্রদর্শন করা উচিত নয়। টেলিকম ফ্রেমওয়ার্ক ইনকামিং কল ইউজার ইন্টারফেস প্রদর্শন করে এবং ব্যবহারকারীকে জানায় যে নতুন কলের উত্তর দিলে তাদের চলমান কল(গুলি) শেষ হয়ে যাবে। এর মানে যদি ব্যবহারকারী একটি FooTalk কলে থাকে এবং BarTalk অ্যাপ একটি ইনকামিং কল পায়, তাহলে টেলিকম ফ্রেমওয়ার্ক ব্যবহারকারীকে জানায় যে তাদের একটি নতুন ইনকামিং BarTalk কল আছে এবং BarTalk কলের উত্তর দিলে তাদের FooTalk কলটি শেষ হয়ে যাবে।

ডিফল্ট ফোন অ্যাপ হয়ে উঠছে

ডিফল্ট ডায়ালার/ফোন অ্যাপ্লিকেশান হল একটি যা ডিভাইসটি কল করার সময় ইন-কল ইউজার ইন্টারফেস প্রদান করে। এটি ব্যবহারকারীকে কল শুরু করার এবং তাদের ডিভাইসে কলের ইতিহাস দেখতে একটি উপায় প্রদান করে। ডিফল্ট ডায়ালার/ফোন অ্যাপ প্রদত্ত সিস্টেমের সাথে একটি ডিভাইস বান্ডিল করা হয়। সিস্টেম অ্যাপ থেকে এই ভূমিকা নেওয়ার জন্য ব্যবহারকারী একটি একক অ্যাপ বেছে নিতে পারেন। একটি অ্যাপ যা এই ভূমিকাটি পূরণ করতে চায় তারা RoleManager.ROLE_DIALER ভূমিকাটি পূরণ করার অনুরোধ করতে RoleManager ব্যবহার করে৷

ডিফল্ট ফোন অ্যাপটি একটি ইউজার ইন্টারফেস প্রদান করে যখন ডিভাইসটি একটি কলে থাকে এবং ডিভাইসটি কার মোডে থাকে না (যেমন UiModeManager#getCurrentModeType() Configuration.UI_MODE_TYPE_CAR নয়)।

RoleManager.ROLE_DIALER ভূমিকা পূরণ করতে, একটি অ্যাপকে অবশ্যই বেশ কয়েকটি প্রয়োজনীয়তা পূরণ করতে হবে:

  • এটি অবশ্যই Intent#ACTION_DIAL অভিপ্রায় পরিচালনা করতে হবে৷ এর মানে হল আউটগোয়িং কল শুরু করার জন্য অ্যাপটিকে অবশ্যই একটি ডায়াল প্যাড UI প্রদান করতে হবে।
  • এটিকে অবশ্যই InCallService API সম্পূর্ণরূপে প্রয়োগ করতে হবে এবং একটি ইনকামিং কল UI, সেইসাথে একটি চলমান কল UI উভয়ই প্রদান করতে হবে৷

দ্রষ্টব্য: যদি RoleManager.ROLE_DIALER পূরণ করা অ্যাপটি বাইন্ডিংয়ের সময় একটি null InCallService প্রদান করে, তাহলে টেলিকম ফ্রেমওয়ার্ক স্বয়ংক্রিয়ভাবে ডিভাইসে প্রিলোড করা ডায়ালার অ্যাপ ব্যবহারে ফিরে আসবে। সিস্টেমটি ব্যবহারকারীকে একটি বিজ্ঞপ্তি প্রদর্শন করবে যাতে তাদের জানানো হয় যে প্রিলোড করা ডায়ালার অ্যাপ ব্যবহার করে তাদের কলটি অব্যাহত ছিল। আপনার অ্যাপটি কখনই একটি null বাইন্ডিং ফেরত দেবে না; এটি করার অর্থ এটি RoleManager.ROLE_DIALER এর প্রয়োজনীয়তাগুলি পূরণ করে না৷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 অ্যাক্সেস করতে চায়, তাহলে আপনার অ্যাপ যা করতে পারে তা হল:

    1. আপনার ম্যানিফেস্টে MANAGE_ONGOING_CALLS অনুমতি ঘোষণা করুন৷
    2. একটি সহচর অ্যাপ হিসাবে CompanionDeviceManager API এর মাধ্যমে একটি শারীরিক পরিধানযোগ্য ডিভাইসের সাথে সংযুক্ত করুন৷ দেখুন: https://developer.android.com/guide/topics/connectivity/companion-device-pairing
    3. 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());
```