রেডিও প্রয়োগ করুন

এই পৃষ্ঠাটি হার্ডওয়্যার এবং সফ্টওয়্যার স্তরে রেডিও কীভাবে প্রয়োগ করতে হয় তা ব্যাখ্যা করে।

সিস্টেম উপাদান

সম্প্রচার রেডিও স্ট্যাক নিম্নলিখিত উপাদান অন্তর্ভুক্ত.

ব্রডকাস্ট রেডিও আর্কিটেকচার
চিত্র 1. ব্রডকাস্ট রেডিও আর্কিটেকচার

রেডিও রেফারেন্স অ্যাপ

রেডিও নিয়ন্ত্রণ কিভাবে প্রয়োগ করতে হয় সে সম্পর্কে বিস্তারিত জানতে, রেডিও নিয়ন্ত্রণ বাস্তবায়ন দেখুন।

একটি নমুনা জাভা রেডিও অ্যাপ ( packages/apps/Car/Radio ) একটি রেফারেন্স বাস্তবায়ন হিসেবে কাজ করে। অ্যাপ পরিষেবা শুরু হলে, এটি রেডিও ম্যানেজারকে একটি রেডিও টিউনার খুলতে অনুরোধ করে। তারপরে, অ্যাপটি রেডিও টিউনারকে অনুরোধ পাঠাতে পারে, যেমন একটি নির্দিষ্ট রেডিও স্টেশনে টিউনিং, ফ্রিকোয়েন্সি বা পরবর্তী উপলব্ধ রেডিও স্টেশন খোঁজার জন্য। অ্যাপটি রেডিওতে রেডিও ম্যানেজার এবং রেডিও টিউনার থেকে আপডেট পায়, যেমন বর্তমান প্রোগ্রামের তথ্য, রেডিও প্রোগ্রাম তালিকা, কনফিগারেশন এবং বিক্রেতা-সংজ্ঞায়িত প্যারামিটার। রেফারেন্স রেডিও অ্যাপ শুধুমাত্র AM এবং FM রেডিও সমর্থন করে। OEMs ইচ্ছামতো রেডিও অ্যাপ পরিবর্তন বা প্রতিস্থাপন করতে পারে।

রেডিও ম্যানেজার

অ্যাপটি যখন একটি টিউনার খোলার জন্য রেডিও ম্যানেজারকে অনুরোধ করে, তখন রেডিও ম্যানেজার ( frameworks/base/core/java/android/hardware/radio/RadioManager.java ) একটি টিউনার সেশন খোলার জন্য ব্রডকাস্ট রেডিও পরিষেবাকে অনুরোধ করে এবং তারপরে সেশনটি মোড়ানো হয় রেডিও টিউনার ( frameworks/base/core/java/android/hardware/radio/RadioTuner.java ), যা অ্যাপে ফেরত দেওয়া হয়। রেডিও টিউনার API (যেমন সুর, পদক্ষেপ এবং বাতিল) সংজ্ঞায়িত করে যা রেডিও অ্যাপ থেকে কল করা যেতে পারে এবং ব্রডকাস্ট রেডিও পরিষেবাতে অনুরোধ পাঠাতে পারে। রেডিও টিউনারে সংজ্ঞায়িত কলব্যাক পদ্ধতিগুলি ( RadioTuner.Callback ) সম্প্রচার রেডিও HAL সম্পর্কে আপডেট পাঠায়, যেমন বর্তমান প্রোগ্রামের তথ্য, প্রোগ্রাম তালিকা এবং বিক্রেতা-সংজ্ঞায়িত প্যারামিটার, ব্রডকাস্ট রেডিও পরিষেবা থেকে অ্যাপগুলিতে।

ব্রডকাস্ট রেডিও পরিষেবা

ব্রডকাস্ট রেডিও সার্ভিস ( frameworks/base/services/core/java/com/android/server/broadcastradio ) হল ব্রডকাস্ট রেডিও HAL-এর ক্লায়েন্ট পরিষেবা। ব্রডকাস্ট রেডিও সার্ভিস একাধিক রেডিও ম্যানেজারকে ব্রডকাস্ট রেডিও HAL-এর সাথে সমন্বয় করে। ব্রডকাস্ট রেডিও সার্ভিস এইচএএল ইন্টারফেস ডেফিনিশন ল্যাঙ্গুয়েজ (এইচআইডিএল) এবং অ্যান্ড্রয়েড ইন্টারফেস ডেফিনিশন ল্যাঙ্গুয়েজ (এআইডিএল) ব্রডকাস্ট রেডিও এইচএএল সমর্থন করে। ব্রডকাস্ট রেডিও পরিষেবা AIDL HAL-এর সাথে লিঙ্ক করে যখন কোনো AIDL HAL পরিষেবা বিদ্যমান থাকে; অন্যথায়, পরিষেবাটি HIDL HAL-এর সাথে লিঙ্ক করে। ব্রডকাস্ট রেডিও পরিষেবা প্রতিটি উপলব্ধ HAL উদাহরণের জন্য একটি রেডিও মডিউল তৈরি করে (যেমন AM, FM, এবং DAB)।

প্রতিটি রেডিও ম্যানেজার রেডিওর প্রকারের উপর ভিত্তি করে সংশ্লিষ্ট রেডিও মডিউলে একটি টিউনার সেশন তৈরি করার জন্য ব্রডকাস্ট রেডিও পরিষেবাকে অনুরোধ করতে পারেন। প্রতিটি টিউনার সেশন সংশ্লিষ্ট ব্রডকাস্ট রেডিও HAL দৃষ্টান্তে ক্রিয়াকলাপ সম্পাদন করার জন্য সুর, পদক্ষেপ এবং বাতিল (HAL ইন্টারফেসে সংজ্ঞায়িত) এর মতো পদ্ধতিগুলিকে কল করতে পারে। যখন একটি টিউনার সেশন HAL আপডেটে HAL ইন্সট্যান্স থেকে একটি কলব্যাক পায়, যেমন বর্তমান প্রোগ্রামের তথ্য, প্রোগ্রামের তালিকা, কনফিগারেশন ফ্ল্যাগ এবং, ভেন্ডর প্যারামিটার, আপডেট সম্পর্কে কলব্যাকগুলি একই রেডিও মডিউলের সাথে সংযুক্ত সমস্ত রেডিও টিউনারকে পাঠানো হয়।

সম্প্রচার রেডিও HAL

ব্রডকাস্ট রেডিওর HIDL এবং AIDL ইন্টারফেস এবং উভয়ের মধ্যে পার্থক্য সম্পর্কে আরও জানতে, ব্রডকাস্ট রেডিও HAL ইন্টারফেস দেখুন।

সম্প্রচার রেডিও হার্ডওয়্যার বিমূর্ত স্তর

সম্প্রচার রেডিও বাস্তবায়নের জন্য হার্ডওয়্যার অ্যাবস্ট্রাকশন লেয়ার (HAL) এর সাথে কীভাবে কাজ করতে হয় তা নিম্নলিখিত বিভাগগুলি বর্ণনা করে।

ব্রডকাস্ট রেডিও HAL ইন্টারফেস

ব্রডকাস্ট রেডিও HAL সম্প্রচার রেডিও যেমন AM/FM এবং DAB রেডিও বাস্তবায়নের জন্য হার্ডওয়্যার স্তরে ডেটা স্ট্রাকচার এবং ইন্টারফেস প্রদান করে।

HIDL 2.0 এবং AIDL ইন্টারফেস

সম্প্রচার রেডিও HAL নিম্নলিখিত বিভাগে বর্ণিত ইন্টারফেস ব্যবহার করে।

ঘোষণা শ্রোতা

IAnnouncementListener হল ঘোষণা শ্রোতার জন্য কলব্যাক ইন্টারফেস, যা ঘোষণা গ্রহণের জন্য সম্প্রচারিত রেডিও HAL-এ নিবন্ধিত হতে পারে। ইন্টারফেসের নিম্নলিখিত পদ্ধতি রয়েছে:

আইএ ঘোষণা শ্রোতা
বর্ণনা: যখনই ঘোষণার তালিকা পরিবর্তিত হয় তখন কল করা হয়।
HIDL 2.0 oneway onListUpdated(vec<Announcement> announcements)
এআইডিএল oneway void onListUpdated(in Announcement[] announcements)
হ্যান্ডেল বন্ধ করুন

ICloseHandle হল একটি সাধারণ ক্লোজ হ্যান্ডেল যা একটি কলব্যাক অপসারণ করে যার জন্য একটি সক্রিয় ইন্টারফেসের প্রয়োজন নেই৷

আইক্লোজহ্যান্ডেল
বর্ণনা: হ্যান্ডেল বন্ধ করুন।
HIDL 2.0 close()
এআইডিএল void close()

কলব্যাক ইন্টারফেস

ITunerCallback হল একটি কলব্যাক ইন্টারফেস যা ব্রডকাস্ট রেডিও HAL দ্বারা HAL ক্লায়েন্ট পরিষেবায় আপডেট পাঠানোর জন্য ডাকা হয়।

আইটিউনার কলব্যাক
বর্ণনা: যখন একটি টিউনিং অপারেশন (টিউন, সিক (এআইডিএল) বা স্ক্যান (এইচআইডিএল-এ) এবং পদক্ষেপ সফল হয় তখন অ্যাসিঙ্ক্রোনাসভাবে ব্যর্থ হলে HAL দ্বারা ডাকা হয়।
HIDL 2.0 oneway onCurrentProgramInfoChanged(ProgramInfo info)
এআইডিএল void onCurrentProgramInfoChanged(in ProgramInfo info)
বর্ণনা: টিউন, সিক (এআইডিএল-এ) বা স্ক্যান (এইচআইডিএল-এ) বা পদক্ষেপ সফল হলে বলা হয়।
HIDL 2.0 oneway onTuneFailed(Result result, ProgramSelector selector)
এআইডিএল void onTuneFailed(in Result result, in ProgramSelector selector)
বর্ণনা: টিউন, সিক (এআইডিএল-এ) বা স্ক্যান (এইচআইডিএল-এ) বা পদক্ষেপ সফল হলে বলা হয়।
HIDL 2.0 oneway onCurrentProgramInfoChanged(ProgramInfo info)
এআইডিএল void onCurrentProgramInfoChanged(in ProgramInfo info)
বর্ণনা: প্রোগ্রাম তালিকা আপডেট করা হলে কল করা হয়; প্রতিটি খণ্ডের আকার 500kiB এ সীমাবদ্ধ হওয়া উচিত।
HIDL 2.0 oneway onProgramListUpdated(ProgramListChunk chunk)
এআইডিএল oneway onProgramListUpdated(ProgramListChunk chunk)
বর্ণনা: অ্যান্টেনা সংযুক্ত বা সংযোগ বিচ্ছিন্ন হলে কল করা হয়।
HIDL 2.0 oneway onAntennaStateChange(bool connected)
এআইডিএল void onCurrentProgramInfoChanged(in ProgramInfo info)
বর্ণনা: যখন বিক্রেতা-নির্দিষ্ট প্যারামিটার মানগুলি HAL-এ অভ্যন্তরীণভাবে আপডেট করা হয় তখন কল করা হয় (HAL ক্লায়েন্ট দ্বারা setParameters কল করার পরে আহ্বান করা উচিত নয়)।
HIDL 2.0 oneway onParametersUpdated(vec<VendorKeyValue> parameters)
এআইডিএল void onParametersUpdated(in VendorKeyValue[] parameters)
বর্ণনা: এআইডিএল-এ নতুন। HAL-এ অভ্যন্তরীণভাবে কনফিগারেশন ফ্ল্যাগ আপডেট করা হলে কল করা হয় (HAL ক্লায়েন্ট দ্বারা setConfigFlag কল করার পরে আহ্বান করা উচিত নয়)।
HIDL 2.0 প্রযোজ্য নয়।
এআইডিএল void onConfigFlagUpdated(in ConfigFlag flag, in boolean value)

প্রাথমিক সম্প্রচার রেডিও HAL ইন্টারফেস

IBroadcastRadio হল ব্রডকাস্ট রেডিও HAL-এর প্রাথমিক ইন্টারফেস। HIDL 2.0 HAL-এ, টিউনারকে কল অপারেশন করতে ITunerSession ইন্টারফেস ব্যবহার করুন। যাইহোক, এক সময়ে সর্বাধিক একটি টিউনার সক্রিয় থাকে (প্রদত্ত প্রতিটি ব্রডকাস্ট রেডিও HAL উদাহরণে শুধুমাত্র একটি টিউনার চিপ থাকে)। ITunerSession AIDL ইন্টারফেস থেকে সরানো হয়েছে এবং এর ইন্টারফেসগুলি IBroadcastRadio এ সরানো হয়েছে।

আইব্রডকাস্ট রেডিও
বর্ণনা: একটি মডিউল এবং এর ক্ষমতার বিবরণ পান।
HIDL 2.0 getProperties() generates (Properties properties)
এআইডিএল Properties getProperties()
বর্ণনা: বর্তমান বা সম্ভাব্য AM/FM অঞ্চল কনফিগারেশন নিয়ে আসে।
HIDL 2.0 getAmFmRegionConfig(bool full) generates (Result result, AmFmRegionConfig config)
এআইডিএল AmFmRegionConfig getAmFmRegionConfig(bool full)
বর্ণনা: বর্তমান DAB অঞ্চল কনফিগারেশন নিয়ে আসে।
HIDL 2.0 getDabRegionConfig() generates (Result result, vec<DabTableEntry> config)
এআইডিএল DabTableEntry[] getDabRegionConfig()
বর্ণনা: রেডিও মডিউল ক্যাশে থেকে একটি চিত্র পায়। AIDL-এ, বাইন্ডার লেনদেন বাফারের একটি হার্ড সীমার কারণে ছবির আকার অবশ্যই 1MB এর কম হতে হবে।
HIDL 2.0 getImage(uint32_t id) generates (vec<uint8_t> image)
এআইডিএল byte[] getImage(in int id)
বর্ণনা: ঘোষণা শ্রোতা নিবন্ধন.
HIDL 2.0 registerAnnouncementListener(vec<AnnouncementType> enabled,IAnnouncementListener listener) generates (Result result, ICloseHandle closeHandle)
এআইডিএল ICloseHandle registerAnnouncementListener(in IAnnouncementListener listener, in AnnouncementType[] enabled)
বর্ণনা:
  • HIDL HAL: যখন একটি নতুন টিউনার সেশন খোলা হয়, তখন পুরানো সেশনটি অবশ্যই বন্ধ করতে হবে।
  • AIDL HAL: যেহেতু কোনো টিউনার সেশন উপলব্ধ নেই, শুধুমাত্র টিউনার কলব্যাক সেট করতে হবে। এটি বিদ্যমান থাকলে, পুরানো কলব্যাকটি আনসেট করা উচিত৷
HIDL 2.0 openSession(ITunerCallback callback) জেনারেট করে (Result result, ITunerSession session)
এআইডিএল void setTunerCallback(in ITunerCallback callback)
বর্ণনা:
  • HIDL HAL: একটি টিউনার সেশন বন্ধ করা অবশ্যই ব্যর্থ হবে না এবং শুধুমাত্র একবার জারি করতে হবে।
  • AIDL HAL: কোন টিউনার নেই এবং শুধুমাত্র টিউনার কলব্যাক আনসেট করতে হবে।
HIDL 2.0 close()
এআইডিএল unsetTunerCallback()
বর্ণনা: একটি নির্দিষ্ট প্রোগ্রাম টিউন.
HIDL 2.0 tune(ProgramSelector program) generates (Result result)
এআইডিএল void tune(in ProgramSelector program)
বর্ণনা: বাতাসে পরবর্তী বৈধ প্রোগ্রাম চায়। এআইডিএল-এ বিভ্রান্তি এড়াতে, scan নাম পরিবর্তন করে seek
HIDL 2.0 scan(bool directionUp, bool skipSubChannel) generates (Result result)
এআইডিএল void seek(in boolean directionUp, in boolean skipSubChannel)
বর্ণনা: পার্শ্ববর্তী চ্যানেলের ধাপ, যা কোনো প্রোগ্রাম দ্বারা দখল করা যাবে না।
HIDL 2.0 step(bool directionUp) generates (Result result)
এআইডিএল void step(in boolean directionUp)
বর্ণনা: মুলতুবি থাকা টিউন, স্ক্যান (এইচআইডিএল-এ) বা সন্ধান (এআইডিএল-এ) বা ধাপ অপারেশন বাতিল করে।
HIDL 2.0 cancel()
এআইডিএল void cancel()
বর্ণনা: প্রোগ্রাম তালিকায় একটি ফিল্টার প্রয়োগ করে এবং onProgramListUpdated কলব্যাকের মাধ্যমে প্রোগ্রাম তালিকা আপডেট পাঠানো শুরু করে।
HIDL 2.0 startProgramListUpdates(ProgramFilter filter) generates (Result result)
এআইডিএল void startProgramListUpdates(in ProgramFilter filter)
বর্ণনা: প্রোগ্রাম তালিকা আপডেট পাঠানো বন্ধ করে.
HIDL 2.0 stopProgramListUpdates()
এআইডিএল void stopProgramListUpdates()
বর্ণনা: একটি প্রদত্ত কনফিগারেশন পতাকার বর্তমান সেটিং নিয়ে আসে।
HIDL 2.0 isConfigFlagSet(ConfigFlag flag) generates (Result result, bool value)
এআইডিএল boolean isConfigFlagSet(in ConfigFlag flag)
বর্ণনা: প্রদত্ত কনফিগারেশন পতাকা সেট করে।
HIDL 2.0 setConfigFlag(ConfigFlag flag, bool value) generates (Result result)
এআইডিএল void setConfigFlag(in ConfigFlag flag, boolean value)
বর্ণনা: বিক্রেতা-নির্দিষ্ট প্যারামিটার মান সেট করে।
HIDL 2.0 setParameters(vec<VendorKeyValue> parameters)

উৎপন্ন করে ,

(vec<VendorKeyValue> results)
এআইডিএল VendorKeyValue[] setParameters(in VendorKeyValue[] parameters)
বর্ণনা: বিক্রেতা-নির্দিষ্ট পরামিতি মান পুনরুদ্ধার করে।
HIDL 2.0 getParameters(vec<string> keys) generates (vec<VendorKeyValue> parameters)
এআইডিএল VendorKeyValue[] getParameters(in String[] keys)

ইন্টারফেস স্পষ্টীকরণ

অ্যাসিঙ্ক্রোনাস আচরণ

যেহেতু প্রতিটি টিউনিং অপারেশন (উদাহরণস্বরূপ, টিউন, স্ক্যান (এইচআইডিএল-এ) বা সন্ধান (এআইডিএল-এ) এবং পদক্ষেপগুলি সময়সাপেক্ষ হতে পারে এবং থ্রেডটি দীর্ঘ সময়ের জন্য অবরুদ্ধ করা উচিত নয়, অপারেশনটি সময়-সাপেক্ষ ক্রিয়াকলাপগুলি নির্ধারণ করা উচিত। পরে ঘটতে এবং দ্রুত একটি স্থিতি বা ফলাফল ফেরত দিতে। বিস্তারিতভাবে, প্রতিটি অপারেশন করা উচিত:

  • সমস্ত মুলতুবি টিউনিং অপারেশন বাতিল করুন।
  • পদ্ধতি ইনপুট এবং টিউনার অবস্থার উপর ভিত্তি করে অপারেশন প্রক্রিয়া করা যেতে পারে কিনা তা পরীক্ষা করুন।
  • টিউনিং টাস্ক শিডিউল করুন এবং তারপর Result (এইচআইডিএল-এ) বা status (এআইডিএল-এ) অবিলম্বে ফেরত দিন। Result বা status OK থাকলে, টিউনিং টাস্ক ব্যর্থ হলে (উদাহরণস্বরূপ, টাইমআউটের কারণে) বা সম্পূর্ণ হলে টিউনার কলব্যাক tuneFailed বা currentProgramInfoChanged কল করতে হবে।

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

জাতি শর্ত

টিউনিং অপারেশনগুলির অসিঙ্ক্রোনাস আচরণের কারণে (উদাহরণস্বরূপ, টিউন, স্ক্যান (এইচআইডিএল-এ) বা সন্ধান (এআইডিএল-এ) এবং ধাপে, অপারেশন বাতিল করা এবং টিউনিং অপারেশনগুলির মধ্যে একটি রেস শর্ত বিদ্যমান। এইচএএল একটি টিউনিং অপারেশন সম্পূর্ণ করার পরে এবং কলব্যাক সম্পূর্ণ হওয়ার আগে যদি cancel কল করা হয়, তবে বাতিলটি উপেক্ষা করা যেতে পারে এবং কলব্যাকটি সম্পূর্ণ হওয়া উচিত এবং এইচএএল ক্লায়েন্ট দ্বারা গ্রহণ করা উচিত।

একইভাবে, HAL একটি প্রোগ্রাম তালিকা আপডেট সম্পূর্ণ করার পরে এবং onCurrentProgramInfoChanged কলব্যাক সম্পূর্ণ হওয়ার আগে যদি stopProgramListUpdates কল করা হয়, stopProgramListUpdates উপেক্ষা করা যেতে পারে এবং কলব্যাক সম্পূর্ণ হওয়া উচিত।

ডেটা আকারের সীমা

যেহেতু বাইন্ডার লেনদেনের বাফারে একটি কঠিন সীমা রয়েছে, তাই সম্ভাব্য বড় আকারের ডেটা পাস করার কিছু ইন্টারফেস পদ্ধতির ডেটা সীমা AIDL HAL-এ স্পষ্ট করা হয়েছে।

  • getImage এর জন্য 1 MB-এর কম ছবি ফেরত দিতে হবে।
  • onProgramListUpdate এর জন্য প্রতিটি chunk 500kiB-এর কম হতে হবে। HAL বাস্তবায়নের মাধ্যমে বৃহত্তর প্রোগ্রাম তালিকাকে একাধিক খণ্ডে বিভক্ত করতে হবে এবং একাধিক কলব্যাকের মাধ্যমে পাঠানো হবে।

AIDL HAL ডেটা স্ট্রাকচারে পরিবর্তন

ইন্টারফেসের পরিবর্তন ছাড়াও, এই পরিবর্তনগুলি ব্রডকাস্ট রেডিও AIDL HAL-তে সংজ্ঞায়িত ডেটা স্ট্রাকচারে প্রয়োগ করা হয়েছে, যা AIDL-এর সুবিধা নেয়।

  • AIDL-এ Constant enum সরানো হয় এবং IBroadcastRadio তে const int হিসাবে সংজ্ঞায়িত করা হয়। ইতিমধ্যে, ANTENNA_DISCONNECTED_TIMEOUT_MS নাম পরিবর্তন করে ANTENNA_STATE_CHANGE_TIMEOUT_MS করা হয়েছে। TUNER_TIMEOUT_MS int একটি নতুন const যোগ করা হয়েছে৷ এই সময়ের মধ্যে সমস্ত সুর, সন্ধান এবং পদক্ষেপের ক্রিয়াকলাপ সম্পূর্ণ করতে হবে।
  • Enum RDS এবং Deemphasis AIDL-এ সরানো হয়েছে এবং AmFmRegionConfig এ const int হিসাবে সংজ্ঞায়িত করা হয়েছে। তদনুসারে, ProgramInfo তে fmDeemphasis এবং fmRds উভয়কেই int হিসাবে ঘোষণা করা হয়েছে, সংশ্লিষ্ট ফ্ল্যাগের একটি বিট গণনা ফলাফল। ইতিমধ্যে, D50 এবং D75 নাম পরিবর্তন করে যথাক্রমে DEEMPHASIS_D50 এবং DEEMPHASIS_D75 রাখা হয়েছে।
  • Enum ProgramInfoFlags AIDL-এ সরানো হয় এবং ProgramInfoFLAG_ উপসর্গ যুক্ত করে const int হিসাবে সংজ্ঞায়িত করা হয়। তদনুসারে, ProgramInfoinfoFlags int হিসাবে ঘোষণা করা হয়, পতাকাগুলির একটি বিট গণনা ফলাফল। TUNED নাম পরিবর্তন করে FLAG_TUNABLE করা হয়েছে, যাতে স্টেশনটি টিউন করা যেতে পারে তার সংজ্ঞাটি আরও ভালভাবে বর্ণনা করতে।
  • AmFmBandRange এ, scanSpacing নাম পরিবর্তন করে seekSpacing করা হয়েছে, যেহেতু scan নাম পরিবর্তন করে এআইডিএল-এ seek
  • যেহেতু AIDL-এ ইউনিয়নের ধারণাটি চালু করা হয়েছে, তাই HIDL HAL-এ সংজ্ঞায়িত MetadataKey এবং Metadata আর ব্যবহার করা হয় না। একটি এআইডিএল ইউনিয়ন Metadata এআইডিএল এইচএএল-এ সংজ্ঞায়িত করা হয়েছে। পূর্বে MetadataKey এ থাকা প্রতিটি enum মান এখন Metadata একটি ক্ষেত্র যার সংজ্ঞার উপর নির্ভর করে স্ট্রিং বা int-এর ধরন রয়েছে।

রেডিও নিয়ন্ত্রণ বাস্তবায়ন

রেডিও নিয়ন্ত্রণ বাস্তবায়ন MediaSession এবং MediaBrowse এর উপর ভিত্তি করে, যা মিডিয়া এবং ভয়েস সহকারী অ্যাপগুলিকে রেডিও নিয়ন্ত্রণ করতে সক্ষম করে। আরও তথ্যের জন্য, developer.android.com-এ গাড়ির জন্য মিডিয়া অ্যাপ তৈরি করুন দেখুন।

একটি মিডিয়া ব্রাউজ ট্রি বাস্তবায়ন packages/apps/Car/libs এ কার-ব্রডকাস্ট্রাডিও-সাপোর্ট লাইব্রেরিতে প্রদান করা হয়েছে। এই লাইব্রেরিতে ইউআরআই-এ এবং থেকে রূপান্তর করার জন্য ProgramSelector-এর এক্সটেনশন রয়েছে। এটি সুপারিশ করা হয় যে রেডিও বাস্তবায়ন এই লাইব্রেরিটি ব্যবহার করে সংশ্লিষ্ট ব্রাউজ ট্রি তৈরি করতে।

মিডিয়া সোর্স সুইচার

রেডিও এবং মিডিয়াতে প্রদর্শিত অন্যান্য অ্যাপের মধ্যে একটি নিরবচ্ছিন্ন রূপান্তর প্রদান করতে, গাড়ি-মিডিয়া-সাধারণ লাইব্রেরিতে এমন ক্লাস রয়েছে যা রেডিও অ্যাপে একত্রিত করা উচিত। MediaAppSelectorWidget রেডিও অ্যাপের জন্য XML-এ অন্তর্ভুক্ত করা যেতে পারে (রেফারেন্স মিডিয়া এবং রেডিও অ্যাপে ব্যবহৃত আইকন এবং ড্রপ-ডাউন):

<com.android.car.media.common.MediaAppSelectorWidget
     android:id="@+id/app_switch_container"
     android:layout_width="@dimen/app_switch_widget_width"
     android:layout_height="wrap_content"
     android:background="@drawable/app_item_background"
     android:gravity="center" />

এই উইজেটটি AppSelectionFragment লঞ্চ করে, যা মিডিয়া উত্সগুলির একটি তালিকা প্রদর্শন করে যা সুইচ করা যেতে পারে৷ যদি প্রদত্ত ব্যতীত অন্য একটি UI ইচ্ছা হয়, আপনি যখন সুইচারটি প্রদর্শিত হবে তখন AppSelectionFragment চালু করতে একটি কাস্টম উইজেট তৈরি করতে পারেন।

AppSelectionFragment newFragment = AppSelectionFragment.create(widget,
            packageName, fullScreen);
    newFragment.show(mActivity.getSupportFragmentManager(), null);

রেফারেন্স রেডিও অ্যাপ বাস্তবায়নে একটি নমুনা বাস্তবায়ন প্রদান করা হয়েছে, packages/apps/Car/Radio অবস্থিত।

বিস্তারিত নিয়ন্ত্রণ স্পেসিফিকেশন

MediaSession ( MediaSession.Callback এর মাধ্যমে) ইন্টারফেস বর্তমানে বাজানো রেডিও প্রোগ্রামের জন্য নিয়ন্ত্রণ ব্যবস্থা প্রদান করে:

  • onPlay , onStop । (আন) রেডিও প্লেব্যাক নিঃশব্দ করুন।
  • onPause সময়-পরিবর্তিত বিরতি (যদি সমর্থিত হয়)।
  • onPlayFromMediaId . একটি শীর্ষ-স্তরের ফোল্ডার থেকে যেকোনো সামগ্রী চালান। উদাহরণস্বরূপ, "প্লে এফএম" বা "প্লে রেডিও।"
  • onPlayFromUri . একটি নির্দিষ্ট ফ্রিকোয়েন্সি খেলুন। উদাহরণস্বরূপ, "88.5 FM চালান।"
  • onSkipToNext , onSkipToPrevious . পরবর্তী বা পূর্ববর্তী স্টেশনে টিউন করুন।
  • onSetRating . প্রিয়তে বা থেকে যোগ করুন বা সরান।

MediaBrowser তিন ধরনের শীর্ষ-স্তরের ডিরেক্টরির উপর একটি টিউনযোগ্য MediaItem প্রকাশ করে:

  • ( ঐচ্ছিক ) প্রোগ্রাম (স্টেশন) এই মোডটি সাধারণত ডুয়াল-টিউনার রেডিও দ্বারা ব্যবহারকারীর অবস্থানে উপলব্ধ সমস্ত টিউনযোগ্য রেডিও স্টেশনগুলি নির্দেশ করতে ব্যবহৃত হয়।
  • প্রিয়. রেডিও প্রোগ্রাম পছন্দের তালিকায় যোগ করা হয়েছে, কিছু অনুপলব্ধ হতে পারে (অভ্যর্থনা সীমার বাইরে)।
  • ব্যান্ড চ্যানেল। বর্তমান অঞ্চলে সমস্ত শারীরিকভাবে সম্ভাব্য চ্যানেল (87.9, 88.1, 88.3, ​​88.5, 88.7, 88.9, 89.1 এবং আরও অনেক কিছু)। প্রতিটি ব্যান্ডের একটি পৃথক শীর্ষ-স্তরের ডিরেক্টরি রয়েছে।
MediaBrowserService গাছের গঠন
চিত্র 2. MediaBrowserService গাছের গঠন

এই ফোল্ডারগুলির প্রতিটির প্রতিটি উপাদান (AM/FM/Programs) হল একটি URI সহ একটি MediaItem যা টিউন করার জন্য MediaSession এর সাথে ব্যবহার করা যেতে পারে। প্রতিটি শীর্ষ-স্তরের ফোল্ডার (AM/FM/Programs) হল একটি MediaId সহ একটি MediaItem যা প্লেব্যাক ট্রিগার করতে MediaSession-এর সাথে ব্যবহার করা যেতে পারে এবং OEM এর বিবেচনার উপর নির্ভর করে৷ উদাহরণস্বরূপ, "Play FM," "Play AM" এবং "Play Radio" হল সমস্ত অ-নির্দিষ্ট রেডিও প্রশ্ন যা OEM রেডিও অ্যাপে পাঠানোর জন্য একটি mediaId ব্যবহার করে। জেনেরিক অনুরোধ এবং মিডিয়াআইডি থেকে কী চালাতে হবে তা নির্ধারণ করা রেডিও অ্যাপের উপর নির্ভর করে।

মিডিয়া সেশন

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

কিছু রেডিও টিউনার (বা অ্যাপ) কন্টেন্ট ক্যাশে করে সম্প্রচার স্ট্রীম পজ অনুকরণ করার ক্ষমতা প্রদান করে এবং পরে এটিকে আবার প্লে করে। এই ধরনের ক্ষেত্রে, onPause ব্যবহার করুন।

মিডিয়াআইডি এবং ইউআরআই অ্যাকশন থেকে চালানোর উদ্দেশ্য হল মিডিয়া ব্রাউজার ইন্টারফেস থেকে আনা একটি স্টেশনে টিউন করা। mediaId হল রেডিও অ্যাপের দ্বারা প্রদত্ত একটি স্বেচ্ছাচারী স্ট্রিং যা একটি অনন্য (তাই একটি প্রদত্ত আইডি শুধুমাত্র একটি আইটেমকে পয়েন্ট করে) এবং স্থিতিশীল (তাই একটি প্রদত্ত আইটেমের পুরো সেশনে একই আইডি থাকে) মান যা দিয়ে একটি প্রদত্ত স্টেশন সনাক্ত করা যায় . URI একটি সু-সংজ্ঞায়িত স্কিমা হবে। সংক্ষেপে, ProgramSelector এর একটি URI-ized ফর্ম। যদিও এটি অনন্যতা বৈশিষ্ট্য সংরক্ষণ করে, এটি স্থিতিশীল হওয়ার প্রয়োজন নেই, যদিও স্টেশনটি একটি ভিন্ন ফ্রিকোয়েন্সিতে চলে গেলে এটি পরিবর্তন হতে পারে।

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

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

পরবর্তী বা পূর্ববর্তী স্টেশনে যাওয়া বর্তমান প্রেক্ষাপটের উপর নির্ভর করে:

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

রেডিও অ্যাপ এই ক্রিয়াগুলি পরিচালনা করে।

ত্রুটি পরিচালনা

TransportControls অ্যাকশন (প্লে, স্টপ, এবং নেক্সট) অ্যাকশনটি সফল হয় কি না সে বিষয়ে প্রতিক্রিয়া প্রদান করে না। একটি ত্রুটি নির্দেশ করার একমাত্র উপায় হল একটি ত্রুটি বার্তা সহ MediaSession অবস্থাকে STATE_ERROR এ সেট করা৷

রেডিও অ্যাপটিকে অবশ্যই সেই ক্রিয়াগুলি পরিচালনা করতে হবে এবং হয় সেগুলি চালাতে হবে বা একটি ত্রুটির অবস্থা সেট করতে হবে৷ প্লে কমান্ড কার্যকর করা অবিলম্বে না হলে, কমান্ডটি চালানোর সময় প্লেব্যাকের অবস্থা STATE_CONNECTING (সরাসরি টিউনের ক্ষেত্রে) বা STATE_SKIPPING_TO_PREVIOUS বা NEXT পরিবর্তন করা উচিত।

ক্লায়েন্টকে PlaybackState দেখতে হবে এবং যাচাই করতে হবে যে সেশনটি বর্তমান প্রোগ্রামটিকে যা অনুরোধ করা হয়েছিল বা ত্রুটির অবস্থায় প্রবেশ করেছে তাতে পরিবর্তন করেছে। STATE_CONNECTING অবশ্যই 30 সেকেন্ডের বেশি হবে না৷ যাইহোক, একটি প্রদত্ত AM/FM ফ্রিকোয়েন্সিতে একটি সরাসরি সুর অনেক দ্রুত সঞ্চালন করা উচিত।

পছন্দ যোগ করুন এবং সরান

MediaSession রেটিং সমর্থন আছে, যা ফেভারিট নিয়ন্ত্রণ করতে ব্যবহার করা যেতে পারে। RATING_HEART প্রকারের রেটিং সহ কল ​​করা onSetRating বর্তমানে টিউন করা স্টেশনটিকে পছন্দের তালিকায় বা থেকে যুক্ত করে বা সরিয়ে দেয়৷

লিগ্যাসি প্রিসেটের বিপরীতে, এই মডেলটি একটি ক্রমবিহীন এবং সীমাহীন পছন্দের তালিকা অনুমান করে, যখন প্রতিটি সংরক্ষিত পছন্দ একটি সংখ্যাসূচক স্লটে (সাধারণত, 1 থেকে 6) বরাদ্দ করা হয়েছিল। ফলস্বরূপ, প্রিসেট-ভিত্তিক সিস্টেমগুলি onSetRating অপারেশনের সাথে বেমানান হবে৷

MediaSession API-এর সীমাবদ্ধতা হল শুধুমাত্র বর্তমানে টিউন করা স্টেশন যোগ করা বা সরানো যাবে। উদাহরণস্বরূপ, আইটেমগুলি সরানোর আগে প্রথমে নির্বাচন করতে হবে। এটি শুধুমাত্র MediaBrowser ক্লায়েন্টের একটি সীমাবদ্ধতা, যেমন একটি সহচর অ্যাপ৷ রেডিও অ্যাপ একইভাবে সীমাবদ্ধ নয়। এই অংশটি ঐচ্ছিক যখন একটি অ্যাপ ফেভারিট সমর্থন করে না।

মিডিয়া ব্রাউজার

কোন প্রদত্ত অঞ্চলের জন্য কোন ফ্রিকোয়েন্সি বা ফিজিক্যাল চ্যানেলের নাম (যখন একটি নির্বিচারে চ্যানেলে টিউন করা একটি প্রদত্ত রেডিও প্রযুক্তির জন্য উপযুক্ত) তা প্রকাশ করতে, প্রতিটি ব্যান্ডের জন্য সমস্ত বৈধ চ্যানেল (ফ্রিকোয়েন্সি) তালিকাভুক্ত করা হয়। মার্কিন অঞ্চলে, এটি 87.8 থেকে 108.0 মেগাহার্টজ রেঞ্জের মধ্যে 101টি এফএম চ্যানেল (0.2MHz ব্যবধান ব্যবহার করে) এবং 530 থেকে 1700 kHz পরিসরে (10kHz ব্যবধান ব্যবহার করে) 117 AM চ্যানেল। যেহেতু এইচডি রেডিও একই চ্যানেলের স্থান ব্যবহার করে, এটি আলাদাভাবে উপস্থাপন করা হয় না।

বর্তমানে উপলব্ধ রেডিও প্রোগ্রামগুলির তালিকা সমতল যে এটি সরাসরি অডিও সম্প্রচার (ডিএবি) এনসেম্বল দ্বারা গোষ্ঠীবদ্ধ করার মতো ডিসপ্লে স্কিমগুলিকে অনুমতি দেয় না।

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

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

  • EXTRA_BCRADIO_FOLDER_TYPE = "android.media.extra.EXTRA_BCRADIO_FOLDER_TYPE" । নিম্নলিখিত মানগুলির মধ্যে একটি:
    • BCRADIO_FOLDER_TYPE_PROGRAMS = 1 । বর্তমানে উপলব্ধ প্রোগ্রাম.
    • BCRADIO_FOLDER_TYPE_FAVORITES = 2 । প্রিয়.
    • BCRADIO_FOLDER_TYPE_BAND = 3 । একটি প্রদত্ত ব্যান্ডের জন্য সমস্ত ভৌত চ্যানেল।

    কোনো রেডিও-নির্দিষ্ট কাস্টম মেটাডেটা ক্ষেত্র সংজ্ঞায়িত করার প্রয়োজন নেই, কারণ সমস্ত প্রাসঙ্গিক ডেটা বিদ্যমান MediaBrowser.MediaItem স্কিমে ফিট করে:

    • প্রোগ্রামের নাম (RDS PS, DAB পরিষেবার নাম)। MediaDescription.getTitle
    • এফএম ফ্রিকোয়েন্সি। URI ( ProgramSelector দেখুন) অথবা MediaDescription.getTitle (যদি একটি এন্ট্রি BROADCASTRADIO_FOLDER_TYPE_BAND ফোল্ডারে থাকে)।
    • রেডিও-নির্দিষ্ট শনাক্তকারী (RDS PI, DAB SId)। MediaDescription.getMediaUri প্রোগ্রাম সিলেক্টরে পার্স করা হয়েছে।

    সাধারণত, বর্তমান প্রোগ্রাম বা পছন্দের তালিকায় একটি এন্ট্রির জন্য FM ফ্রিকোয়েন্সি আনার প্রয়োজন নেই (যেমন ক্লায়েন্টকে মিডিয়া আইডিতে কাজ করা উচিত)। যাইহোক, যদি এই ধরনের প্রয়োজন দেখা দেয় (উদাহরণস্বরূপ, প্রদর্শনের উদ্দেশ্যে), এটি ইউআরআই-তে উপস্থিত থাকে এবং ProgramSelector পার্স করা যেতে পারে। এটি বলেছে, বর্তমান সেশনের মধ্যে আইটেমগুলি নির্বাচন করতে URI ব্যবহার করার পরামর্শ দেওয়া হয় না। বিস্তারিত জানার জন্য, ProgramSelector দেখুন।

    পারফরম্যান্স বা বাইন্ডার-সম্পর্কিত সমস্যাগুলি এড়াতে, MediaBrowser পরিষেবা অবশ্যই পেজিনেশন সমর্থন করবে:

    দ্রষ্টব্য: ডিফল্টরূপে, বিকল্প পরিচালনা ছাড়াই onLoadChildren() ভেরিয়েন্টে ডিফল্টরূপে পৃষ্ঠা সংখ্যা প্রয়োগ করা হয়।

    সমস্ত ধরণের তালিকা থেকে সম্পর্কিত এন্ট্রিগুলি (কাঁচা চ্যানেল, প্রোগ্রামগুলি পাওয়া এবং পছন্দসই) বিভিন্ন মিডিয়াআইড থাকতে পারে (এটি রেডিও অ্যাপের উপর নির্ভর করে; সমর্থন লাইব্রেরিতে সেগুলি আলাদা থাকবে)। ইউআরআই (প্রোগ্রাম সিলেক্টর আকারে) বেশিরভাগ ক্ষেত্রে পাওয়া কাঁচা চ্যানেল এবং প্রোগ্রামগুলির মধ্যে পার্থক্য (আরডিএস ছাড়া এফএম ব্যতীত), তবে বেশিরভাগ ক্ষেত্রে পাওয়া প্রোগ্রাম এবং পছন্দের মধ্যে একই রকম (উদাহরণস্বরূপ, যখন AF আপডেট করা হয়েছিল)।

    বিভিন্ন ধরণের তালিকা থেকে এন্ট্রির জন্য বিভিন্ন মিডিয়াআইড থাকা তাদের উপর বিভিন্ন পদক্ষেপ নেওয়া সম্ভব করে তোলে। সম্প্রতি নির্বাচিত MediaItem এর ফোল্ডারের উপর নির্ভর করে আপনি onSkipToNext এ পছন্দের তালিকা বা সমস্ত প্রোগ্রামের তালিকা অতিক্রম করতে পারেন (দেখুন MediaSession )।

    বিশেষ টিউন অ্যাকশন

    প্রোগ্রাম তালিকা ব্যবহারকারীদের একটি নির্দিষ্ট স্টেশনে টিউন করতে সক্ষম করে, কিন্তু ব্যবহারকারীদের সাধারণ অনুরোধ যেমন "টিউন টু এফএম" করার অনুমতি দেয় না, যার ফলে এফএম ব্যান্ডে সম্প্রতি শোনা স্টেশনে টিউনিং হতে পারে।

    এই ধরনের ক্রিয়াগুলিকে সমর্থন করার জন্য, কিছু শীর্ষ-স্তরের ডিরেক্টরিতে FLAG_PLAYABLE পতাকা সেট রয়েছে (ফোল্ডারের জন্য FLAG_BROWSABLE সহ)।

    কর্ম টিউন টু কিভাবে ইস্যু করা যায়
    রেডিও চালাও যেকোনো রেডিও চ্যানেল startService(ACTION_PLAY_BROADCASTRADIO)

    বা

    playFromMediaId(MediaBrowser. getRoot() )
    এফএম খেলুন যেকোনো এফএম চ্যানেল এফএম ব্যান্ডের mediaId থেকে খেলুন।

    কোন প্রোগ্রাম টিউন করবেন তা অ্যাপের উপর নির্ভর করে। এটি সাধারণত প্রদত্ত তালিকা থেকে চ্যানেলে সবচেয়ে সাম্প্রতিক টিউন করা হয়। ACTION_PLAY_BROADCASTRADIO এর বিস্তারিত জানার জন্য, সাধারণ খেলার উদ্দেশ্য দেখুন।

    আবিষ্কার এবং পরিষেবা সংযোগ

    PackageManager সরাসরি সম্প্রচার রেডিও ট্রি পরিবেশন MediaBrowserService খুঁজে পেতে পারে। এটি করতে, ACTION_PLAY_BROADCASTRADIO অভিপ্রায় ( সাধারণ খেলার অভিপ্রায় দেখুন) এবং MATCH_SYSTEM_ONLY পতাকা সহ resolveService কল করুন৷ রেডিও পরিবেশন করে এমন সমস্ত পরিষেবা খুঁজে পেতে (এখানে একাধিক হতে পারে; উদাহরণস্বরূপ, পৃথক AM/FM এবং স্যাটেলাইট), queryIntentServices ব্যবহার করুন।

    সমাধান করা পরিষেবাটি android.media.browse.MediaBrowserService আবদ্ধ অভিপ্রায়ও পরিচালনা করে। এটি GTS এর মাধ্যমে যাচাই করা হয়েছে।

    নির্বাচিত MediaBrowserService-এর সাথে সংযোগ করতে, একটি প্রদত্ত পরিষেবা উপাদানের জন্য MediaBrowser দৃষ্টান্ত তৈরি করুন এবং connect । সংযোগ স্থাপন করার পর, getSessionToken মাধ্যমে MediaSession-এ একটি হ্যান্ডেল পাওয়া যেতে পারে।

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

    যদি উৎস-নির্দিষ্ট অ্যাপ (উদাহরণস্বরূপ, একটি রেডিও অ্যাপ) কোনো ডিভাইসে এই ধরনের উৎস সমর্থন ছাড়াই ইনস্টল করা হয়, তবে এটি এখনও ACTION_PLAY_BROADCASTRADIO অভিপ্রায় পরিচালনা করার জন্য নিজেকে বিজ্ঞাপন দেবে, কিন্তু এর MediaBrowser ট্রিতে রেডিও-নির্দিষ্ট ট্যাগ থাকবে না। এইভাবে, একটি ক্লায়েন্ট একটি ডিভাইসে একটি প্রদত্ত উত্স উপলব্ধ কিনা তা পরীক্ষা করতে ইচ্ছুক, অবশ্যই:

    1. রেডিও পরিষেবাটি আবিষ্কার করুন ( ACTION_PLAY_BROADCASTRADIO এর জন্য resolveService কল করুন)।
    2. MediaBrowser তৈরি করুন এবং তারপরে এটির সাথে সংযোগ করুন।
    3. EXTRA_BCRADIO_FOLDER_TYPE অতিরিক্ত সহ MediaItem উপস্থিতি নির্ধারণ করুন৷

    দ্রষ্টব্য: বেশিরভাগ ক্ষেত্রে, ক্লায়েন্টকে একটি প্রদত্ত ডিভাইসের জন্য উপলব্ধ সমস্ত উত্স সনাক্ত করতে সমস্ত উপলব্ধ MediaBrowser গাছ স্ক্যান করতে হবে।

    ব্যান্ডের নাম

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

    নির্দিষ্ট ব্যান্ড খোঁজার জন্য একটি স্থিতিশীল প্রক্রিয়া প্রদান করতে, ব্যান্ড ফোল্ডারগুলির জন্য একটি অতিরিক্ত ট্যাগ যোগ করা হয়, EXTRA_BCRADIO_BAND_NAME_EN । এটি ব্যান্ডের একটি অ-স্থানীয় নাম এবং শুধুমাত্র এই পূর্বনির্ধারিত মানগুলির একটি নিতে পারে:

    • AM
    • FM
    • DAB

    ব্যান্ড এই তালিকায় না থাকলে, ব্যান্ডের নাম ট্যাগ সেট করা উচিত নয়। তবে ব্যান্ডটি তালিকায় থাকলে অবশ্যই ট্যাগ সেট থাকতে হবে। এইচডি রেডিও আলাদা ব্যান্ড গণনা করে না কারণ এটি AM/FM এর মতো একই অন্তর্নিহিত মাধ্যম ব্যবহার করে।

    সাধারণ খেলার উদ্দেশ্য

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

    • android.car.intent.action.PLAY_BROADCASTRADIO
    • android.car.intent.action.PLAY_AUDIOCD : CD-DA বা CD-টেক্সট
    • android.car.intent.action.PLAY_DATADISC : CD/DVD এর মত অপটিক্যাল ডেটা ডিস্ক, কিন্তু CD-DA নয় (মিশ্র মোড সিডি হতে পারে)
    • android.car.intent.action.PLAY_AUX : কোন AUX পোর্ট তা উল্লেখ না করে
    • android.car.intent.action.PLAY_BLUETOOTH
    • android.car.intent.action.PLAY_USB : কোন USB ডিভাইস তা উল্লেখ না করে
    • android.car.intent.action.PLAY_LOCAL : স্থানীয় মিডিয়া স্টোরেজ (বিল্ট-ইন ফ্ল্যাশ)

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

    পরিষেবা আবিষ্কার আসলে এই উদ্দেশ্যগুলির সাথে সমাধান করা আরও গুরুত্বপূর্ণ সমস্যা। পরিষেবা আবিষ্কারের পদ্ধতি এইভাবে সহজ এবং দ্ব্যর্থহীন ( ডিসকভারি এবং পরিষেবা সংযোগ দেখুন)।

    কিছু ক্লায়েন্ট বাস্তবায়ন সহজতর করার জন্য, এই ধরনের প্লে কমান্ড জারি করার একটি বিকল্প উপায় রয়েছে (যা রেডিও অ্যাপ দ্বারাও প্রয়োগ করতে হবে): রুট নোডের রুটআইডি (মিডিয়াআইডি হিসাবে ব্যবহৃত) সহ playFromMediaId ইস্যু করা। যদিও রুট নোডটি প্লে করার জন্য বোঝানো হয় না, তবে এর রুটআইডি একটি নির্বিচারে স্ট্রিং যা মিডিয়াআইডি হিসাবে ব্যবহারযোগ্য হতে পারে। যাইহোক, ক্লায়েন্টদের এই সূক্ষ্মতা বোঝার প্রয়োজন নেই।

    প্রোগ্রাম নির্বাচক

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

    ডিজিটাল রেডিও সম্প্রচারের যুগে, একটি নির্দিষ্ট স্টেশনে সুর করার জন্য একটি বেয়ার ফ্রিকোয়েন্সি যথেষ্ট নয়। অতএব, একটি এনালগ বা ডিজিটাল চ্যানেলে টিউন করতে ProgramSelector ব্যবহার করুন। ProgramSelector দুটি অংশ নিয়ে গঠিত:

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

    MediaBrowser - বা MediaSession ভিত্তিক সমাধানে ফিট করার জন্য ProgramSelector সক্ষম করতে, এটিকে সিরিয়ালাইজ করার জন্য একটি URI স্কিমা সংজ্ঞায়িত করুন। স্কিমা নিম্নরূপ সংজ্ঞায়িত করা হয়:

    broadcastradio://program/<primary ID type>/<primary ID>?
    <secondary ID type>=<secondary ID>&<secondary ID type>=<secondary ID>
    

    এই উদাহরণে, সেকেন্ডারি আইডেন্টিফায়ার অংশটি (প্রশ্ন চিহ্নের পরে ( ? )) ঐচ্ছিক এবং mediaId হিসাবে ব্যবহারের জন্য একটি স্থিতিশীল শনাক্তকারী প্রদান করতে সরানো যেতে পারে। উদাহরণ স্বরূপ:

    • broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=88500&AMFM_FREQUENCY=103300
    • broadcastradio://program/AMFM_FREQUENCY/102100
    • broadcastradio://program/DAB_SID_EXT/14895264?RDS_PI=1234

    program অথরিটি পার্ট (একেএ হোস্ট) ভবিষ্যতে স্কিম এক্সটেনশনের জন্য কিছু জায়গা প্রদান করে। আইডেন্টিফায়ার টাইপের HAL 2.x সংজ্ঞায় IdentifierType টাইপ স্ট্রিংগুলি তাদের নাম হিসাবে সুনির্দিষ্টভাবে নির্দিষ্ট করা হয়েছে এবং মান বিন্যাসটি একটি দশমিক বা হেক্সাডেসিমেল ( 0x উপসর্গ সহ) সংখ্যা।

    সমস্ত বিক্রেতা-নির্দিষ্ট শনাক্তকারী VENDOR_ উপসর্গ দ্বারা প্রতিনিধিত্ব করা হয়৷ উদাহরণস্বরূপ, VENDOR_START এর জন্য VENDOR_0 এবং VENDOR_START প্লাস 1-এর জন্য VENDOR_1 । এই ধরনের URIগুলি সেই রেডিও হার্ডওয়্যারের জন্য নির্দিষ্ট যেগুলিতে সেগুলি তৈরি হয়েছিল এবং বিভিন্ন OEM-এর দ্বারা তৈরি ডিভাইসগুলির মধ্যে স্থানান্তর করা যায় না৷

    এই URI গুলি অবশ্যই শীর্ষ-স্তরের রেডিও ফোল্ডারগুলির অধীনে প্রতিটি MediaItem-এ বরাদ্দ করা উচিত৷ উপরন্তু, MediaSession অবশ্যই playFromMediaId এবং playFromUri উভয়কেই সমর্থন করবে। যাইহোক, ইউআরআই প্রাথমিকভাবে রেডিও মেটাডেটা নিষ্কাশন (যেমন এফএম ফ্রিকোয়েন্সি) এবং ক্রমাগত স্টোরেজের জন্য তৈরি। সমস্ত মিডিয়া আইটেমগুলির জন্য ইউআরআই উপলব্ধ হবে এমন কোনও গ্যারান্টি নেই (উদাহরণস্বরূপ, যখন প্রাথমিক আইডি টাইপ এখনও ফ্রেমওয়ার্ক দ্বারা সমর্থিত নয়)। অন্যদিকে, মিডিয়া আইডি সবসময় কাজ করে। বর্তমান MediaBrowser সেশন থেকে আইটেম নির্বাচন করতে ক্লায়েন্টদের URI ব্যবহার করার পরামর্শ দেওয়া হয় না । পরিবর্তে, playFromMediaId ব্যবহার করুন। এটি বলেছে, এটি পরিবেশনকারী অ্যাপের জন্য ঐচ্ছিক নয় এবং অনুপস্থিত ইউআরআইগুলি যথাযথ ন্যায্য মামলাগুলির জন্য সংরক্ষিত।

    প্রাথমিক ডিজাইনে স্কিমের অংশের পরে :// অনুক্রমের পরিবর্তে একটি একক কোলন ব্যবহার করা হয়েছে। যাইহোক, আগেরটি android.net.Uri দ্বারা সমর্থিত নয় পরম শ্রেণিবদ্ধ URI রেফারেন্সের জন্য।

    অন্যান্য উত্স প্রকার

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

    একটি একক অ্যাপ একাধিক ধরনের উৎস পরিবেশন করতে পারে। এই ধরনের ক্ষেত্রে, প্রতিটি ধরনের উৎসের জন্য একটি পৃথক MediaBrowserService তৈরি করার পরামর্শ দেওয়া হয়। এমনকি একাধিক পরিবেশিত উত্স/মিডিয়া ব্রাউজারসার্ভিস সহ একটি সেট-আপেও, একটি একক অ্যাপের মধ্যে একটি একক মিডিয়া সেশন থাকার দৃঢ়ভাবে সুপারিশ করা হয়৷

    অডিও সিডি

    অডিও সিডির মতোই যে অ্যাপটি এই জাতীয় ডিস্কগুলি পরিবেশন করে মিডিয়া ব্রাউজারকে একটি একক ব্রাউজযোগ্য এন্ট্রি (বা আরও বেশি, যদি সিস্টেমে একটি সিডি চেঞ্জার থাকে) প্রকাশ করে, যার ফলে একটি প্রদত্ত সিডির সমস্ত ট্র্যাক থাকবে। যদি সিস্টেমের প্রতিটি সিডিতে ট্র্যাকগুলি সম্পর্কে জ্ঞান না থাকে (উদাহরণস্বরূপ, যখন সমস্ত ডিস্ক একবারে একটি কার্টিজে ঢোকানো হয় এবং এটি সেগুলিকে পড়তে না পারে), তাহলে পুরো ডিস্কের জন্য মিডিয়াআইটেমটি কেবল PLAYABLE হবে, নয় BROWSABLE প্লাস PLAYABLE । একটি প্রদত্ত স্লটে কোন ডিস্ক না থাকলে, আইটেমটি PLAYABLE বা BROWSABLE যায় না (তবে প্রতিটি স্লট অবশ্যই গাছে উপস্থিত থাকতে হবে)।

    অডিও সিডি গাছের গঠন
    চিত্র 3. অডিও সিডি গাছের গঠন

    এই এন্ট্রিগুলিকে একইভাবে চিহ্নিত করা হবে যেভাবে ব্রডকাস্ট রেডিও ফোল্ডারগুলি হয়; তারা MediaDescription API এ সংজ্ঞায়িত অতিরিক্ত অতিরিক্ত ক্ষেত্র থাকবে:

    • EXTRA_CD_TRACK : অডিও সিডিতে প্রতিটি MediaItem জন্য, 1-ভিত্তিক ট্র্যাক নম্বর।
    • EXTRA_CD_DISK : 1-ভিত্তিক ডিস্ক নম্বর।

    সিডি-টেক্সট সক্ষম সিস্টেম এবং সামঞ্জস্যপূর্ণ ডিস্কের জন্য, শীর্ষ-স্তরের মিডিয়াআইটেমে ডিস্কের একটি শিরোনাম থাকবে। একইভাবে, ট্র্যাকের জন্য MediaItems, ট্র্যাকের একটি শিরোনাম থাকবে।

    অক্জিলিয়ারী ইনপুট

    যে অ্যাপটি অক্জিলিয়ারী ইনপুট পরিবেশন করে তা পোর্টে AUX-এর প্রতিনিধিত্ব করে একটি একক এন্ট্রি (বা একাধিক পোর্ট থাকাকালীন) সহ একটি MediaBrowser ট্রিকে প্রকাশ করে। সংশ্লিষ্ট MediaSession তার mediaId নেয় এবং playFromMediaId অনুরোধ পাওয়ার পর সেই উৎসে স্যুইচ করে।

    AUX গাছের গঠন
    চিত্র 4. AUX গাছের গঠন

    প্রতিটি AUX MediaItem এন্ট্রিতে একটি অতিরিক্ত ক্ষেত্র EXTRA_AUX_PORT_NAME থাকবে "AUX" বাক্যাংশ ছাড়াই পোর্টের অ-স্থানীয় নামে সেট করা হবে৷ উদাহরণস্বরূপ, "AUX 1" কে "1", "AUX ফ্রন্ট" কে "ফ্রন্ট" এবং "AUX" একটি খালি স্ট্রিং-এ সেট করা হবে। অ-ইংরেজি লোকেলে, নামের ট্যাগটি একই ইংরেজি স্ট্রিং থাকবে। EXTRA_BCRADIO_BAND_NAME_EN এর জন্য অসম্ভাব্য, মানগুলি OEM-সংজ্ঞায়িত এবং একটি পূর্বনির্ধারিত তালিকায় সীমাবদ্ধ নয়৷

    যদি হার্ডওয়্যারটি অক্স পোর্টের সাথে সংযুক্ত ডিভাইসগুলি সনাক্ত করতে পারে তবে হার্ডওয়্যারটি মিডিয়া আইটেমটিকে PLAYABLE হিসাবে চিহ্নিত করা উচিত, কেবলমাত্র ইনপুট সংযুক্ত থাকলে। যদি এই বন্দরের সাথে কোনও কিছু সংযুক্ত না করা হয় তবে হার্ডওয়্যারটি এখনও গণনা করা উচিত (তবে PLAYABLE না)। যদি হার্ডওয়্যারটির এমন কোনও ক্ষমতা না থাকে তবে মিডিয়া আইটেমটি সর্বদা PLAYABLE হতে হবে।

    অতিরিক্ত ক্ষেত্র

    নিম্নলিখিত ক্ষেত্রগুলি সংজ্ঞায়িত করুন:

    • EXTRA_CD_TRACK = "android.media.extra.CD_TRACK"
    • EXTRA_CD_DISK = "android.media.extra.CD_DISK"
    • EXTRA_AUX_PORT_NAME = "android.media.extra.AUX_PORT_NAME"

    EXTRA_CD_DISK বা EXTRA_AUX_PORT_NAME অতিরিক্ত ক্ষেত্র সেট থাকা উপাদানগুলির জন্য ক্লায়েন্টকে শীর্ষ স্তরের মিডিয়া আইটেমগুলি পর্যালোচনা করতে হবে।

    বিস্তারিত উদাহরণ

    নিম্নলিখিত উদাহরণগুলি এই নকশার অংশ যা উত্স ধরণের জন্য মিডিয়াব্রোজার ট্রি কাঠামোকে সম্বোধন করে।

    ব্রডকাস্ট রেডিও মিডিয়াব্রোজার সার্ভিস (হ্যান্ডলস ACTION_PLAY_BROADCASTRADIO ):

    • স্টেশনগুলি (ব্রাউজেবল) EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_PROGRAMS
      • বিবিসি ওয়ান (প্লেযোগ্য) ইউআরআই: broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=90500
      • এবিসি 88.1 (প্লেযোগ্য) ইউআরআই: broadcastradio://program/RDS_PI/5678?AMFM_FREQUENCY=88100
      • এবিসি 88.1 এইচডি 1 (প্লেযোগ্য) ইউআরআই: broadcastradio://program/HD_STATION_ID_EXT/158241DEADBEEF?AMFM_FREQUENCY=88100&RDS_PI=5678
      • এবিসি 88.1 এইচডি 2 (প্লেযোগ্য) ইউআরআই: broadcastradio://program/HD_STATION_ID_EXT/158242DEADBEFE
      • 90.5 এফএম (প্লেযোগ্য) - এফএম আরডিএসুরি ছাড়াই: broadcastradio://program/AMFM_FREQUENCY/90500
      • 620 এএম (প্লেযোগ্য) ইউআরআই: broadcastradio://program/AMFM_FREQUENCY/620
      • বিবিসি ওয়ান (প্লেযোগ্য) ইউআরআই: broadcastradio://program/DAB_SID_EXT/1E24102?RDS_PI=1234
    • পছন্দসই (ব্রাউজেবল, প্লেযোগ্য) EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_FAVORITES
      • বিবিসি ওয়ান (প্লেযোগ্য) ইউআরআই: broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=101300
      • বিবিসি টু (প্লেযোগ্য নয়) ইউআরআই: broadcastradio://program/RDS_PI/1300?AMFM_FREQUENCY=102100
    • এএম (ব্রাউজেবল, প্লেযোগ্য): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="AM"
      • 530 এএম (প্লেযোগ্য) ইউআরআই: broadcastradio://program/AMFM_FREQUENCY/530
      • 540 এএম (প্লেযোগ্য) ইউআরআই: broadcastradio://program/AMFM_FREQUENCY/540
      • 550 এএম (প্লেযোগ্য) ইউআরআই: broadcastradio://program/AMFM_FREQUENCY/550
    • এফএম (ব্রাউজেবল, প্লেযোগ্য): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="FM"
      • 87.7 এফএম (প্লেযোগ্য) ইউআরআই: broadcastradio://program/AMFM_FREQUENCY/87700
      • 87.9 এফএম (প্লেযোগ্য) ইউআরআই: broadcastradio://program/AMFM_FREQUENCY/87900
      • 88.1 এফএম (প্লেযোগ্য) ইউআরআই: broadcastradio://program/AMFM_FREQUENCY/88100
    • ড্যাব (প্লেযোগ্য): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="DAB"

    অডিও সিডি মিডিয়াব্রাউসার সার্ভিস ( ACTION_PLAY_AUDIOCD হ্যান্ডল করে):

    • ডিস্ক 1 (প্লেযোগ্য) EXTRA_CD_DISK=1
    • ডিস্ক 2 (ব্রাউজেবল, প্লেযোগ্য) EXTRA_CD_DISK=2
      • ট্র্যাক 1 (প্লেযোগ্য) EXTRA_CD_TRACK=1
      • ট্র্যাক 2 (প্লেযোগ্য) EXTRA_CD_TRACK=2
    • আমার সংগীত সিডি (ব্রাউজেবল, প্লেযোগ্য) EXTRA_CD_DISK=3
      • সমস্ত আমার দ্বারা (খেলতে সক্ষম) EXTRA_CD_TRACK=1
      • রেইস, রেইস (প্লেযোগ্য) EXTRA_CD_TRACK=2
    • খালি স্লট 4 (প্লেযোগ্য নয়) EXTRA_CD_DISK=4

    অক্স মিডিয়াব্রোসার সার্ভিস (হ্যান্ডলস ACTION_PLAY_AUX ):

    • অক্স ফ্রন্ট (প্লেযোগ্য) EXTRA_AUX_PORT_NAME="front"
    • অক্স রিয়ার (প্লেযোগ্য) EXTRA_AUX_PORT_NAME="rear"