Как установить EXTRA_PAGE и EXTRA_PAGE_SIZE в MediaBrowserServiceCompat, получив ссылку на Android Auto MediaBrowser?
У меня есть приложение Android Auto. Я хотел бы воспользоваться нумерацией страниц для просмотра в приложении. Похоже, что вы можете установить EXTRA_PAGE и EXTRA_PAGE_SIZE, получив ссылку на MediaBrowserCompat и передав эти константы в.subscribe(). Однако я не могу понять, как получить ссылку на MediaBrowserCompat, который Android Auto Audio использует для вызова.subscribe().
Это кажется слишком сложным для чего-то, что должно быть простым, я просто обдумываю вещи?
2 ответа
Как получить ссылку на Android Auto MediaBrowser? Для этого вы должны знать имя пакета и имя класса (если вы пытаетесь связать его вне приложения). Если вы не знаете этих подробностей, вы можете просто получить их у менеджера пакетов.
final Intent providerIntent =
new Intent(MediaBrowserService.SERVICE_INTERFACE);
List<ResolveInfo> mediaApps =
mPackageManager.queryIntentServices(providerIntent, 0);
for (ResolveInfo info : mediaApps) {
new MediaBrowserCompat(context,
new ComponentName(info.serviceInfo.packageName,
info.serviceInfo.name), mConnectionCallbacks, null);
}
Как установить EXTRA_PAGE и EXTRA_PAGE_SIZE?
Bundle bundle = new Bundle();
bundle.putInt(MediaBrowserCompat.EXTRA_PAGE, 1);
bundle.putInt(MediaBrowserCompat.EXTRA_PAGE_SIZE, 1);
mBrowser.subscribe("__SOME_ID__", bundle, callback);
Если вы переопределяете onLoadChildren() с пакетом на стороне службы, то вам также придется обрабатывать логику подкачки. Вы можете обойти это, просто переопределив onLoadChildren без связки.
Обратите внимание: обычно в Android, когда вы видите в конце суффикс компата, это новая (улучшенная) версия без компата.
MediaActivity - это не особая активность, это вид деятельности, которая предназначена для воспроизведения музыки. И, как вы спросили MediaBrowserCompat и MediaBrowserServiceCompat, я изменил свою архитектуру по умолчанию (Архитектура 2 представлена ниже) на Архитектуру 1 (Архитектура 1 представлена ниже, которая впервые представлена в версии 22), просто чтобы дать точный ответ на ваш вопрос.
Две Архитектуры:
Architecture1)
1) MediaActivity <--uses----> MediaBrowserCompat <---uses--> MediaServiceBrowserCompat <----> MediaSessionCompat <---> MediaSession <--pass session token --> MediaControllerCompat <-- it also passes token to create --> MediaController /* latest API introduced in 22 */
2)
<service android:name=".MyMediaBrowserServiceCompat"
android:label="@string/service_name" >
<intent-filter>
<action android:name="android.media.browse.MediaBrowserService" />
</intent-filter>
</service>
3) Uses MediaSessionCompat to control music playing.
4) Once a session is created the owner of the session may pass its session token to other processes to allow them to create a MediaControllerCompat to interact with the session.
5) A MediaController can be created if you have a MediaSessionCompat.Token from the session owner.
Теперь вы создали MediaController
Отсюда обе архитектуры делают одно и то же.
Architecture2)
1) MediaActivity <--uses----> MediaBrowser <---uses--> MediaServiceBrowser /* old one introduced in 21. This is default */
2)
<service android:name=".MyMediaBrowserService"
android:label="@string/service_name" >
<intent-filter>
<action android:name="android.media.browse.MediaBrowserService" />
</intent-filter>
</service>
3) Uses MediaSession to control music playing
4) Once a session is created the owner of the session may pass its session token to other processes to allow them to create a MediaController to interact with the session.
5) A MediaController can be created through MediaSessionManager if you hold the "android.permission.MEDIA_CONTENT_CONTROL" permission or are an enabled notification listener or by getting a MediaSession.Token directly from the session owner.
Теперь вы создали MediaController
Отсюда обе архитектуры делают одно и то же.
Примечание. По умолчанию при создании проекта Android Auto он по-прежнему использует архитектуру 2, но я использую архитектуру 1, потому что вы попросили сделать это через MediaBrowserCompat. Таким образом, вы можете быть немного смущены здесь.
Поскольку точная реализация довольно длинная, поэтому я предоставляю точную ссылку, где вы можете найти реализацию через MediaBrowserCompat (Архитектура 1) https://github.com/googlesamples/android-MediaBrowserService
Я публикую здесь базовый код, основанный на архитектуре - потому что он новый, введенный в версии 22 - достаточно, чтобы показать, как вы можете получить ссылку на MediaBrowserCompat.
mConnectionCallbacks - это главное, что связывает MediaServiceBrowserCompat с MediaBrowserCompat. MediaBrowserCompat управляет носителем, предоставленным MediaServiceBrowserCompat. Деятельность, которая предназначена для управления медиа, называется MediaActivity. MediaActivity использует MediaBrowserCompat для управления мультимедиа (например, громкость, изменение воспроизведения и т. Д.). MediaBrowserCompat устанавливает mConnectionCallbacks, который дополнительно имеет методы onConnected() и т. Д., Где вы можете разместить свою собственную логику.
public class MyMediaActivity /* can be any activity */ extends AppCompatActivity {
private MediaBrowserCompat mMediaBrowserCompat; /* your reference here */
MediaControllerCompat mediaController = MediaControllerCompat.getMediaController(MyMediaActivity.this);
MediaControllerCompat.Callback controllerCallback =
new MediaControllerCompat.Callback() {
@Override
public void onMetadataChanged(MediaMetadataCompat metadata) {
}
@Override
public void onPlaybackStateChanged(PlaybackStateCompat state) {
}
};
private MediaBrowserCompat.ConnectionCallback mConnectionCallbacks =
new MediaBrowserCompat.ConnectionCallback() {
@Override
public void onConnected() {
// Get the token for the MediaSession
MediaSessionCompat.Token token = mMediaBrowserCompat.getSessionToken();
// Create a MediaControllerCompat
MediaControllerCompat mediaController =
null;
try {
mediaController = new MediaControllerCompat(MyMediaActivity.this, // Context
token);
} catch (RemoteException e) {
e.printStackTrace();
}
// Save the controller
MediaControllerCompat.setMediaController(MyMediaActivity.this, mediaController);
// Finish building the UI
buildTransportControls();
}
@Override
public void onConnectionSuspended() {
// The Service has crashed. Disable transport controls until it automatically reconnects
}
@Override
public void onConnectionFailed() {
// The Service has refused our connection
}
};
void buildTransportControls() {
/* you can define your view to control music here */
/* your stuffs here */
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Display the initial state
MediaMetadataCompat metadata = mediaController.getMetadata();
PlaybackStateCompat pbState = mediaController.getPlaybackState();
// Register a Callback to stay in sync
mediaController.registerCallback(controllerCallback);
mConnectionCallbacks = new MediaBrowserCompat.ConnectionCallback();
/* your MediaBrowserCompat instance reference here*/
mMediaBrowserCompat = new MediaBrowserCompat(this,
new ComponentName(this, MyMediaBrowserServiceCompat.class),
mConnectionCallbacks,
null); // optional Bundle
/* now you can call subscribe() callbacks via mMediaBrowserCompat.subscribe(.....) anywhere inside this Activity's
lifecycle callbacks
*/
}
@Override
public void onStart() {
super.onStart();
mMediaBrowserCompat.connect();
}
@Override
public void onStop() {
super.onStop();
// (see "stay in sync with the MediaSession")
if (MediaControllerCompat.getMediaController(MyMediaActivity.this) != null) {
MediaControllerCompat.getMediaController(MyMediaActivity.this).unregisterCallback(controllerCallback);
}
mMediaBrowserCompat.disconnect();
}
}
И теперь вы можете создать MediaBrowserServiceCompat / * примечание MediaBrowserServiceCompat - это сервис */, как показано ниже.
public class MyMediaBrowserServiceCompat extends MediaBrowserServiceCompat {
/* various calbacks here */
}
Для получения дополнительной информации, вы можете прочитать эту ссылку, которая в точности объясняет логику, которую я представил выше. https://developer.android.com/guide/topics/media-apps/audio-app/building-a-mediabrowser-client.html