最近,我一直在尝试在我的应用程序的 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 实例。
打开应用程序时,它是这样的:
- 调用connect()
- 使用选项调用 onConnected 回调和 mMediaBrowser.subscribe(...)
- 使用选项调用 onLoadChildren
- 从那时起,使用选项对 onLoadChildren 进行进一步调用
打开 Android Auto 时,它是这样的:
- 调用connect()
- 不带选项调用 onLoadChildren
- 使用选项调用 onConnected 回调和 mMediaBrowser.subscribe(...)
- 使用选项调用 onLoadChildren
- 从那时起,在 Android Auto 中点击耳机时,只会调用不带选项的 onLoadChildren
因此,我不确定下一步该做什么。有什么我可以做的吗,或者它可能是一个 Android Auto 错误?
谢谢!