কাস্টম ব্রাউজ কর্ম বাস্তবায়ন

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

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

  • অ্যাকশন আইডি: অনন্য স্ট্রিং শনাক্তকারী
  • অ্যাকশন লেবেল: ব্যবহারকারীর কাছে পাঠ্য প্রদর্শিত হয়
  • অ্যাকশন আইকন ইউনিফর্ম রিসোর্স আইডেন্টিফায়ার (URI): ভেক্টর ড্রয়েবল যা টিন্টেবল হতে পারে

কাস্টম ব্রাউজ কর্ম ওভারফ্লো

চিত্র 1. কাস্টম ব্রাউজ অ্যাকশন ওভারফ্লো।

আপনি আপনার BrowseRoot এর অংশ হিসাবে বিশ্বব্যাপী কাস্টম ব্রাউজ কর্মের একটি তালিকা সংজ্ঞায়িত করেন। তারপর পৃথক MediaItem এ এই ক্রিয়াগুলির একটি উপসেট সংযুক্ত করুন।

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

কাস্টম ব্রাউজ অ্যাকশন টুলবার

চিত্র 2. কাস্টম ব্রাউজ অ্যাকশন টুলবার।

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

আপনার অ্যাপে কাস্টম ব্রাউজ অ্যাকশন যোগ করতে:

  1. আপনার MediaBrowserServiceCompat বাস্তবায়নে দুটি পদ্ধতি ওভাররাইড করুন:

  2. রানটাইমে কর্ম সীমা পার্স করুন:

    onGetRoot এ, rootHints Bundle BROWSER_ROOT_HINTS_KEY_CUSTOM_BROWSER_ACTION_LIMIT কী ব্যবহার করে প্রতিটি MediaItem জন্য অনুমোদিত সর্বাধিক সংখ্যক অ্যাকশন পান। 0 এর একটি সীমা নির্দেশ করে যে বৈশিষ্ট্যটি সিস্টেম দ্বারা সমর্থিত নয়৷

  3. কাস্টম ব্রাউজ কর্মের বিশ্বব্যাপী তালিকা তৈরি করুন। প্রতিটি কর্মের জন্য, এই কীগুলির সাহায্যে একটি Bundle অবজেক্ট তৈরি করুন:

    • অ্যাকশন আইডি EXTRAS_KEY_CUSTOM_BROWSER_ACTION_ID
    • অ্যাকশন লেবেল EXTRAS_KEY_CUSTOM_BROWSER_ACTION_LABEL
    • অ্যাকশন আইকন URI EXTRAS_KEY_CUSTOM_BROWSER_ACTION_ICON_URI
  4. একটি তালিকায় সমস্ত অ্যাকশন Bundle অবজেক্ট যোগ করুন।

  5. আপনার BrowseRoot বিশ্বব্যাপী তালিকা যোগ করুন। BrowseRoot এক্সট্রা Bundle , BROWSER_SERVICE_EXTRAS_KEY_CUSTOM_BROWSER_ACTION_ROOT_LIST কী ব্যবহার করে একটি Parcelable ArrayList হিসাবে অ্যাকশনের তালিকা যোগ করুন।

  6. আপনার MediaItem অবজেক্টে কর্ম যোগ করুন। আপনি DESCRIPTION_EXTRAS_KEY_CUSTOM_BROWSER_ACTION_ID_LIST কী ব্যবহার করে MediaDescriptionCompat অতিরিক্ত অ্যাকশন আইডিগুলির তালিকা অন্তর্ভুক্ত করে পৃথক MediaItem অবজেক্টে অ্যাকশন যোগ করতে পারেন। এই তালিকাটি অবশ্যই BrowseRoot এ সংজ্ঞায়িত কর্মের বিশ্বব্যাপী তালিকার একটি উপসেট হতে হবে।

  7. ক্রিয়াগুলি পরিচালনা করুন এবং অগ্রগতি বা ফলাফল ফিরিয়ে দিন:

    • onCustomAction এ, অ্যাকশন আইডি এবং আপনার প্রয়োজনীয় অন্যান্য ডেটার উপর ভিত্তি করে অ্যাকশন পরিচালনা করুন। EXTRAS_KEY_CUSTOM_BROWSER_ACTION_MEDIA_ITEM_ID কী ব্যবহার করে আপনি MediaItem এর ID পেতে পারেন যা অতিরিক্ত থেকে ক্রিয়াটি ট্রিগার করেছে।

    • আপনি অগ্রগতি বা ফলাফল বান্ডেলে কী EXTRAS_KEY_CUSTOM_BROWSER_ACTION_RESULT_REFRESH_ITEM অন্তর্ভুক্ত করে একটি MediaItem জন্য কর্মের তালিকা আপডেট করতে পারেন।

কর্মের অবস্থা আপডেট করুন

MediaBrowserServiceCompat এ এই পদ্ধতিগুলিকে ওভাররাইড করতে:

public void onLoadItem(String itemId, @NonNull Result<MediaBrowserCompat.MediaItem> result)

এবং

public void onCustomAction(@NonNull String action, Bundle extras, @NonNull Result<Bundle> result)

পার্স কর্ম সীমা

কতগুলি কাস্টম ব্রাউজ অ্যাকশন সমর্থিত তা পরীক্ষা করুন:

public BrowserRoot onGetRoot(@NonNull String clientPackageName, int clientUid, Bundle rootHints) {
    rootHints.getInt(
            MediaConstants.BROWSER_ROOT_HINTS_KEY_CUSTOM_BROWSER_ACTION_LIMIT, 0)
}

একটি কাস্টম ব্রাউজ অ্যাকশন তৈরি করুন

প্রতিটি ক্রিয়াকে একটি পৃথক Bundle প্যাক করা দরকার।

  • অ্যাকশন আইডি:

    bundle.putString(MediaConstants.EXTRAS_KEY_CUSTOM_BROWSER_ACTION_ID,
                    "<ACTION_ID>")
    
  • অ্যাকশন লেবেল:

    bundle.putString(MediaConstants.EXTRAS_KEY_CUSTOM_BROWSER_ACTION_LABEL,
                    "<ACTION_LABEL>")
    
  • অ্যাকশন আইকন URI:

    bundle.putString(MediaConstants.EXTRAS_KEY_CUSTOM_BROWSER_ACTION_ICON_URI,
                    "<ACTION_ICON_URI>")
    

Parcelable ArrayList-এ কাস্টম ব্রাউজ অ্যাকশন যোগ করুন

একটি ArrayList এ সমস্ত কাস্টম ব্রাউজ অ্যাকশন Bundle অবজেক্ট যোগ করুন:

private ArrayList<Bundle> createCustomActionsList(
                                        CustomBrowseAction browseActions) {
    ArrayList<Bundle> browseActionsBundle = new ArrayList<>();
    for (CustomBrowseAction browseAction : browseActions) {
        Bundle action = new Bundle();
        action.putString(EXTRAS_KEY_CUSTOM_BROWSER_ACTION_ID,
                browseAction.mId);
        action.putString(EXTRAS_KEY_CUSTOM_BROWSER_ACTION_LABEL,
                getString(browseAction.mLabelResId));
        action.putString(EXTRAS_KEY_CUSTOM_BROWSER_ACTION_ICON_URI,
                browseAction.mIcon);
        browseActionsBundle.add(action);
    }
    return browseActionsBundle;
}

রুট ব্রাউজ করতে কাস্টম ব্রাউজ অ্যাকশন তালিকা যোগ করুন

public BrowserRoot onGetRoot(@NonNull String clientPackageName, int clientUid,
                             Bundle rootHints) {
    Bundle browserRootExtras = new Bundle();
    browserRootExtras.putParcelableArrayList(
            BROWSER_SERVICE_EXTRAS_KEY_CUSTOM_BROWSER_ACTION_ROOT_LIST,
            createCustomActionsList()));
    mRoot = new BrowserRoot(ROOT_ID, browserRootExtras);
    return mRoot;
}

একটি MediaItem কর্ম যোগ করুন

একটি MediaItem এ ব্রাউজ অ্যাকশন আইডিগুলিকে onGetRoot এ দেওয়া ব্রাউজ অ্যাকশনগুলির গ্লোবাল তালিকার একটি উপসেট হতে হবে। বৈশ্বিক তালিকায় নেই এমন কর্ম উপেক্ষা করা হয়।

MediaDescriptionCompat buildDescription (long id, String title, String subtitle,
                String description, Uri iconUri, Uri mediaUri,
                ArrayList<String> browseActionIds) {

    MediaDescriptionCompat.Builder bob = new MediaDescriptionCompat.Builder();
    bob.setMediaId(id);
    bob.setTitle(title);
    bob.setSubtitle(subtitle);
    bob.setDescription(description);
    bob.setIconUri(iconUri);
    bob.setMediaUri(mediaUri);

    Bundle extras = new Bundle();
    extras.putStringArrayList(
          DESCRIPTION_EXTRAS_KEY_CUSTOM_BROWSER_ACTION_ID_LIST,
          browseActionIds);

    bob.setExtras(extras);
    return bob.build();
}
MediaItem mediaItem = new MediaItem(buildDescription(...), flags);

কাস্টম অ্যাকশন ফলাফল তৈরি করুন

ফলাফল তৈরি করতে:

  1. Bundle extras থেকে mediaId পার্স করুন

    @Override
    public void onCustomAction(
                @NonNull String action, Bundle extras, @NonNull Result<Bundle> result){
        String mediaId = extras.getString(MediaConstans.EXTRAS_KEY_CUSTOM_BROWSER_ACTION_MEDIA_ITEM_ID);
                }
    
  2. অ্যাসিঙ্ক্রোনাস ফলাফলের জন্য, ফলাফলটি আলাদা করুন, result.detach

  3. ফলাফল বান্ডিল তৈরি করুন:

    1. ব্যবহারকারীর কাছে একটি বার্তা প্রদর্শন করুন:

      mResultBundle.putString(EXTRAS_KEY_CUSTOM_BROWSER_ACTION_RESULT_MESSAGE,
                    mContext.getString(stringRes))
      
    2. আইটেম আপডেট করুন (একটি আইটেমে ক্রিয়া আপডেট করতে ব্যবহার করুন):

      mResultBundle.putString(EXTRAS_KEY_CUSTOM_BROWSER_ACTION_RESULT_REFRESH_ITEM, mediaId);
      
    3. প্লেব্যাক ভিউ খুলুন:

      //Shows user the PBV without changing the playback state
      mResultBundle.putString(EXTRAS_KEY_CUSTOM_BROWSER_ACTION_RESULT_SHOW_PLAYING_ITEM, null);
      
    4. ব্রাউজ নোড আপডেট করুন:

      //Change current browse node to mediaId
      mResultBundle.putString(EXTRAS_KEY_CUSTOM_BROWSER_ACTION_RESULT_BROWSE_NODE, mediaId);
      
  4. ফলাফল পরীক্ষা করুন:

    • ত্রুটি: কল result.sendError(resultBundle)
    • অগ্রগতি আপডেট: কল result.sendProgressUpdate(resultBundle)
    • সমাপ্তি: কল result.sendResult(resultBundle)

কর্মের অবস্থা আপডেট করুন

EXTRAS_KEY_CUSTOM_BROWSER_ACTION_RESULT_REFRESH_ITEM কী সহ result.sendProgressUpdate(resultBundle) পদ্ধতি ব্যবহার করে, আপনি কর্মের নতুন অবস্থা প্রতিফলিত করতে MediaItem আপডেট করতে পারেন। এটি আপনাকে ব্যবহারকারীকে তাদের কর্মের অগ্রগতি এবং ফলাফল সম্পর্কে রিয়েল-টাইম প্রতিক্রিয়া প্রদান করতে দেয়।

নমুনা ডাউনলোড কর্ম

এই উদাহরণটি বর্ণনা করে যে আপনি কীভাবে তিনটি অবস্থার সাথে একটি ডাউনলোড অ্যাকশন বাস্তবায়ন করতে এই বৈশিষ্ট্যটি ব্যবহার করতে পারেন:

  • ডাউনলোড হল কর্মের প্রাথমিক অবস্থা। যখন ব্যবহারকারী এই ক্রিয়াটি নির্বাচন করেন, আপনি এটি ডাউনলোড করার সাথে অদলবদল করতে পারেন এবং ব্যবহারকারী ইন্টারফেস (UI) আপডেট করতে sendProgressUpdate কল করতে পারেন।

  • ডাউনলোড করার অবস্থা নির্দেশ করে যে ডাউনলোড চলছে। আপনি ব্যবহারকারীকে একটি অগ্রগতি বার বা অন্য সূচক দেখাতে এই অবস্থাটি ব্যবহার করতে পারেন।

  • ডাউনলোড করা অবস্থা নির্দেশ করে যে ডাউনলোড সম্পূর্ণ হয়েছে। ডাউনলোড শেষ হয়ে গেলে, আপনি ডাউনলোড করাকে ডাউনলোড করে অদলবদল করতে পারেন এবং EXTRAS_KEY_CUSTOM_BROWSER_ACTION_RESULT_REFRESH_ITEM কী দিয়ে sendResult কল করতে পারেন যাতে আইটেমটি রিফ্রেশ করা উচিত। উপরন্তু, আপনি ব্যবহারকারীকে একটি সফল বার্তা প্রদর্শন করতে EXTRAS_KEY_CUSTOM_BROWSER_ACTION_RESULT_MESSAGE কী ব্যবহার করতে পারেন৷

এই পদ্ধতিটি আপনাকে ডাউনলোড প্রক্রিয়া এবং এর বর্তমান অবস্থা সম্পর্কে ব্যবহারকারীকে স্পষ্ট প্রতিক্রিয়া প্রদান করতে দেয়। আপনি 25%, 50%, এবং 75% ডাউনলোড অবস্থা দেখানোর জন্য আইকনগুলির সাথে আরও বিশদ যোগ করতে পারেন।

নমুনা প্রিয় কর্ম

আরেকটি উদাহরণ হল দুটি রাজ্যের সাথে একটি প্রিয় কর্ম:

  • ব্যবহারকারীর পছন্দের তালিকায় না থাকা আইটেমগুলির জন্য প্রিয়টি প্রদর্শিত হয়৷ যখন ব্যবহারকারী এই ক্রিয়াটি নির্বাচন করেন, তখন এটিকে পছন্দের সাথে অদলবদল করুন এবং UI আপডেট করতে EXTRAS_KEY_CUSTOM_BROWSER_ACTION_RESULT_REFRESH_ITEM কী দিয়ে sendResult কল করুন৷

  • ব্যবহারকারীর পছন্দের তালিকার আইটেমগুলির জন্য পছন্দসই প্রদর্শিত হয়৷ ব্যবহারকারী যখন এই ক্রিয়াটি নির্বাচন করেন, তখন এটিকে পছন্দের সাথে অদলবদল করুন এবং UI আপডেট করতে EXTRAS_KEY_CUSTOM_BROWSER_ACTION_RESULT_REFRESH_ITEM কী দিয়ে sendResult কল করুন৷

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

আপনি TestMediaApp প্রকল্পে এই বৈশিষ্ট্যটির একটি ব্যাপক নমুনা বাস্তবায়ন দেখতে পারেন।