Android Auto: разбиение на страницы MediaBrowserService путем передачи дополнительных пакетов параметров завершается неудачно
Недавно я пытался реализовать нумерацию страниц в Android-приложении моего приложения. Для этого я черпал вдохновение из этого поста Medium. Этот вопрос также связан. Однако я все еще застрял: хотя я могу заставить код из поста Medium работать на обычном приложении, интеграция с Android Auto работает не совсем хорошо.
Короче говоря, техника, используемая в посте, состоит в том, чтобы подписаться на MediaBrowser и передать намерения о нумерации страниц. Затем вызывается метод onLoadChildren с аргументом options:
public void onLoadChildren(@NonNull String parentId, @NonNull Result<List<MediaBrowserCompat.MediaItem>> result, @NonNull Bundle options) {
Это работает из обычного приложения. Однако при вызове приложения из Android Auto вызывается обычный метод без аргумента параметров:
public void onLoadChildren(@NonNull String parentId, @NonNull Result<List<MediaBrowserCompat.MediaItem>> result) {
В результате невозможно разбить на страницы результаты из Android Auto.
Я провел несколько экспериментов с этим проектом, это очень простой пример, чтобы показать, как работают MediaBrowser и MediaBrowserService. Я применил следующий патч:
===================================================================
--- final/src/main/java/com/example/android/musicplayercodelab/MusicPlayerActivity.java (revision d322b5a62b0da5afba209553bcccb660c12529d7)
+++ final/src/main/java/com/example/android/musicplayercodelab/MusicPlayerActivity.java (date 1551653654000)
@@ -57,7 +58,10 @@
new MediaBrowserCompat.ConnectionCallback() {
@Override
public void onConnected() {
- mMediaBrowser.subscribe(mMediaBrowser.getRoot(), mSubscriptionCallback);
+ Bundle extra = new Bundle();
+ extra.putInt(MediaBrowserCompat.EXTRA_PAGE, 0);
+ extra.putInt(MediaBrowserCompat.EXTRA_PAGE_SIZE, 10);
+ mMediaBrowser.subscribe(mMediaBrowser.getRoot(), extra, mSubscriptionCallback);
try {
MediaControllerCompat mediaController =
new MediaControllerCompat(
@@ -100,7 +104,7 @@
new MediaBrowserCompat.SubscriptionCallback() {
@Override
public void onChildrenLoaded(
- String parentId, List<MediaBrowserCompat.MediaItem> children) {
+ String parentId, List<MediaBrowserCompat.MediaItem> children, @NonNull Bundle options) {
onMediaLoaded(children);
}
};
===================================================================
--- final/src/main/java/com/example/android/musicplayercodelab/MusicService.java (revision d322b5a62b0da5afba209553bcccb660c12529d7)
+++ final/src/main/java/com/example/android/musicplayercodelab/MusicService.java (date 1551653364000)
@@ -116,4 +117,10 @@
final String parentMediaId, final Result<List<MediaBrowserCompat.MediaItem>> result) {
result.sendResult(MusicLibrary.getMediaItems());
}
+
+ @Override
+ public void onLoadChildren(@NonNull String parentId, @NonNull Result<List<MediaBrowserCompat.MediaItem>> result, @NonNull Bundle options) {
+ result.sendResult(MusicLibrary.getMediaItems());
+ }
+
}
Я заметил следующее:
новый метод onLoadChildren с параметрами Bundle вызывается при обычном запуске приложения. Интересно, что Android Auto вызывает MusicPlayerActivity при его запуске и каждый раз вызывает connect(), поэтому мне обязательно нужно сохранить вызов connect(). Это важно, потому что это означает, что нам не нужно пытаться заставить экземпляр MediaBrowser использовать Android Auto в отличие от того, что мы думали ранее.
При открытии приложения это выглядит так:
- Позвонить, чтобы подключиться ()
- Вызовите обратный вызов onConnected и mMediaBrowser.subscribe(...) с параметрами
- Позвоните onLoadChildren с опциями
- С этого момента дальнейшие вызовы выполняются для onLoadChildren с параметрами
При открытии Android Auto это выглядит так:
- Позвонить, чтобы подключиться ()
- Звоните onLoadChildren без вариантов
- Вызовите обратный вызов onConnected и mMediaBrowser.subscribe(...) с параметрами
- Позвоните onLoadChildren с опциями
- С этого момента при нажатии на гарнитуру в Android Auto вызывается только onLoadChildren без опций
Таким образом, я не уверен, что делать дальше. Могу ли я что-то сделать на моей стороне, или это может быть ошибка Android Auto?
Спасибо!
1 ответ
Несмотря на то, что MediaBrowserService может обрабатывать пользовательские нумерации страниц, просмотр выполняется для вас в Android Auto. Смотрите эту документацию
То, что вы действительно контролируете, - это иерархия контента, которая предоставляется блоку для дерева браузера, а также немного стиля контента. В противном случае, вы ничего не сможете сделать, чтобы настроить нумерацию страниц при таргетинге на Android Auto.