Подтвердить что ты не робот

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

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

Если вы не знаете, что я имею в виду под "наложением удаленного тома MediaSession", вот снимок экрана:

enter image description here

Я создал демонстрационный проект, который вы можете скачать здесь: 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));
            }
        };
    }

    ...
}

Есть намеки? Заранее спасибо!

4b9b3361