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 в отличие от того, что мы думали ранее.

При открытии приложения это выглядит так:

  1. Позвонить, чтобы подключиться ()
  2. Вызовите обратный вызов onConnected и mMediaBrowser.subscribe(...) с параметрами
  3. Позвоните onLoadChildren с опциями
  4. С этого момента дальнейшие вызовы выполняются для onLoadChildren с параметрами

При открытии Android Auto это выглядит так:

  1. Позвонить, чтобы подключиться ()
  2. Звоните onLoadChildren без вариантов
  3. Вызовите обратный вызов onConnected и mMediaBrowser.subscribe(...) с параметрами
  4. Позвоните onLoadChildren с опциями
  5. С этого момента при нажатии на гарнитуру в Android Auto вызывается только onLoadChildren без опций

Таким образом, я не уверен, что делать дальше. Могу ли я что-то сделать на моей стороне, или это может быть ошибка Android Auto?

Спасибо!

1 ответ

Несмотря на то, что MediaBrowserService может обрабатывать пользовательские нумерации страниц, просмотр выполняется для вас в Android Auto. Смотрите эту документацию

То, что вы действительно контролируете, - это иерархия контента, которая предоставляется блоку для дерева браузера, а также немного стиля контента. В противном случае, вы ничего не сможете сделать, чтобы настроить нумерацию страниц при таргетинге на Android Auto.

Другие вопросы по тегам