مشابه نحوه استفاده از کنشهای پخش سفارشی برای پشتیبانی از قابلیتهای منحصربهفرد در نمای بازپخش، میتوانید از کنشهای مرور سفارشی برای پشتیبانی از قابلیتهای منحصربهفرد در نماهای مرور استفاده کنید. برای مثال، میتوانید از عملکردهای مرور سفارشی استفاده کنید تا کاربران بتوانند لیستهای پخش را دانلود کنند یا یک مورد را به صف اضافه کنند.
هنگامی که اقدامات سفارشی بیشتری نسبت به نمایش داده شده توسط سازنده تجهیزات اصلی (OEM) وجود داشته باشد، یک منوی سرریز به کاربر نمایش داده می شود. هر اقدام مرور سفارشی با یک تعریف می شود:
- شناسه اقدام: شناسه رشته منحصر به فرد
- برچسب اقدام: متن نمایش داده شده به کاربر
- Action icon Resource identifier (URI): وکتور قابل ترسیم که می تواند رنگ آمیزی شود
شکل 1. سرریز عمل مرور سفارشی.
شما فهرستی از اقدامات مرور سفارشی را در سطح جهانی به عنوان بخشی از BrowseRoot
خود تعریف می کنید. سپس زیر مجموعه ای از این اقدامات را به MediaItem
فردی پیوست کنید.
وقتی کاربر با یک عملکرد مرور سفارشی تعامل میکند، برنامه شما در onCustomAction
یک تماس پاسخ دریافت میکند. سپس این اکشن را انجام میدهید و در صورت لزوم فهرست اقدامات MediaItem
را بهروزرسانی میکنید. این برای اقدامات حالتی مانند Favorite و Download مفید است. برای کنشهایی که نیازی به بهروزرسانی ندارند، مانند Play Radio، لازم نیست فهرست کنشها را بهروزرسانی کنید.
شکل 2. نوار ابزار اقدام مرور سفارشی.
همچنین میتوانید اقدامات مرور سفارشی را به ریشه گره مرور پیوست کنید. این اقدامات در یک نوار ابزار ثانویه در زیر نوار ابزار اصلی نمایش داده می شوند.
برای افزودن عملکردهای مرور سفارشی به برنامه خود:
دو روش را در اجرای
MediaBrowserServiceCompat
خود لغو کنید:محدودیت های عمل را در زمان اجرا تجزیه کنید:
در
onGetRoot
، با استفاده از کلیدBROWSER_ROOT_HINTS_KEY_CUSTOM_BROWSER_ACTION_LIMIT
درrootHints
Bundle
، حداکثر تعداد اعمال مجاز را برای هرMediaItem
دریافت کنید. محدودیت 0 نشان می دهد که این ویژگی توسط سیستم پشتیبانی نمی شود.فهرست جهانی اقدامات مرور سفارشی را بسازید. برای هر عمل، یک شی
Bundle
با این کلیدها ایجاد کنید:- شناسه اقدام
EXTRAS_KEY_CUSTOM_BROWSER_ACTION_ID
- برچسب اقدام
EXTRAS_KEY_CUSTOM_BROWSER_ACTION_LABEL
- نماد اقدام URI
EXTRAS_KEY_CUSTOM_BROWSER_ACTION_ICON_URI
- شناسه اقدام
تمام اشیاء Action
Bundle
را به یک لیست اضافه کنید.لیست جهانی را به
BrowseRoot
خود اضافه کنید. درBrowseRoot
Bundle
با استفاده از کلیدBROWSER_SERVICE_EXTRAS_KEY_CUSTOM_BROWSER_ACTION_ROOT_LIST
، فهرستی از اقدامات را بهعنوانArrayList
Parcelable
اضافه کنید.اعمالی را به اشیاء
MediaItem
خود اضافه کنید. میتوانید با استفاده از کلیدDESCRIPTION_EXTRAS_KEY_CUSTOM_BROWSER_ACTION_ID_LIST
، کنشها را با گنجاندن فهرست شناسههای کنش در موارد اضافیMediaDescriptionCompat
به اشیاء جداگانهMediaItem
اضافه کنید. این لیست باید زیرمجموعه ای از فهرست جهانی اقداماتی باشد که درBrowseRoot
تعریف کرده اید.مدیریت اقدامات و بازگشت پیشرفت یا نتایج:
در
onCustomAction
، عملکرد را بر اساس شناسه اقدام و هر داده دیگری که نیاز دارید مدیریت کنید. با استفاده از کلیدEXTRAS_KEY_CUSTOM_BROWSER_ACTION_MEDIA_ITEM_ID
میتوانید شناسهMediaItem
را که این عمل را آغاز کرده است، از موارد اضافی دریافت کنید.با قرار دادن کلید
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 اضافه کنید
تمام اشیاء Bundle
اقدام مرور سفارشی را به یک ArrayList
اضافه کنید:
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 اضافه کنید
شناسههای Browse Actions در 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);
بر روی نتیجه CustomAction بسازید
برای ساختن نتیجه:
mediaId
ازBundle extras
تجزیه کنید@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); }
برای نتایج ناهمزمان، نتیجه را جدا کنید
result.detach
.بسته نتیجه را بسازید:
نمایش یک پیام به کاربر:
mResultBundle.putString(EXTRAS_KEY_CUSTOM_BROWSER_ACTION_RESULT_MESSAGE, mContext.getString(stringRes))
به روز رسانی مورد (برای به روز رسانی اقدامات در یک مورد استفاده کنید):
mResultBundle.putString(EXTRAS_KEY_CUSTOM_BROWSER_ACTION_RESULT_REFRESH_ITEM, mediaId);
نمای پخش را باز کنید:
//Shows user the PBV without changing the playback state mResultBundle.putString(EXTRAS_KEY_CUSTOM_BROWSER_ACTION_RESULT_SHOW_PLAYING_ITEM, null);
گره مرور را به روز کنید:
//Change current browse node to mediaId mResultBundle.putString(EXTRAS_KEY_CUSTOM_BROWSER_ACTION_RESULT_BROWSE_NODE, mediaId);
نتیجه را بررسی کنید:
- خطا: call
result.sendError(resultBundle)
- به روز رسانی پیشرفت: call
result.sendProgressUpdate(resultBundle)
- پایان: فراخوانی
result.sendResult(resultBundle)
- خطا: call
وضعیت عملکرد را به روز کنید
با استفاده از روش result.sendProgressUpdate(resultBundle)
با کلید EXTRAS_KEY_CUSTOM_BROWSER_ACTION_RESULT_REFRESH_ITEM
، می توانید MediaItem
به روز کنید تا وضعیت جدید عملکرد را منعکس کند. این به شما امکان میدهد در زمان واقعی به کاربر در مورد پیشرفت و نتیجه عملکرد او بازخورد ارائه دهید.
نمونه اقدام دانلود
این مثال توضیح می دهد که چگونه می توانید از این ویژگی برای اجرای یک اقدام دانلود با سه حالت استفاده کنید:
دانلود حالت اولیه اکشن است. وقتی کاربر این عمل را انتخاب کرد، میتوانید آن را با Downloading تعویض کنید و
sendProgressUpdate
را برای بهروزرسانی رابط کاربری (UI) فراخوانی کنید.وضعیت دانلود نشان می دهد که دانلود در حال انجام است. می توانید از این حالت برای نشان دادن نوار پیشرفت یا نشانگر دیگری به کاربر استفاده کنید.
حالت دانلود شده نشان می دهد که دانلود کامل شده است. وقتی بارگیری تمام شد، میتوانید Downloading را با Downloaded تعویض کنید و
sendResult
با کلیدEXTRAS_KEY_CUSTOM_BROWSER_ACTION_RESULT_REFRESH_ITEM
فراخوانی کنید تا نشان دهید که مورد باید بهروزرسانی شود. علاوه بر این، می توانید از کلیدEXTRAS_KEY_CUSTOM_BROWSER_ACTION_RESULT_MESSAGE
برای نمایش پیام موفقیت آمیز به کاربر استفاده کنید.
این رویکرد به شما امکان می دهد بازخورد واضحی در مورد فرآیند دانلود و وضعیت فعلی آن به کاربر ارائه دهید. می توانید جزئیات بیشتری را با نمادها اضافه کنید تا وضعیت های دانلود 25٪، 50٪ و 75٪ را نشان دهید.
نمونه اقدام مورد علاقه
مثال دیگر یک عمل مورد علاقه با دو حالت است:
موارد دلخواه برای مواردی که در لیست علاقه مندی های کاربر نیستند نمایش داده می شود. وقتی کاربر این عملکرد را انتخاب کرد، آن را با Favorited عوض کنید و
sendResult
با کلیدEXTRAS_KEY_CUSTOM_BROWSER_ACTION_RESULT_REFRESH_ITEM
برای به روز رسانی رابط کاربری فراخوانی کنید.موارد دلخواه برای موارد موجود در لیست علاقه مندی های کاربر نمایش داده می شود. وقتی کاربر این عملکرد را انتخاب کرد، آن را با Favorite تعویض کنید و
sendResult
با کلیدEXTRAS_KEY_CUSTOM_BROWSER_ACTION_RESULT_REFRESH_ITEM
برای به روز رسانی رابط کاربری فراخوانی کنید.
این رویکرد راهی واضح و ثابت را برای کاربران فراهم می کند تا آیتم های مورد علاقه خود را مدیریت کنند. این مثالها انعطافپذیری عملکردهای مرور سفارشی و نحوه استفاده از آنها را برای پیادهسازی انواع عملکردها با بازخورد بلادرنگ برای یک تجربه کاربری پیشرفته در برنامه رسانه خودرو نشان میدهند.
نمونه جامع پیاده سازی این قابلیت را می توانید در پروژه TestMediaApp
مشاهده کنید.