অ্যাপ ফাউন্ডেশন

নিরবচ্ছিন্ন ক্রস-ডিভাইস ইন্টার‍্যাকশন চালু করা

স্পিকার

  • ইয়াসিন রেজগুই

    ডেভেলপার রিলেশনস ইঞ্জিনিয়ার

  • Hanrui Gao

    ডেভেলপার রিলেশনস ইঞ্জিনিয়ার

  • Nataraj K R

    ডেভেলপার রিলেশনস ইঞ্জিনিয়ার

সম্পর্কে

টক সম্পর্কে

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

এই গভীর আলোচনাটি মাল্টি-ডিভাইস কমিউনিকেশনের জন্য তৈরি বিশেষ Android API-এর সাথে পরিচয় করিয়ে দেয়, যা ডিভাইসের মধ্যে ট্রানজিশন তাৎক্ষণিক, নির্ভরযোগ্য এবং স্বজ্ঞাত রাখতে মেমরি এবং পাওয়ার-দক্ষ প্যাটার্ন অফার করে।

সারাংশ

  • কম্প্যানিয়ন ডিভাইস ম্যানেজার, ব্লুটুথ পেরিফেরালের জন্য ফোরগ্রাউন্ড সার্ভিসকে রিপ্লেস করে। এটি উপস্থিতির ভিত্তিতে অ্যাপকে জাগিয়ে তোলে এবং ব্যাটারি খরচ না করেই কানেকশন ম্যানেজ করে। Android 17-এ মেডিকেল ডিভাইস ও ফিটনেস ট্র্যাকারের জন্য নির্দিষ্ট নতুন প্রোফাইল যোগ করা হয়েছে।
  • Jetpack Telecom, Android 8 পর্যন্ত কাজ করে এমন ঘড়ি এবং গাড়ির মতো কানেক্ট করা ডিভাইস জুড়ে VoIP অ্যাপের জন্য সিস্টেম কল কোঅর্ডিনেটর হিসেবে কাজ করে। এছাড়াও, এটি CallControlScope-এর মাধ্যমে মিউট ও হ্যাং-আপ অ্যাকশন সিঙ্ক করে।
  • আসন্ন Jetpack Telecom 1.1.0 ফিচারের মধ্যে সিস্টেম ডায়ালারে (SDK 36.1+) একত্রিত করা কলের ইতিহাস এবং কাজ করে এমন ক্যারিয়ার নেটওয়ার্কে অটোমেটিক 5G নেটওয়ার্ক স্লাইসিং অন্তর্ভুক্ত।
  • আগামী বছর 'দ্রুত শেয়ার' SDK লঞ্চ করা হচ্ছে যাতে ডেভেলপাররা সরাসরি Android ও iOS অ্যাপে লোকাল, এন্ড-টু-এন্ড এনক্রিপ্টেড ফাইল শেয়ারিং এম্বেড করতে পারেন। শেয়ার করতে ট্যাপ করুন (Pixel 11-এর সাথে লঞ্চ করা হয়েছে) ফিচারটি এমনকি বন্ধ থাকা রিসিভিং অ্যাপকে অটোমেটিক চালু করতে পারে।

রিসোর্স

Gemini Notebook

বিষয়

  • ক্রস-ডিভাইস
  • কম্প্যানিয়ন-ডিভাইস-ম্যানেজার
  • jetpack-telecom
  • কুইক-শেয়ার
  • ব্লুটুথ
  • voip
  • পিয়ার-টু-পিয়ার

ট্রান্সস্ক্রিপ্ট করা

ক্রস-ডিভাইস ইন্টার‍্যাকশন সম্পর্কে প্রাথমিক তথ্য

  • হ্যালো।

  • 'নির্বিঘ্নে ক্রস-ডিভাইস ইন্টার‍্যাকশন চালু করা' প্রোগ্রামে স্বাগতম।

  • আমি হানরুই এবং আজ আমার সাথে আমার সহকর্মী ইয়াসিন ও নটরাজ আছেন।

  • কানেক্টিভিটি সম্পর্কে কথা বলার সময়, আমাদের মাথায় প্রায়ই বেসিক নেটওয়ার্ক লিঙ্ক বা ব্লুটুথ হেডসেটের কথা আসে।

  • Android-এ কানেক্টিভিটি এর চেয়ে অনেক বেশি বিস্তৃত।

  • এটি আসলে ডিভাইসগুলিকে একসাথে আরও ভালভাবে কাজ করার জন্য তৈরি করা হয়েছে।

  • আজ, আমরা সাধারণ ক্রস-ডিভাইস পরিস্থিতিগুলি দেখব এবং আপনাকে দেখাব যে প্রতিটির জন্য কোন API সঠিক।

  • অনেক দিন ধরে, আমরা শুধুমাত্র একটি ডিভাইসের জন্য অ্যাপ তৈরি করতাম, শুধু ফোন।

  • তারপর হালকা ও ছোট ডিভাইস জনপ্রিয় হয়ে ওঠে।

  • শীঘ্রই ফোনের সাথে স্মার্টওয়াচ পেয়ার করা, ব্যাকগ্রাউন্ডে ডেটা সিঙ্ক করা বা সরাসরি কল রিসিভ করার মতো ফিচার খুবই সাধারণ হয়ে ওঠে।

  • ইয়ার-- ওয়্যারলেস ইয়ারবাড যোগ করো।

  • এখন, ব্যবহারকারীরা কল চলাকালীন অডিও ডিভাইস পরিবর্তন করতে পারবেন, স্মার্টওয়াচ থেকে ফোন, ইয়ারবাড বা গাড়িতে অডিও পরিবর্তন করতে পারবেন।

  • আরও সম্প্রতি, অনেক ব্যবহারকারী ফোল্ডেবল বা ট্যাবলেটের মতো দ্বিতীয় বড় স্ক্রিনের ডিভাইসও সাথে রাখেন।

  • তারা আশা করেন যে অ্যাপটি এইসব ডিভাইসে নির্বিঘ্নে কাজ করবে।

  • এবং এটি ল্যাপটপ ও Chromebook-এর ক্ষেত্রেও প্রযোজ্য, যেখানে ব্যবহারকারী Android অ্যাপ চালাতে এবং নিজের ডেস্ক থেকেই কানেক্টেড থাকতে পারবেন।

  • এমনকি ২০২৩ সালেও, একজন গড় ব্যবহারকারীর কাছে তিন থেকে চারটি ডিভাইস ছিল।

  • ব্যবহারকারীরা এইসব ডিভাইসে শুধু স্ট্যান্ডঅ্যালোন কার্যকারিতার চেয়ে আরও বেশি কিছু আশা করেন।

  • তারা অসাধারণভাবে একসাথে-আরও-ভালো অভিজ্ঞতা খোঁজে।

  • একসাথে থাকার অভিজ্ঞতা আরও ভাল হয় যখন লোকজন একই রুমে থাকেন, যেমন আমরা আজ আছি এবং তাদের পাশে থাকা লোকজনের সাথে ফটো, লিঙ্ক বা অ্যাপ শেয়ার করার সহজ উপায় চান।

  • পরিসংখ্যান অনুযায়ী, ইকোসিস্টেমটি বিশাল এবং দ্রুত বৃদ্ধি পাচ্ছে।

  • এই বছরে, বিশ্বব্যাপী প্রায় ২২ বিলিয়ন IoT ডিভাইস রয়েছে, যা বছরের পর বছর ১৪% বৃদ্ধি পাচ্ছে।

  • এইসব এন্ড পয়েন্টের মধ্যে, ওয়াই-ফাই এক-তৃতীয়াংশ এবং ব্লুটুথ এক-চতুর্থাংশ।

  • ক্রস-ডিভাইস কানেক্টিভিটি এখন আর কোনও বিরল ঘটনা নয়।

  • এটি আমাদের দৈনন্দিন জীবনের অংশ।

  • আজও বেশিরভাগ অ্যাপ লো-লেভেল নেটওয়ার্ক ও ব্লুটুথ API-এর উপর ভিত্তি করে ক্রস-ডিভাইস ফিচার তৈরি করে, যার ফলে তিনটি সমস্যার সৃষ্টি হয়।

  • প্রথমে, ব্যাটারি ও মেমরি।

  • ব্যাকগ্রাউন্ড স্ক্যান ও পরিষেবা চালু রাখলে ব্যাটারি ও মেমরি খরচ হয়।

  • দ্বিতীয়ত, লেটেন্সি।

  • অপ্রত্যাশিত বিলম্বের কারণে রিয়েল-টাইম কল ও ডেটা সিঙ্ক ব্যাহত হয়।

  • এবং তৃতীয়ত, কানেকশন সংক্রান্ত সমস্যা।

  • সব ডিভাইস জুড়ে খোঁজা, পেয়ার করা ও আবার কানেক্ট করার প্রসেস ম্যানেজ করা জটিল এবং এর ফলে ব্যবহারকারীর অভিজ্ঞতা সহজেই খারাপ হয়ে যায়।

  • এইসব সমস্যা থেকে মুক্তি পেতে, আমরা তিনটি প্রধান ক্ষেত্র জুড়ে উদ্দেশ্য-ভিত্তিক API তৈরি করেছি যাতে ক্রস-ডিভাইস ফিচারগুলি সত্যিই সহজ হয়।

  • আমি কম্প্যানিয়ন অ্যাপ দিয়ে শুরু করব, তারপর নটরাজ VoIP অ্যাপ কভার করবে এবং পরে ইয়াসিন P2P শেয়ারিং সম্পর্কে কথা বলবে।

কম্প্যানিয়ন অ্যাপের ওভারভিউ

  • প্রথমে কম্প্যানিয়ন অ্যাপগুলি দেখে নেওয়া যাক।

  • কম্প্যানিয়ন অ্যাপ হল এমন একটি অ্যাপ যা আপনি নিজের ফোনে ইনস্টল করেন যাতে স্মার্টওয়াচ বা গ্লুকোজ সেন্সরের মতো কম্প্যানিয়ন ডিভাইস এটির সাথে ভালভাবে কাজ করতে পারে।

  • এই বিভাগে, আমরা ব্লুটুথ-কানেক্টেড ডিভাইসের উপর ফোকাস করব।

  • সাধারণত চার ধরনের কম্প্যানিয়ন ডিভাইস হয়।

  • প্রথমত, মেডিকেল ডিভাইস, যেমন গ্লুকোজ সেন্সর এবং ভাইটাল সাইন মনিটর।

  • এবং স্মার্টওয়াচ ও ফিটনেস ব্যান্ডের মতো হালকা ও ছোট ডিভাইস।

  • দ্রুত পেয়ারিং ও স্মার্ট কন্ট্রোল সহ হেডসেট।

  • এবং গাড়ির ডিজিটাল চাবি ও হ্যান্ডস-ফ্রি কলিংয়ের মতো বিষয়ের জন্য কার কিট।

  • প্রতিটি বিভাগের নিজস্ব ব্যবহারকারীর অভিজ্ঞতা আছে, তবে সবকটির ক্ষেত্রেই, ডিভাইস ও ফোনের মধ্যে নির্ভরযোগ্য কানেকশনের উপর নির্ভর করে।

  • মেডিকেল ডিভাইসের ক্ষেত্রে, সেই কানেকশন জীবন-মরণের প্রশ্ন হতে পারে।

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

  • প্রথমে, ডিভাইস ম্যানেজমেন্ট।

  • অ্যাপটিকে আশেপাশের সবকিছুর মধ্যে সঠিক ডিভাইসটি খুঁজে বের করতে হবে, যেমন এখানে ঘড়ি, ইয়ারবাড বা স্পিকার নয় এবং তারপরে কানেক্ট করার জন্য পেয়ারিং ফ্লো শুরু করতে হবে।

  • দ্বিতীয়ত, উপস্থিতি চেক করা।

  • ডিভাইসটি কখন কাছাকাছি আছে এবং কখন নেই তা অ্যাপকে জানতে হবে।

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

  • তৃতীয়ত, কানেকশন বজায় রাখা।

  • কানেক্ট হয়ে গেলে, অ্যাপ চায় যে কানেকশন যেন নির্ভরযোগ্য ও স্থায়ী হয়।

  • কানেকশন ড্রপ হলে, যেমন ব্যবহারকারী রেঞ্জের বাইরে চলে গিয়ে আবার ফিরে এলে, অ্যাপটিকে অটোমেটিক আবার কানেক্ট করতে হবে, এমনকি সেই সময় সেটি না চললেও।

  • এবং চার নম্বর, ডেটা সিঙ্ক ও ট্রান্সফার।

  • এখানেই আসল মূল্য রয়েছে।

  • সেন্সর রিডিং সিঙ্ক করা, ফার্মওয়্যার আপডেট পুশ করা বা ডিভাইসে সেটিংস পাঠানো।

  • মেডিকেল ডিভাইসের ক্ষেত্রে এটি গুরুতর হতে পারে।

  • রিডিং মিস করার অর্থ হল অ্যালার্ট মিস করা।

  • এই সবকিছুর জন্য অ্যাপ প্রসেস চালু থাকতে হবে এবং সঠিক সময়ে কানেক্ট করতে হবে।

  • তাহলে, অ্যাপগুলি কীভাবে এই সমস্ত চাহিদা পূরণ করেছে?

  • ঐতিহ্যগতভাবে, অ্যাপগুলি ফোরগ্রাউন্ড পরিষেবার উপর অনেক বেশি নির্ভর করে।

  • এখানে একটি সাধারণ প্রয়োগ দেখানো হল।

  • আপনি আগে কখনও কম্প্যানিয়ন অ্যাপ তৈরি করে থাকলে, এটি পরিচিত বলে মনে হতে পারে।

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

    <uses-permission android:name="android.permission.BLUETOOTH_SCAN"
                     android:usesPermissionFlags="neverForLocation" />
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE_CONNECTED_DEVICE" />
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
  • তারপর আপনি অ্যাপ প্রসেস চালু রাখতে একটি স্টিকি পরিষেবা চালান।

    class BleForegroundService : Service() {
       override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
          …
          return START_STICKY
       }
    }
  • আপনি জানেন, এটি কাজ করে, তবে এর জন্য ব্যাটারি এবং মেমরি খরচ হয় কারণ পরিষেবাটি সব সময় চলে, এমনকি ডিভাইসটি কাছাকাছি না থাকলেও।

  • সেই কারণেই আমরা কম্প্যানিয়ন ডিভাইস ম্যানেজার বা সংক্ষেপে CDM তৈরি করেছি।

  • প্রথমত, ডিভাইসের উপস্থিতির ভিত্তিতে এটি আপনার অ্যাপ চালু করতে পারে এবং যতক্ষণ ডিভাইস রেঞ্জের মধ্যে থাকবে, সিস্টেম আপনার অ্যাপ প্রসেস চালু রাখবে।

  • কোনও ফোরগ্রাউন্ড সার্ভিসের প্রয়োজন নেই।

  • দ্বিতীয়ত, CDM ডিভাইস প্রোফাইল সাপোর্ট করে।

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

  • এটি ব্যবহারকারীর অভিজ্ঞতা এবং কনভার্সন রেটকে ব্যাপকভাবে উন্নত করে।

  • Android 12 থেকে স্মার্টওয়াচ প্রোফাইল এবং Android 14 থেকে স্মার্টগ্লাস প্রোফাইল উপলভ্য হয়েছে।

  • Android 17-এ, আমরা মেডিকেল ডিভাইস এবং ফিটনেস ট্র্যাকারের জন্য বিশেষভাবে দুটি নতুন প্রোফাইল যোগ করেছি।

  • এছাড়াও, শুধুমাত্র আজকের জন্য সিস্টেম অ্যাপের জন্য কিছু বিশেষাধিকারপ্রাপ্ত প্রোফাইল আছে।

  • ইকোসিস্টেম থেকে আরও বেশি চাহিদার কথা জানতে পারলে, আমরা আরও ডেভেলপারদের জন্য এগুলি উন্মুক্ত করার কথা বিবেচনা করতে পারি।

কম্প্যানিয়ন ডিভাইস ম্যানেজার ব্যবহার করে প্রয়োগ করা

  • CDM ব্যবহার করা খুবই সহজ।

  • উদাহরণ হিসেবে একটি মেডিকেল ডিভাইস ব্যবহার করা যাক।

  • প্রথমে, প্রয়োজনীয় অনুমতি ঘোষণা করুন: একটি মেডিকেল ডিভাইসের জন্য, একটি ব্যাকগ্রাউন্ডে চালানোর জন্য এবং একটি ডিভাইসের উপস্থিতি লক্ষ্য করার জন্য।

    <uses-permission android:name="android.permission.REQUEST_COMPANION_PROFILE_MEDICAL" />
    <uses-permission android:name="android.permission.REQUEST_COMPANION_RUN_IN_BACKGROUND" />
    <uses-permission android:name="android.permission.REQUEST_OBSERVE_COMPANION_DEVICE_PRESENCE" />
  • একটি বিষয় উল্লেখ করতে হবে, ফোরগ্রাউন্ড সার্ভিস প্রয়োগের ক্ষেত্রে আমরা যে অনুমতিগুলি দেখেছি, তার থেকে আলাদা, এখানে তালিকাভুক্ত সমস্ত অনুমতিগুলি সাধারণ অনুমতি, যার অর্থ হল সেগুলি ইনস্টল করার সময় মঞ্জুর করা হবে, কোনও প্রম্পট ডায়ালগ থাকবে না।

  • ব্যবহারকারীকে শুধু অ্যাসোসিয়েশন অনুমোদন করতে হবে।

  • কীভাবে সেই অ্যাসোসিয়েশন তৈরি করতে হয় তা দেখা যাক।

  • এখানে আমরা ডিভাইস ফিল্টার সহ একটি অ্যাসোসিয়েশন অনুরোধ তৈরি করি যাতে শুধুমাত্র সঠিক ডিভাইসটি দেখা যায়।

    val paringRequest = AssociationRequest.Builder()
       .addDeviceFilter(deviceFilter)
       .setSingleDevice(true)
       .setDeviceProfile(AssociationRequest.DEVICE_PROFILE_MEDICAL)
       .build()
    
    companionDeviceManager.associate(paringRequest, ContextCompat.getMainExecutor(this),
       object : CompanionDeviceManager.Callback() {
           override fun onAssociationPending(intentSender: IntentSender) {
               intentSenderLauncher.launch(IntentSenderRequest.Builder(intentSender).build())
           }
    
           override fun onAssociationCreated(associationInfo: AssociationInfo) { … }
    
           override fun onFailure(error: CharSequence?) { … }
       }
    )
  • setSingleDevice-এর মান true হিসেবে সেট করুন, কারণ আমরা শুধু একটি মিল চাই এবং প্রোফাইলটি medical হিসেবে সেট করুন।

  • তারপর অ্যাসোসিয়েটকে কল করুন।

  • CDM স্ক্যানিং ম্যানেজ করে।

  • onAssociationPending-এ, আমরা একটি IntentSender পাব।

  • এটি লঞ্চ করুন, সিস্টেম একটি অ্যাসোসিয়েশন ডায়ালগ দেখায়।

  • মেডিকেল প্রোফাইলের ক্ষেত্রে, এখানে একবার ট্যাপ করলে শুধু যে অ্যাসোসিয়েশন অনুমোদন করা হয় তা নয়, প্রোফাইলের জন্য প্রয়োজনীয় সব অনুমতিও দেওয়া হয়, এমনকি 'বিরক্ত করবে না' মোডও বাইপাস করা হয়, যা অত্যন্ত গুরুত্বপূর্ণ সতর্কতার জন্য অত্যন্ত জরুরি।

  • ব্যবহারকারী 'অনুমতি দিন' বিকল্পে ট্যাপ করলে, আমরা AssociationInfo সহ onAssociationCreated-এ যাব, যার মধ্যে একটি অ্যাসো-- একটি অ্যাসোসিয়েশন আইডি অন্তর্ভুক্ত থাকে।

  • তারপর আমরা ডিভাইসের উপ-- তারপর আমরা সেই অ্যাসোসিয়েশন আইডি দিয়ে startObservingDevicePresence কল করে ডিভাইসের উপস্থিতি পর্যবেক্ষণ করতে পারি।

  • এছাড়াও, আপনাকে এমন একটি পরিষেবা প্রয়োগ করতে হবে যা CompanionDeviceService-কে এক্সটেন্ড করে।

    class BleCompanionDeviceService : CompanionDeviceService() {
    
       override fun onDevicePresenceEvent(event: DevicePresenceEvent) {
           when (event.event) {
               DevicePresenceEvent.EVENT_BLE_APPEARED -> onDeviceAppeared(event.associationId)
               DevicePresenceEvent.EVENT_BLE_DISAPPEARED -> onDeviceDisappeared(event.associationId)
           }
       }
    
       private fun onDeviceAppeared(associationId: Int) { … }
    
       private fun onDeviceDisappeared(associationId: Int) { … }
    }
  • ডিভাইস রেঞ্জের মধ্যে এলে, আপনার অ্যাপ না চললেও সিস্টেম আপনার পরিষেবার সাথে বাইন্ড করে।

  • এবং সিস্টেম EVENT_BLE_APPEARED-এর সাথে onDevicePresenceEvent-কে কল করবে।

  • তারপর আপনি কানেক্ট ও সিঙ্ক করতে পারবেন।

  • ডিভাইসটি চলে গেলে, আপনি EVENT_BLE_DISAPPEARED পাবেন।

  • তারপর, আপনি ক্লিন-আপ করতে পারবেন।

  • সবসময় চালু থাকে এমন কোনও পরিষেবা নেই এবং শুধু চালু থাকার জন্য কোনও বিজ্ঞপ্তি নেই।

  • তবে, CDM-এর কিছু সীমাবদ্ধতা আছে যা ডেভেলপারদের মনে রাখতে হবে।

  • প্রথমত, OS ভার্সন।

  • Android 12 ও 13-এ বেশিরভাগ CDM ফিচার এসেছে।

  • তবে Android 16-এ কিছু দুর্দান্ত উন্নতি এবং Android 17-এ নতুন প্রোফাইল যোগ করা হয়েছে।

  • তাই, রানটাইমে OS ভার্সন চেক করুন এবং পুরনো ভার্সনের জন্য একটি ফলব্যাক রাখুন।

  • তবে, টার্গেট SDK প্রতি বছর বৃদ্ধি পায় এবং ন্যূনতম SDK-ও সেই অনুযায়ী পরিবর্তিত হয়।

  • অ্যাপগুলি এখন এবং ভবিষ্যতে যে মেমরি প্রেসারের সম্মুখীন হচ্ছে তা মোকাবেলা করার জন্য, আমরা অ্যাপগুলিকে যত তাড়াতাড়ি সম্ভব ফোরগ্রাউন্ড সার্ভিস থেকে CDM-এ মাইগ্রেট করার জন্য অত্যন্ত উৎসাহিত করি।

  • এছাড়াও, আপনার কাছে এমন কোনও ব্যবহারের কেস থাকলে যা বর্তমানে CDM-এর মাধ্যমে কাজ করে না, তাহলে আমাদের জানান।

  • দ্বিতীয়ত, বর্তমানে CDM ব্যাকগ্রাউন্ড স্ক্যানিং সাপোর্ট করে, কিন্তু ব্যাকগ্রাউন্ড বিজ্ঞাপন নয়।

  • আমরা খুব কমই এর প্রয়োজনীয়তা সম্পর্কে শুনি।

  • তবে, আপনার অ্যাপের যদি ব্যাকগ্রাউন্ডে ক্রমাগত বিজ্ঞাপন দেখানোর জন্য এবং পেরিফেরাল হিসেবে কাজ করার জন্য ফোনের প্রয়োজন হয়, তাহলে আমরা এই বিষয়ে আরও জানতে পারলে খুশি হব।

  • তৃতীয়ত, CDM কম-পাওয়ার স্ক্যান মোড ব্যবহার করে।

  • এটি ব্যাটারি ও মেমরির জন্য রিয়েল-টাইম রেসপন্সিভনেস কিছুটা কম করে।

  • তাই, সাথে সাথে চালু হওয়ার আশা করবেন না।

  • অবশেষে, কোনও পেলোড পিকিং নেই।

  • আপনি নির্দিষ্ট বৈশিষ্ট্য বা বিজ্ঞাপন ডেটার জন্য রেজিস্টার করতে পারবেন না।

  • কিন্তু ডিভাইস রেঞ্জের মধ্যে এলেই আপনার অ্যাপ চালু হয়ে যায়।

  • তাই, এটি কানেক্ট করতে এবং প্রয়োজন অনুযায়ী পেলোড চেক করতে পারে।

  • কম্প্যানিয়ন অ্যাপ ও CDM সম্পর্কে এইটুকুই।

  • VoIP অ্যাপের জন্য আমি Nataraj-কে দায়িত্ব দেব।

ক্রস-ডিভাইস VoIP কল সংক্রান্ত সমস্যা

  • আপনার অ্যাপের যদি কোনও ডেডিকেটেড পেরিফেরাল থাকে এবং এটি ক্রমাগত তার সাথে যোগাযোগ করে, তাহলে CompanionDeviceManager হল সঠিক টুল।

  • হ্যালো, সবাইকে স্বাগত।

  • আমি নটরাজ কে আর।

  • এখন, আমি পরবর্তী ক্রস-ডিভাইস সিনারিও সম্পর্কে কথা বলব, যা হল রিয়েল-টাইম কলিং।

  • আজকাল, মানুষ যেভাবে কল ম্যানেজ করে তা পরিবর্তিত হচ্ছে।

  • ৪০%-এর বেশি কল VoIP নেটওয়ার্কের মাধ্যমে করা হচ্ছে।

  • আর Android এক্ষেত্রে গুরুত্বপূর্ণ ভূমিকা পালন করছে।

  • আসলে, এইসব কলের ৭১% Android ডিভাইসে করা হয়, যা প্রায় প্রতিটি কলের সমান।

  • শুধু কল নয়।

  • মানুষের মালিকানাধীন ডিভাইসের ইকোসিস্টেমও ব্যাপকভাবে বৃদ্ধি পাচ্ছে।

  • Android Auto-র মাধ্যমে ২৫০ মিলিয়নের বেশি গাড়ি রাস্তায় চলছে এবং আমরা ব্যবহারকারীদের এক বিলিয়নের বেশি ব্লুটুথ ডিভাইসও পাঠাচ্ছি।

  • ইয়ারবাড, Wear OS স্মার্টওয়াচ, Android-- Android Auto সহ গাড়ি, ব্লুটুথ স্পিকার হল এমন ডিভাইস যা ব্যবহারকারীরা ফোনের সাথে ব্যবহার করেন এবং তারা চান যে তাদের কল যেন এইসব ডিভাইসে নির্বিঘ্নে ট্রান্সফার করা যায়।

  • যেমন, ব্যবহারকারী কোনও কল পেলে, কলারের তথ্য জানতে তিনি তার ঘড়ির দিকে এক ঝলক তাকাবেন।

  • তিনি তার স্মার্টওয়াচ থেকে কলের উত্তর দেবেন।

  • প্রয়োজন অনুযায়ী তারা মিউট বা আনমিউট করতে পারবেন এবং ইয়ারবাড কানে দিয়ে কল চালিয়ে যেতে পারবেন।

  • তারা বাইরে যেতে চাইলে, তাদের কলে পপ-ইন করবে-- তারা তাদের গাড়িতে পপ-ইন করবে এবং তারা আশা করবে যে তাদের কল নির্বিঘ্নে গাড়ির কেবিনে পাল্টে যাবে।

  • তাই, এটি ব্যবহারকারীর কাছে একটি সাধারণ রুটিন হয়ে উঠেছে এবং এটি কোনও প্রিমিয়াম অভিজ্ঞতা নয়।

  • ব্যবহারকারীর জন্য এটি একটি প্রাথমিক প্রয়োজনীয়তা এবং আমাদের VoIP অ্যাপে ব্যবহারকারীদের সেই নির্বিঘ্ন অভিজ্ঞতা প্রদান করা Android ডেভেলপারদের দায়িত্ব।

  • কিন্তু আপনি যদি এই সমস্ত কিছু নিজে থেকে তৈরি করার চেষ্টা করেন, তাহলে আপনাকে তিনটি বড় সমস্যার সম্মুখীন হতে হবে।

  • প্রথমত, ব্লু-- ব্লুটুথ সকেটের সাথে ফ্র্যাগমেন্টেশন।

  • যেহেতু সিস্টেম জানে না যে আপনার কল একটি কল ম্যানেজ করছে, তাই আপনি কাস্টম ব্লুটুথ সকেট এবং কাস্টম মিডিয়া সেশন তৈরি করবেন যাতে আপনার কলটি স্মার্টওয়াচ বা Android Auto-তে প্রজেক্ট করা যায়।

  • দ্বিতীয় সমস্যাটি হল অডিও ফোকাস।

  • কারণ আপনাকে লো-লেভেল AudioManager API এবং Bluetooth API নিয়ে কাজ করতে হয়, অডিও লিক হয় এবং এটি সিস্টেমের জন্য অগ্রাধিকার নয়, তাই তো?

  • আপনার অ্যাপে VoIP কল চলছে, তাই যখনই কোনও ক্যারিয়ার কল আসে, এটি বাধা সৃষ্টি করে এবং মডেম অডিও বন্ধ করে দেয়, যার ফলে আপনার অ্যাপে কোনও অডিও থাকে না।

  • সবচেয়ে খারাপ হল, সেলুলার কল শেষ হয়ে গেলেও, অডিও ফোকাস আপনার অ্যাপে ফিরে আসবে না।

  • এবং তৃতীয় সমস্যাটি হল সিঙ্ক্রোনাইজেশন।

  • ব্যবহারকারী তার স্মার্টওয়াচে মিউট করার বিকল্পে ট্যাপ করলেও, ফোনের UI-তে কলটি আনমিউট করা আছে বলে দেখানো হবে।

  • এর ফলে খুব বিভ্রান্তি তৈরি হয়।

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

  • এটি হলে ব্যবহারকারী খুবই হতাশ হন, তাই না?

Jetpack Telecom-এর সাথে পরিচয় করানো হচ্ছে

  • তাই, এই সব সমস্যার সঠিক সমাধান করতে, আমরা Jetpack Telecom তৈরি করেছি।

  • তাই, আপনি CallsManager ব্যবহার করে Jetpack Telecom-এর মাধ্যমে একবার আপনার কল রেজিস্টার করেন এবং Jetpack Telecom একটি সেন্ট্রাল সিস্টেম কল কোঅর্ডিনেটর হিসেবে কাজ করে।

  • এটি আপনার কল স্মার্টওয়াচ, Android Auto এবং ব্যবহারকারীর মালিকানাধীন অন্যান্য রিমোট সারফেসে প্রজেক্ট করার দায়িত্ব নেয়।

  • এছাড়াও, এটি অডিও ফোকাস ম্যানেজ করে।

  • সবচেয়ে গুরুত্বপূর্ণ হল, Android 8 পর্যন্ত সব ভার্সনে এই ফিচারগুলি নির্বিঘ্নে কাজ করে।

  • কলটি ঘড়ি বা গাড়ির স্ক্রিনে প্রোজেক্ট করা হল অর্ধেক কাজ, কারণ ব্যবহারকারী অবশ্যই এইসব ডিভাইস থেকে কলের স্ট্যাটাস কন্ট্রোল করতে চাইবেন।

  • তারা স্মার্টওয়াচ থেকে কল মিউট করতে বা প্রয়োজন অনুযায়ী আনমিউট করতে চান।

  • তারা গাড়ির স্টিয়ারিং কলাম থেকে বা ইয়ারবাডে ডবল ট্যাপ করে কল কেটে দিতে চান।

  • তাই, Jetpack Telecom এই হার্ডওয়্যার ইভেন্ট শোনে এবং সেগুলি কলব্যাক হিসেবে এক জায়গায় দেখায়, যা হল CallControlScope।

  • আপনাকে শুধু এইসব কলব্যাক শুনতে হবে, আপনার কল ইঞ্জিন ম্যানেজ করতে হবে এবং সেই অনুযায়ী কলের স্ট্যাটাস আপডেট করতে হবে।

  • এবং Jetpack Telecom ডিভাইসগুলির মধ্যে এই কল স্টেট সিঙ্ক্রোনাইজ করার দায়িত্ব নেয়।

  • তাই, লাইব্রেরিটি দুটি উপায়ে সুবিধা প্রদান করে।

  • প্রথমত, এটি আমরা যেসব সমস্যার কথা বলেছি সেগুলি সমাধান করে।

  • তাই, আপনাকে লো-লেভেল AudioManager API নিয়ে কাজ করতে হয় না, লাইব্রেরি ডিক্লারেটিভ কল এন্ডপয়েন্ট দেয়, এটি অডিও ফোকাস ম্যানেজ করে, এটি ডিভাইসের মধ্যে সিঙ্ক করে।

  • এটি ডিভাইসগুলির মধ্যে কল হ্যান্ডওভার করার দায়িত্ব নেয়।

  • আর যখনই কোনও সেলুলার কল আসে, এটি সেটিরও যত্ন নেয়।

  • তবে, লাইব্রেরির সাথে আসা অন্যান্য সুবিধা হল, লাইব্রেরিটি Kotlin-এর উপরে তৈরি করা হয়েছে, তাই আপনি যখনই Jetpack Telecom-এর সাথে কল যোগ করেন, এটি একটি Kotlin coroutine স্কোপ খুলে দেয়।

  • তাই, এটি Kotlin Coroutines-এর সুবিধা নেয় এবং Kotlin Coroutine ঠিক কল চলাকালীন সময় পর্যন্ত চালু থাকে।

  • তাই, কলের সাথে সম্পর্কিত কোনও কাজ আপনি রান করলে, কল ডিসকানেক্ট হওয়ার সাথে সাথেই তা অটোমেটিক মুছে যায়।

  • তাই, আপনার কোনও রোগ জব থাকবে না এবং কল লাইফসাইকেলও লাইব্রেরি দ্বারা ম্যানেজ করা হয়।

  • তাহলে, এখন আপনি ভাবছেন যে এই অসাধারণ লাইব্রেরিটি দারুণ এবং আপনি এটি প্রয়োগ করতে চান, তাই তো?

  • আর এটি ১ ২ ৩-এর মতোই সহজ।

  • প্রথম ধাপ হল, আপনাকে অবশ্যই ডিপেন্ডেন্সি ঘোষণা করতে হবে।

  • তারপরে, প্রয়োজনীয় অনুমতি ঘোষণা করুন, যা হল MANAGE_OWN_CALLS এবং তারপরে, CallsManager অবজেক্ট ইনস্ট্যান্টিয়েট করুন।

    <uses-permission android:name="android.permission.MANAGE_OWN_CALLS" />
  • CallsManager অবজেক্ট ইনস্ট্যান্টিয়েট করার পরে, আপনার অ্যাপের মাধ্যমে যেসব সুবিধা দিতে চান, যেমন ভিডিও কলিং বা কল স্ট্রিমিং, সেগুলি সহ আপনার অ্যাপ রেজিস্টার করুন।

    // Initialize CallsManager & register supported capabilities once
    val callsManager = CallsManager(context)
    
    callsManager.registerAppWithTelecom(
        capabilities = CallsManager.CAPABILITY_SUPPORTS_VIDEO_CALLING or
                       CallsManager.CAPABILITY_SUPPORTS_CALL_STREAMING
    )
  • তারপরে, ধাপ নম্বর ২।

  • আপনি এখন Jetpack Telecom-এর সাথে আপনার অ্যাপ রেজিস্টার করেছেন, এখন ইনকামিং ও আউটগোয়িং কল ম্যানেজ করার সময় এসেছে।

  • তার জন্য, আপনাকে একটি CallAttributesCompat অবজেক্ট তৈরি করতে হবে, যা কলের মেটাডেটা ধারণ করে, যেমন কলার বা কলির displayName, ঠিকানা, যা হল কলার এন্ডপয়েন্ট, দিকনির্দেশ, কলটি ইনকামিং কল নাকি আউটগোয়িং কল তা নির্দিষ্ট করে যাতে Jetpack Telecom এই রিমোট সারফেসে সংশ্লিষ্ট UI উপস্থাপন করতে পারে এবং তারপর, callType, এটি একটি অডিও কল নাকি ভিডিও কল যাতে আপনি প্রয়োজনীয় রিসোর্স পেতে পারেন।

    val attributes = CallAttributesCompat(
        displayName = "Kukk Nat",
        address = Uri.parse("tel:+16505550199"),
        direction = CallAttributesCompat.DIRECTION_INCOMING,
        callType = CallAttributesCompat.CALL_TYPE_AUDIO_CALL
    )
    
    callsManager.addCall(
        attributes, onAnswer, onDisconnect, onSetActive, onSetInactive
    ) {
        // Coroutine CallControlScope active for the duration of the call
    }
  • মেটাডেটা অবজেক্ট তৈরি হয়ে গেলে, callsManager.addCall পদ্ধতি ব্যবহার করে এটি যোগ করুন।

  • এটি কল কন্ট্রোল কোরুটিন স্কোপ খুলে দেয়।

  • তাহলে, আপনার কল যোগ করা হয়ে গেলে, এবার, ধাপ ৩।

  • ধাপ ৩ হল, সেইসব রিমোট সারফেস থেকে ব্যবহারকারী যেসব অ্যাকশন পারফর্ম করতে চলেছেন তা শোনা।

  • তাই, আপনার কাছে CallControlScope আছে বলে, আপনাকে শুধু Kotlin ফ্লো সংগ্রহ করতে হবে।

    callsManager.addCall(attributes, onAnswer, onDisconnect, onSetActive, onSetInactive) {
        // 1. React to hardware mute toggles from Watch, Car, or Headset
        launch {
            isMuted.collect { muted -> audioEngine.setMicMuted(muted) }
        }
    
        // 2. Observe available endpoints & request declarative switches
        launch {
            currentCallEndpoint.collect { endpoint -> updateUi(endpoint) }
        }
        requestEndpointChange(preferredBluetoothEndpoint)
    }
  • ব্যবহারকারী যখনই সেইসব রিমোট সারফেস থেকে কল মিউট করেন, আপনি প্রতিক্রিয়া জানাতে isMuted সংগ্রহ করেন এবং সেই অনুযায়ী, আপনার কলের স্ট্যাটাস আপডেট করতে পারেন।

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

  • আপনি ফোনের UI-তে সেই নির্দিষ্ট ডিভাইসটি দেখাতে পারবেন।

  • এবং ব্যবহারকারী যখনই একটি ডিভাইস থেকে অন্য ডিভাইসে পরিবর্তন করতে চান, তখন ব্যবহারকারী যে পছন্দের এন্ডপয়েন্ট চান তার সাথে requestEndpointChange পদ্ধতি কল করুন।

  • এটি এতটাই সহজ।

  • এই তিনটি ধাপের মাধ্যমে, আপনার অ্যাপটি ব্যবহার করার জন্য প্রস্তুত এবং Jetpack Telecom ইন্টিগ্রেট করা হয়েছে।

  • কিন্তু শুধু তাই নয়।

  • Jetpack Telecom 1.1.0-এর মাধ্যমে আমরা আরও অনেক ফিচার নিয়ে আসছি, যেমন একত্রিত করা কলের ইতিহাস, যার অর্থ হল আপনার সব VoIP কল এখন সিস্টেম ডায়ালারে নেটিভভাবে দেখা যাবে।

  • সুতরাং, এর সুবিধা হল আপনার ব্যবহারকারীরা আপনার সিস্টেম ডায়ালার থেকে সরাসরি আপনার অ্যাপে ওয়ান-ট্যাপ কল ব্যাক ইনস্ট্যান্টিয়েট করতে পারবেন।

  • তাই, সব অ্যাপের মধ্যে থেকে আপনার নির্দিষ্ট অ্যাপটি খুঁজে বের করার প্রয়োজন নেই।

  • তারা সিস্টেম ডায়ালার থেকে কল ব্যাক ইনস্ট্যান্টিয়েট করতে পারেন, যা তারা সবাই ব্যবহার করেন।

  • তবে কিছু ক্ষেত্রে, তবে আপনি যদি, তবে আমরা গ্র্যানুলার কন্ট্রোলও প্রদান করছি।

  • আপনি যদি কোনও কল বা নির্দিষ্ট কোনও কল সিস্টেমে লগ করতে না চান, তাহলে আপনাকে শুধু CallAttributesCompat অবজেক্টের মধ্যে isLogExcluded ফ্ল্যাগকে 'সত্য' হিসেবে সেট করতে হবে।

  • আমি আগে যে মেটা ডেটা অবজেক্টের কথা বলেছি, আপনি শুধু সেটি 'সত্য' হিসেবে সেট করুন এবং আপনার কল সিস্টেমে লগ করা হবে না এবং এটি সিস্টেম ডায়ালারে দেখানো হবে না।

  • আর 1.1.0-এর সাথে যে দ্বিতীয় দুর্দান্ত ফিচার আসতে চলেছে তা হল 5G নেটওয়ার্ক স্লাইসিং।

  • তাই, কাজ করে এমন পরিষেবা প্রদানকারী নেটওয়ার্কে, নেটওয়ার্ক আপনাকে প্রিমিয়াম নেটওয়ার্ক স্লাইস প্রদান করে, যার অর্থ হল, কোনও নির্দিষ্ট ব্যবহারের ক্ষেত্রে, পরিষেবা প্রদানকারী আপনাকে এমন একটি নেটওয়ার্ক স্লাইস দেবে যার লেটেন্সি কম এবং কোনও বাধা নেই, যাতে আপনি আরও ভাল কোয়ালিটি এবং আরও ভাল অভিজ্ঞতা পেতে পারেন।

  • তাই, কাজ করে এমন পরিষেবা প্রদানকারীর নেটওয়ার্কে, আপনি এই ফিচারটি আউট-অফ-দ্য-বক্স পাবেন, তাই আপনার তরফ থেকে কোনও অতিরিক্ত প্রচেষ্টার প্রয়োজন নেই, এমনকি কোডের একটি লাইনও নয়।

  • আপনি লাইব্রেরি ইন্টিগ্রেট করার পরে, আপনার কল সেইসব নেটওয়ার্ক স্লাইসের সুবিধা নেবে এবং আপনি আরও ভাল লেটেন্সি ও পারফর্ম্যান্স পাবেন।

  • কিন্তু কোনও কারণে আপনি এই ফিচার ব্যবহার করতে না চাইলে, CAPABILITY_OPT_OUT_OF_PREMIUM_NETWORK ফ্ল্যাগ ব্যবহার করে এটি বন্ধ করে দিতে পারেন।

  • Google Meet, WhatsApp, KakaoTalk এবং Zoho Arattai-এর মতো শীর্ষস্থানীয় গ্লোবাল কমিউনিকেশন অ্যাপে Jetpack Telecom ইতিমধ্যেই প্রয়োগ করা হয়েছে।

  • তাই, এখন আপনার অ্যাপে এই লাইব্রেরি ইন্টিগ্রেট করা এবং ব্যবহারকারীকে সেই বাধাহীন আরও ভালো অভিজ্ঞতা প্রদান করার দায়িত্ব আপনার।

  • রিয়েল-টাইম কলিংয়ের ব্যাপারে তো জানা গেল, এবার আমি আমার সহকর্মী ইয়াসিনকে অনুরোধ করব, 'শেয়ার করতে ট্যাপ করুন' ফিচার সম্পর্কে কিছু বলতে।

  • ধন্যবাদ।

পিয়ার-টু-পিয়ার শেয়ারিং সংক্রান্ত চ্যালেঞ্জ

  • ঠিক আছে বন্ধুরা, আমি জানি আপনারা একটু ক্লান্ত, তাই চিন্তা করবেন না, এটি শেষ বিভাগ।

  • তাই, আমি পিয়ার-টু-পিয়ার ফাইল শেয়ারিংয়ের ব্যাপারে বলব, তবে পিয়ার-টু-পিয়ার শেয়ারিংয়ের মাধ্যমে আমরা অন্যান্য কাজও করতে পারি।

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

  • আর এই সব ফাইল বেশিরভাগ সময় ক্লাউডের মাধ্যমে শেয়ার করা হয়, তাই আপনি ছবি তোলেন, আপনার পছন্দের পরিষেবার মাধ্যমে সেটি আপলোড করেন এবং তারপর অন্য ব্যক্তিকে একই পদ্ধতিতে সেটি ডাউনলোড করতে হয়।

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

  • আপনি ভুল করতে পারেন এবং সেটি খুব একটা ভালো অভিজ্ঞতা নয়, বিশেষ করে যখন আপনারা দুজনেই একে অপরের পাশে বসে আছেন, তাই এটি এমন, ওহ, আমাকে ক্লাউডের মাধ্যমে পাঠাতে হবে, আমাকে অপেক্ষা করতে হবে।

  • এটা খুব একটা ভাল নয়।

  • আজকাল আমাদের সকলের কাছেই বিভিন্ন ধরনের ফ্যান্সি ফোন, ডিভাইস, ট্যাবলেট, ফোল্ডেবল ফোন আছে এবং আমরা সেগুলিতে দারুণ সব ছবি তুলি।

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

  • আপনার প্রিমিয়াম ডিভাইসে আপনি এই ধরনের অভিজ্ঞতা পেতে চান না।

  • দ্বিতীয়ত, ফাইলগুলি এখন বেশ বড়।

  • একটি ছবির সাইজ সহজেই ১০ এমবি হতে পারে, ৫ মিনিটের ভিডিওর সাইজ ৫০০ এমবির মতো হতে পারে, তাই এইসব আপলোড ও ডাউনলোড করতে বেশ সময় লাগে।

  • এবং সবশেষে, অন্য দিকে, আপনাকে সেই লেটেন্সির জন্য অপেক্ষা করতে হবে।

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

  • তাই, এইসব ফাইল শেয়ার করার জন্য ক্লাউডের উপর নির্ভর করা এবং তার জন্য অপেক্ষা করার পরিবর্তে, ব্লুটুথ বা ওয়াই-ফাইয়ের মতো লোকাল নেটওয়ার্ক ব্যবহার করা যেতে পারে।

  • কিন্তু আপনি যদি নিজে থেকে এটি করতে চান, তাহলে আপনাকে ব্লুটুথ ম্যানেজার, ওয়াই-ফাই ম্যানেজার, নিজের প্রোটোকল লেখার মতো বিষয়গুলি নিয়ে কাজ করতে হবে। আমি বলতে চাইছি যে, সবাই এই ধরনের কাজ করতে চায় না।

  • কিন্তু আসলে, Android-এ আগে থেকেই কিছু আছে।

  • এটি আগে থেকেই উপলভ্য এবং আপনি হয়ত 'দ্রুত শেয়ার' সম্পর্কে শুনেছেন।

'দ্রুত শেয়ার' ফিচার এক নজরে

  • Android-এ 'দ্রুত শেয়ার' ফিচার আপনাকে সিস্টেমে আগে থেকেই এই অ্যাবস্ট্রাকশন রাখার সুবিধা দেয় এবং আপনি অন্য ডিভাইসের সাথে ফাইল শেয়ার করতে পারেন এবং আপনাকে এই সব ম্যানেজ করতে হয় না।

  • এটি আপনার শেয়ার শিটে আগে থেকেই উপলভ্য এবং এটি দুটি ডিভাইসের মধ্যে আপনার ডিভাইসের জন্য কোন প্রোটোকলটি সবচেয়ে ভালো তা পরিবর্তন করছে এবং এটি Marshmallow এবং তার পরবর্তী ভার্সনে উপলভ্য, যা আজকাল, বেশ বিশাল সংখ্যক দর্শক, তাই না?

  • এবং সবশেষে, আপনি পাশে যে পরিচিত UI এবং UX দেখতে পান, তা আপনার ব্যবহারকারীদের সত্যিই সাহায্য করে।

  • তাই, তারা UI সম্পর্কে জানেন, তাদের এটি কীভাবে ব্যবহার করতে হয় তা শিখতে হয় না, তারা আগে থেকেই এটি দেখেছেন।

  • তবে আমরা জানি যে ডেভেলপাররা, তারা সবাই অভিজ্ঞতাও নিজের করে নিতে চান।

  • আপনি নিজের অ্যাপ সম্পর্কে জানেন, সম্ভবত আপনি আপনার ব্যবহারকারীদের আমাদের চেয়ে ভালো জানেন।

  • তাহলে, আপনার অ্যাপে সরাসরি 'দ্রুত শেয়ার' ফিচার কেন নেই?

  • তাই, আমরা ডেভেলপারদের সাথে কথা বলতে শুরু করেছি এবং আমরা দেখেছি যে 'দ্রুত শেয়ার' ফিচার ইতিমধ্যেই বেশ ব্যাপকভাবে ব্যবহার করা হচ্ছে।

  • এটি Android, Chromebook, সম্প্রতি Google Books এবং Windows-এও উপলভ্য, যা ৩ বিলিয়নেরও বেশি ডিভাইস, এটি বিশাল।

  • এছাড়াও, Pixel 11-এ আমরা 'শেয়ার করতে ট্যাপ করুন' ফিচার নিয়ে এসেছি।

  • তাই, আপনি যে ডিভাইসের সাথে শেয়ার করতে চান সেটি বেছে নেওয়ার পরিবর্তে, আপনি শুধু ট্যাপ করতে পারেন এবং NFC-এর মাধ্যমে আমরা সরাসরি আপনার জন্য সেই খুঁজে নেওয়ার যোগ্যতা প্রদান করছি।

  • তাই, আপনি কোনও ফটো বেছে নিতে পারেন, তবে আপনি কোনও ফাইলও বেছে নিতে পারেন, আপনি শুধু দুটি ডিভাইসে ট্যাপ করুন এবং সেগুলি সরাসরি বাম্পের মাধ্যমে শেয়ার করা হয়।

  • আবার, আমরা এমন ডেভেলপারদেরও চিনি যারা অভিজ্ঞতা নিজেদের নিয়ন্ত্রণে রাখতে চান।

  • আমরা জানি যে আপনার ব্যবহারকারীদের জন্য কোনও নির্দিষ্ট ফিচার ব্যবহার করার এটিই সেরা উপায়, এই ক্ষেত্রে, ফাইল শেয়ারিং।

  • তাহলে, আপনার অ্যাপে 'দ্রুত শেয়ার' ফিচার এম্বেড করা নেই কেন?

  • তাই, আগামী বছর আমরা সরাসরি আপনার জন্য'দ্রুত শেয়ার' SDK নিয়ে আসছি।

  • আপনি এটি সরাসরি আপনার অ্যাপে ব্যবহার করতে পারবেন এবং এটি আগে থেকেই নিরাপত্তা সহ আসে, যেমন দুটি ডিভাইসের মধ্যে এন্ড-টু-এন্ড এনক্রিপশন।

  • এইসব লোকাল নেটওয়ার্কের মধ্যে ট্রান্সফার হয় বলে, আপনি সম্পূর্ণ স্পিড পাবেন, অবশ্যই আপনার বাড়ির ওয়াই-ফাইতে, তবে আপনাদের দুজনের মধ্যে একটি হটস্পট অটোমেটিক তৈরি হয়ে যেতে পারে, আপনাকে এটি নিয়ে চিন্তা করতে হবে না।

  • এবং যেসব ডিভাইসে Wi-Fi ডাইরেক্ট কাজ করে, সেগুলিতে এটি আগে থেকেই অন্তর্ভুক্ত থাকে।

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

  • আর যেহেতু এটি লোকাল নেটওয়ার্কের উপর নির্ভর করে, তাই আপনি টিউবেও এটি ব্যবহার করতে পারবেন, এমনকি টিউবের সবচেয়ে গভীর অংশেও আপনার বন্ধুর সাথে শেয়ার করার জন্য নেটওয়ার্ক পাবেন।

  • এমনকি বিমানেও, আপনি কত হাজার ফুট উপরে থাকবেন, আমি জানি না, আকাশে, এবং আপনি এখনও সেই ফাইলগুলি শেয়ার করতে পারবেন।

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

  • এছাড়াও, আপনার নিজস্ব সার্ভারে, আপনাকে এটি বজায় রাখতে হবে না।

  • গত বছর আমরা ডেভেলপার ও ব্যবহারকারীদের জানিয়েছিলাম যে 'দ্রুত শেয়ার' ফিচারের মাধ্যমে তারা AirDrop ব্যবহার করে iPhone ডিভাইসে ফাইল শেয়ার করতে পারবেন।

  • 'দ্রুত শেয়ার' ফিচারের মাধ্যমে আমরা ডেভেলপারদের জন্য একই সুবিধা নিয়ে আসছি।

  • আমরা ডেভেলপারদের জন্য একটি 'দ্রুত শেয়ার' iOS SDK নিয়ে আসতে চলেছি, যাতে iOS অ্যাপ আছে এমন ডেভেলপাররা ডিভাইস নির্বিশেষে দুটি প্ল্যাটফর্মের মধ্যে ফাইল শেয়ার করতে পারেন।

  • সুতরাং, এগুলি সবই হল ফ্যান্সি প্রেজেন্টেশন, এখন, আসুন কোডটি দ্রুত দেখে নেওয়া যাক।

  • আমরা এটি যতটা সম্ভব সহজ করার চেষ্টা করেছি।

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

    // Final API may undergo further updates
    val quickShareClient = QuickShareClient.create(activity)
    val attachment = FileAttachment(
      fileName = "report.pdf",
      size = 1_048_576L,
      uri = fileUri,
      mimeType = "application/pdf",
      // Sensitive content will be masked in preview
      isSensitiveContent = false,
    )
    
    val content = ShareableContent.withFiles(listOf(attachment))
    val request = SharingRequest.withContent(content)
    val session = quickShareClient.startSharingSession(request, lifecycleOwner)
  • আপনি যখন আবার আপনার অ্যাপে কোনও ফাইল পেতে চান, একই জিনিস, অবশ্যই, এই ক্ষেত্রে, আপনি কোনও অ্যাটাচমেন্ট যোগ করছেন না এবং তারপরে সেশন শুরু হওয়ার সাথে সাথেই আপনাকে এর কোনওটি নিয়েই ডিল করতে হবে না।

    // Final API may undergo further updates
    val quickShareClient = QuickShareClient.create(activity)
    val request = SharingRequest.withoutContent()
    val session = quickShareClient.startSharingSession(request, lifecycleOwner)
    
    // Open the Quick Share overlay in receive mode
    session.launchWindow(activity, contentSelectionIntent = null)
  • এখনও পর্যন্ত, আপনি যা দেখেছেন তা হল আক্ষরিক অর্থে দু'দিকে মাত্র ২০ লাইনের কোড।

  • আমরা জানি, 'দ্রুত শেয়ার' ও 'শেয়ার করতে ট্যাপ করুন' ফিচারের মাধ্যমে, শুধু ডিভাইস স্পর্শ করে ফাইল শেয়ার করার সুবিধা আসলে একটি নতুন ব্যবহারের কেস চালু করে।

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

    // Final API may undergo further updates
    val quickShareClient = QuickShareClient.create(activity)
    val urlAttachment = TextAttachment(
      text = groupAddUrl,
      type = TextAttachment.Type.URL,
    )
    
    val content = ShareableContent.withText(urlAttachment)
    val appLink = AppLink("https://myapp.com/group/invite")
    val request = SharingRequest.withContent(content, appLink)
    val session = quickShareClient.startSharingSession(request, lifecycleOwner)
  • তাই, যে ডিভাইসে ফাইল পাঠানো হচ্ছে সেখানে আপনাকে আবার অ্যাপ খুলতে হবে না।

  • 'শেয়ার করতে ট্যাপ করুন' ফিচারের মাধ্যমে এটি অটোমেটিক খুলে যাবে।

  • এবং অবশ্যই, আপনি যদি চান যে আপনার UI সেই ফাইল ট্রান্সফারে প্রতিক্রিয়া জানাক, তাহলে আপনার কাছে শুধু একটি Kotlin Flow থাকবে এবং আপনার কাছে সমস্ত ইভেন্ট থাকবে যাতে আপনি এটি প্রসেস করতে পারেন।

    // Final API may undergo further updates
    scope.launch {
      for (event in session.sharingEvents) {
        when (event) {
          is SharingEvent.SendComplete ->
            println("Send finished")
          is SharingEvent.ReceiveComplete ->
            println("Received, files=${event.content?.files?.size}")
          else -> println("other event")
        }
      }
    }

সারসংক্ষেপ ও কথোপকথন বন্ধ করা

  • আজ আমরা অনেক কিছু দেখেছি, তাই আমি এবার শেষ করছি।

  • চিন্তা করবেন না, আপনি বিরতি নেওয়ার জন্য কয়েক মিনিট সময় পাবেন।

  • Hanrui যেমন আগে দেখিয়েছেন, CompanionDeviceManager হল যেকোনও ব্লুটুথ ইন্টার‍্যাকশন, একটানা ব্লুটুথ ইন্টার‍্যাকশন ম্যানেজ করার জন্য আপনার কাছে সেরা API।

  • আপনার অ্যাপে কোনও ভয়েস ওভার IP কল থাকলে, এটি এর প্রধান ব্যবহার কেস হতে হবে না, এটি হতে পারে, উদাহরণস্বরূপ, আপনার অ্যাপের অংশ হিসেবে আপনার কাছে সাপোর্ট ক্লায়েন্ট রয়েছে যেখানে ব্যবহারকারী সাপোর্টকে কল করতে পারবেন।

  • এই ক্ষেত্রেও, Android-এ ভয়েস ওভার IP কল ম্যানেজ করার সবচেয়ে ভালো উপায় হল Jetpack Com-- Jetpack Telecom।

  • এবং সবশেষে, আমি যেমন উল্লেখ করেছি, যেকোনও পিয়ার-টু-পিয়ার ফাইল শেয়ারিং বা অ্যাপ খোলার জন্য, 'শেয়ার করতে ট্যাপ করুন' ফিচারের সাথে, 'দ্রুত শেয়ার' হল সমাধান।

  • তাই, সবাইকে ধন্যবাদ এবং যাওয়ার আগে একটি কথা, সেশন শেষ হওয়ার পরে আমরা বাইরে থাকব, আপনাদের কোনও প্রশ্ন থাকলে সেখানে করতে পারেন।

  • আমরা যে সমস্ত ব্যবহারের কেস উপস্থাপন করেছি, সেগুলির মধ্যে আপনার কোনও প্রশ্ন থাকলে, আমাদের অফিস আওয়ার্স আছে।

  • আর আপনার টক বা অন্যান্য সেশন থেকে আপনি যা শিখেছেন তা সোশ্যাল মিডিয়ায় শেয়ার করতে ভুলবেন না।

  • আমাদের #AndroidDevSummit আছে।

  • আবারও বলছি, আমাদের কাছে এটি জানা খুবই গুরুত্বপূর্ণ যে, আমরা এনগেজমেন্ট পাচ্ছি এবং লোকজন সত্যিই ইভেন্ট উপভোগ করছেন।

  • এটি আমাদের জানতে সাহায্য করে যে আমাদের অবশ্যই এমন একটি কমিউনিটি আছে যা আমরা আবার দেখতে চাই।

  • এবং আপনার সোশ্যাল চার্ম সংগ্রহ করুন যা আপনি ইনফোডেস্ক থেকে আপনার Android বট কীরিংয়ে যোগ করতে পারবেন।

  • আমি কি ঠিক করেছি?

  • ধন্যবাদ।

কোড

কোড স্নিপেট

"কম্প্যানিয়ন অ্যাপের ওভারভিউ" ভিডিওর 06:17-এ XML স্নিপেট
<uses-permission android:name="android.permission.BLUETOOTH_SCAN"
                 android:usesPermissionFlags="neverForLocation" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_CONNECTED_DEVICE" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
"কম্প্যানিয়ন অ্যাপের ওভারভিউ" ভিডিওর 06:34-এ Kotlin স্নিপেট
class BleForegroundService : Service() {
   override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
      …
      return START_STICKY
   }
}
"কম্প্যানিয়ন ডিভাইস ম্যানেজার ব্যবহার করে প্রয়োগ করা" ভিডিওর 08:03-এ XML স্নিপেট
<uses-permission android:name="android.permission.REQUEST_COMPANION_PROFILE_MEDICAL" />
<uses-permission android:name="android.permission.REQUEST_COMPANION_RUN_IN_BACKGROUND" />
<uses-permission android:name="android.permission.REQUEST_OBSERVE_COMPANION_DEVICE_PRESENCE" />
"কম্প্যানিয়ন ডিভাইস ম্যানেজার ব্যবহার করে প্রয়োগ করা" ভিডিওর 08:38-এ Kotlin স্নিপেট
val paringRequest = AssociationRequest.Builder()
   .addDeviceFilter(deviceFilter)
   .setSingleDevice(true)
   .setDeviceProfile(AssociationRequest.DEVICE_PROFILE_MEDICAL)
   .build()

companionDeviceManager.associate(paringRequest, ContextCompat.getMainExecutor(this),
   object : CompanionDeviceManager.Callback() {
       override fun onAssociationPending(intentSender: IntentSender) {
           intentSenderLauncher.launch(IntentSenderRequest.Builder(intentSender).build())
       }

       override fun onAssociationCreated(associationInfo: AssociationInfo) { … }

       override fun onFailure(error: CharSequence?) { … }
   }
)
"কম্প্যানিয়ন ডিভাইস ম্যানেজার ব্যবহার করে প্রয়োগ করা" ভিডিওর ০৯:৪৭-এ Kotlin স্নিপেট
class BleCompanionDeviceService : CompanionDeviceService() {

   override fun onDevicePresenceEvent(event: DevicePresenceEvent) {
       when (event.event) {
           DevicePresenceEvent.EVENT_BLE_APPEARED -> onDeviceAppeared(event.associationId)
           DevicePresenceEvent.EVENT_BLE_DISAPPEARED -> onDeviceDisappeared(event.associationId)
       }
   }

   private fun onDeviceAppeared(associationId: Int) { … }

   private fun onDeviceDisappeared(associationId: Int) { … }
}
"Introducing Jetpack Telecom"-এ ১৮:২৯-এ XML স্নিপেট
<uses-permission android:name="android.permission.MANAGE_OWN_CALLS" />
"Introducing Jetpack Telecom"-এ ১৮:৩৬-এ Kotlin স্নিপেট
// Initialize CallsManager & register supported capabilities once
val callsManager = CallsManager(context)

callsManager.registerAppWithTelecom(
    capabilities = CallsManager.CAPABILITY_SUPPORTS_VIDEO_CALLING or
                   CallsManager.CAPABILITY_SUPPORTS_CALL_STREAMING
)
"Introducing Jetpack Telecom" ভিডিওর ১৮:৫৫-এ Kotlin স্নিপেট
val attributes = CallAttributesCompat(
    displayName = "Kukk Nat",
    address = Uri.parse("tel:+16505550199"),
    direction = CallAttributesCompat.DIRECTION_INCOMING,
    callType = CallAttributesCompat.CALL_TYPE_AUDIO_CALL
)

callsManager.addCall(
    attributes, onAnswer, onDisconnect, onSetActive, onSetInactive
) {
    // Coroutine CallControlScope active for the duration of the call
}
"Introducing Jetpack Telecom" ভিডিওর ১৯:৪৯-এ Kotlin স্নিপেট
callsManager.addCall(attributes, onAnswer, onDisconnect, onSetActive, onSetInactive) {
    // 1. React to hardware mute toggles from Watch, Car, or Headset
    launch {
        isMuted.collect { muted -> audioEngine.setMicMuted(muted) }
    }

    // 2. Observe available endpoints & request declarative switches
    launch {
        currentCallEndpoint.collect { endpoint -> updateUi(endpoint) }
    }
    requestEndpointChange(preferredBluetoothEndpoint)
}
"কুইক শেয়ার ওভারভিউ" ভিডিওর ২৯:৩১-এ Kotlin স্নিপেট
// Final API may undergo further updates
val quickShareClient = QuickShareClient.create(activity)
val attachment = FileAttachment(
  fileName = "report.pdf",
  size = 1_048_576L,
  uri = fileUri,
  mimeType = "application/pdf",
  // Sensitive content will be masked in preview
  isSensitiveContent = false,
)

val content = ShareableContent.withFiles(listOf(attachment))
val request = SharingRequest.withContent(content)
val session = quickShareClient.startSharingSession(request, lifecycleOwner)
"কুইক শেয়ার ওভারভিউ" ভিডিওর 29:57-এ Kotlin স্নিপেট
// Final API may undergo further updates
val quickShareClient = QuickShareClient.create(activity)
val request = SharingRequest.withoutContent()
val session = quickShareClient.startSharingSession(request, lifecycleOwner)

// Open the Quick Share overlay in receive mode
session.launchWindow(activity, contentSelectionIntent = null)
"কুইক শেয়ার ওভারভিউ" ভিডিওর ৩০:২৩-এ Kotlin স্নিপেট
// Final API may undergo further updates
val quickShareClient = QuickShareClient.create(activity)
val urlAttachment = TextAttachment(
  text = groupAddUrl,
  type = TextAttachment.Type.URL,
)

val content = ShareableContent.withText(urlAttachment)
val appLink = AppLink("https://myapp.com/group/invite")
val request = SharingRequest.withContent(content, appLink)
val session = quickShareClient.startSharingSession(request, lifecycleOwner)
"কুইক শেয়ার ওভারভিউ" ভিডিওর ৩০:৪৯-এ Kotlin স্নিপেট
// Final API may undergo further updates
scope.launch {
  for (event in session.sharingEvents) {
    when (event) {
      is SharingEvent.SendComplete ->
        println("Send finished")
      is SharingEvent.ReceiveComplete ->
        println("Received, files=${event.content?.files?.size}")
      else -> println("other event")
    }
  }
}