1

最近,我一直在尝试在我的应用程序的 Android Auto 部分实现分页。为此,我从这篇Medium 帖子中获得了灵感。这个问题也有关系。但是,我仍然卡住了:虽然我可以让 Medium 帖子中的代码在常规应用程序上运行,但 Android Auto 集成并不能很好地工作。

长话短说,帖子中使用的技术是订阅 MediaBrowser 并传递分页意图。然后,调用带有 options 参数的 onLoadChildren 方法:

public void onLoadChildren(@NonNull String parentId, @NonNull Result<List<MediaBrowserCompat.MediaItem>> result, @NonNull Bundle options) {

这适用于常规应用程序。但是,当从 Android Auto 调用应用程序时,会调用不带 options 参数的常规方法:

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());
+    }
+
 }

我观察到以下情况:

正常启动应用程序时会调用带有选项 Bundle 的新 onLoadChildren 方法。有趣的是,Android Auto 在启动时会调用 MusicPlayerActivity,并且每次都会调用 connect(),所以我肯定需要保留对 connect() 的调用。这很重要,因为这意味着我们不必像之前想的那样尝试获取 Android Auto 使用的 MediaBrowser 实例。

打开应用程序时,它是这样的:

  1. 调用connect()
  2. 使用选项调用 onConnected 回调和 mMediaBrowser.subscribe(...)
  3. 使用选项调用 onLoadChildren
  4. 从那时起,使用选项对 onLoadChildren 进行进一步调用

打开 Android Auto 时,它是这样的:

  1. 调用connect()
  2. 不带选项调用 onLoadChildren
  3. 使用选项调用 onConnected 回调和 mMediaBrowser.subscribe(...)
  4. 使用选项调用 onLoadChildren
  5. 从那时起,在 Android Auto 中点击耳机时,只会调用不带选项的 onLoadChildren

因此,我不确定下一步该做什么。有什么我可以做的吗,或者它可能是一个 Android Auto 错误?

谢谢!

4

1 回答 1

0

尽管 MediaBrowserService 可以处理自定义分页,但在 Android Auto 中会为您处理浏览。请参阅本文档

您可以控制的是提供给浏览器树抽屉的内容层次结构以及一些内容样式。否则,在针对 Android Auto 时,您无法自定义分页。

于 2019-04-22T22:52:16.810 回答