Intereting Posts

Как обрабатывать изменения с оверлея удаленных томов MediaSession?

Я пытаюсь реализовать дистанционный контроль громкости. Он уже работает для управления томом с помощью аппаратных клавиш громкости. Но когда я пытаюсь переместить слайдер в оверлей удаленного тома VolumeProviderCompat.onAdjustVolume(..) то VolumeProviderCompat.onAdjustVolume(..) не вызывается. Я также пробовал другие обратные вызовы, такие как MediaSessionCompat.Callback.onMediaButtonEvent(..) или VolumeProviderCompat.onSetVolumeTo(..) но они вообще не вызываются.

Если вы не знаете, что я имею в виду с «Оверлей удаленного громкоговорителя MediaSession», вот скриншот: MediaSessionRemoteVolumeOverlay

Я создал демо-проект, который вы можете скачать здесь: https://github.com/SaschaZ/VolumeProviderDemo

Вот связанные части моего DemoActivity:

 public class DemoActivity extends AppCompatActivity { ... private Notification createNotification(@NonNull final DemoVolumeController demoVolumeController) { Log.d(TAG, "createNotification()"); final NotificationCompat.Builder builder = new NotificationCompat.Builder(this) .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) .setPriority(NotificationCompat.PRIORITY_HIGH) .setSmallIcon(R.mipmap.ic_launcher); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { if (session != null) { session.release(); } session = new MediaSessionCompat(this, "demoMediaSession"); session.setPlaybackState(new PlaybackStateCompat.Builder() .setState(PlaybackStateCompat.STATE_PLAYING, 1, 1.0f) .build()); session.setPlaybackToRemote(createVolumeProvider(demoVolumeController)); session.setActive(true); } return builder.build(); } private VolumeProviderCompat createVolumeProvider(@NonNull final DemoVolumeController demoVolumeController) { // I don't use this callback directly, but i need to set it or my VolumeProvider will not work. (sounds // strange but i tried it several times) session.setCallback(new MediaSessionCompat.Callback() { @Override public boolean onMediaButtonEvent(final Intent mediaButtonEvent) { Log.d(TAG, "onMediaButtonEvent() called with: " + "mediaButtonEvent = [" + mediaButtonEvent + "]"); return super.onMediaButtonEvent(mediaButtonEvent); } }); return new VolumeProviderCompat(VolumeProviderCompat.VOLUME_CONTROL_RELATIVE, 100, demoVolumeController.getVolume()) { @Override public void onAdjustVolume(final int direction) { final int volume = demoVolumeController.setVolumeRelative(direction); showVolume(volume); Log.d(TAG, "onAdjustVolume() called with: " + "direction = [" + direction + "] - " + "new volume=" + volume); // Nasty hack to get sync with the volume overlay of android. setCurrentVolume does not work :( session.setPlaybackToRemote(createVolumeProvider(demoVolumeController)); } }; } ... } 

Любые намеки? Заранее спасибо!