Недавно я пытался внедрить нумерацию страниц в Android-часть своего приложения.Для этого я черпал вдохновение из этого Medium post . Этот вопрос также связан.Однако я все еще застрял: хотя я могу заставить код из поста 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?
Спасибо!