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

রেডিও নিয়ন্ত্রণ বাস্তবায়ন 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-সংজ্ঞায়িত এবং একটি পূর্বনির্ধারিত তালিকায় সীমাবদ্ধ নয়৷

    যদি হার্ডওয়্যারটি AUX পোর্টের সাথে সংযুক্ত ডিভাইসগুলি সনাক্ত করতে পারে তবে হার্ডওয়্যারটি মিডিয়াআইটেমটিকে 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 অতিরিক্ত ফিল্ড সেট থাকা উপাদানগুলির জন্য ক্লায়েন্টকে শীর্ষ-স্তরের মিডিয়া আইটেমগুলি পর্যালোচনা করতে হবে৷

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

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

    ব্রডকাস্ট রেডিও MediaBrowserService ( ACTION_PLAY_BROADCASTRADIO পরিচালনা করে):

    • স্টেশন (ব্রাউজযোগ্য) EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_PROGRAMS
      • বিবিসি ওয়ান (বাজানো যায়) ইউআরআই: broadcastradio://program/RDS_PI/1234?AMFM_FREQUENCY=90500
      • ABC 88.1 (বাজানো যায়) URI: broadcastradio://program/RDS_PI/5678?AMFM_FREQUENCY=88100
      • ABC 88.1 HD1 (বাজানো যায়) URI: broadcastradio://program/HD_STATION_ID_EXT/158241DEADBEEF?AMFM_FREQUENCY=88100&RDS_PI=5678
      • ABC 88.1 HD2 (বাজানো যায়) URI: broadcastradio://program/HD_STATION_ID_EXT/158242DEADBEFE
      • 90.5 FM (বাজানো যায়) - RDSURI ছাড়া FM: broadcastradio://program/AMFM_FREQUENCY/90500
      • 620 AM (বাজানো যায়) URI: broadcastradio://program/AMFM_FREQUENCY/620
      • BBC One (বাজানো যায়) URI: 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
    • AM (ব্রাউজযোগ্য, খেলার যোগ্য): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="AM"
      • 530 AM (বাজানো যায়) URI: broadcastradio://program/AMFM_FREQUENCY/530
      • 540 AM (বাজানো যায়) URI: broadcastradio://program/AMFM_FREQUENCY/540
      • 550 AM (বাজানো যায়) URI: broadcastradio://program/AMFM_FREQUENCY/550
    • FM (ব্রাউজ করা যায়, চালানো যায়): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="FM"
      • 87.7 FM (বাজানো যায়) URI: broadcastradio://program/AMFM_FREQUENCY/87700
      • 87.9 FM (বাজানো যায়) URI: broadcastradio://program/AMFM_FREQUENCY/87900
      • 88.1 FM (বাজানো যায়) URI: broadcastradio://program/AMFM_FREQUENCY/88100
    • DAB (বাজানো যায়): EXTRA_BCRADIO_FOLDER_TYPE=BCRADIO_FOLDER_TYPE_BANDEXTRA_BCRADIO_BAND_NAME_EN="DAB"

    অডিও CD MediaBrowserService ( 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
      • Reise, Reise (বাজানো যায়) EXTRA_CD_TRACK=2
    • খালি স্লট 4 (বাজানো যায় না) EXTRA_CD_DISK=4

    AUX MediaBrowserService ( ACTION_PLAY_AUX পরিচালনা করে):

    • AUX সামনে (বাজানো যায়) EXTRA_AUX_PORT_NAME="front"
    • AUX রিয়ার (বাজানো যায়) EXTRA_AUX_PORT_NAME="rear"