Как обновить панель громкости в MinimalMediaRouteProvider

Я использую registerMediaRouteProvider, и он дает вам полосу громкости для обновления громкости телевизора. Я внедрил MediaRouteAdapter, и когда я прокручиваю полосу громкости, громкость меняется, но пользовательский интерфейс панели громкости всегда сбрасывается до 0. Как обновить пользовательский интерфейс панели громкости при изменении громкости?

@Override
public void onCreate(Bundle savedInstanceState) {

  mCastContext = new CastContext(getApplicationContext());
  MediaRouteHelper.registerMinimalMediaRouteProvider(mCastContext, this);
  mMediaRouter = MediaRouter.getInstance(getApplicationContext());
  mMediaRouteSelector = MediaRouteHelper.buildMediaRouteSelector(MediaRouteHelper.CATEGORY_CAST);
  mMetaData = new ContentMetadata();

  mMediaRouterCallback = new MyMediaRouterCallback();
  mMediaRouteButton.setRouteSelector(mMediaRouteSelector);
}

private class MyMediaRouterCallback extends MediaRouter.Callback {
    @Override
    public void onRouteSelected(MediaRouter router, RouteInfo route) {
        MediaRouteHelper.requestCastDeviceForRoute(route);
    }

    @Override
    public void onRouteUnselected(MediaRouter router, RouteInfo route) {
        try {
            if (mSession != null) {
                Log.e(TAG, "Ending session and stopping application");
                mSession.setStopApplicationWhenEnding(true);
                mSession.endSession();
            } else {
                Log.e(TAG, "onRouteUnselected: mSession is null");
            }
        } catch (IllegalStateException e) {
            Log.e(TAG, "onRouteUnselected:");
            e.printStackTrace();
        } catch (IOException e) {
            Log.e(TAG, "onRouteUnselected:");
            e.printStackTrace();
        }
        mSelectedDevice = null;
    }
}

 @Override
public void onDeviceAvailable(CastDevice device, String arg1, MediaRouteStateChangeListener listener) {
    mSelectedDevice = device;
    openSession();
}

@Override
public void onSetVolume(double volume) {
    try {
        if (mMessageStream != null) {
            mMessageStream.setVolume(volume);
        }
    } catch (IllegalStateException e) {
        Log.e(TAG, "Problem sending Set Volume", e);
    } catch (IOException e) {
        Log.e(TAG, "Problem sending Set Volume", e);
    }
}

@Override
public void onUpdateVolume(double volumeChange) {
    try {
        if (mCurrentRoute != null) {
            mCurrentRoute.requestUpdateVolume((int) (volumeChange * 20));
        }
    } catch (IllegalStateException e) {
        Log.e(TAG, "Problem sending Update Volume", e);
    }
}

РЕДАКТИРОВАТЬ - добавлено, где я инициализирую mMessageStream

private void openSession() {
        mSession = new ApplicationSession(mCastContext, mSelectedDevice);
        int flags = 0;
        flags |= ApplicationSession.FLAG_DISABLE_NOTIFICATION;
        flags |= ApplicationSession.FLAG_DISABLE_LOCK_SCREEN_REMOTE_CONTROL;
        mSession.setApplicationOptions(flags);

        Log.d(TAG, "Beginning session with context: " + mCastContext);
        Log.d(TAG, "The session to begin: " + mSession);
        mSession.setListener(new com.google.cast.ApplicationSession.Listener() {

            @Override
            public void onSessionStarted(ApplicationMetadata appMetadata) {
                Log.d(TAG, "Getting channel after session start");
                ApplicationChannel channel = mSession.getChannel();
                if (channel == null) {
                    Log.e(TAG, "channel = null");
                    return;
                }
                Log.d(TAG, "Creating and attaching Message Stream");
                mMessageStream = new MediaProtocolMessageStream();
                channel.attachMessageStream(mMessageStream);

                if (mMessageStream.getPlayerState() == null) {
                    if (vastVideoView.getPlayingPlaylistItem() != null) {
                        loadMedia();
                    }
                } else {
                    Log.e(TAG, "Found player already running; updating status");
                }
            }

            @Override
            public void onSessionStartFailed(SessionError error) {
                Log.e(TAG, "onStartFailed " + error + " code " + error.getCode());
                nowifi.setVisibility(View.GONE);
            }

            @Override
            public void onSessionEnded(SessionError error) {
                Log.i(TAG, "onEnded " + error);
                controller.removeChromeCastListener();
                controller.setChromeCast(false);
                nowifi.setVisibility(View.GONE);
            }
        });

        try {
            Log.e(TAG, "Starting session with app name " + getString(R.string.app_id));
            mSession.startSession(getString(R.string.app_id));

            vastVideoView.stopPlayback();

            controller = vastVideoView.getMediaController();
            controller.setChromeCast(true);
            controller.setPausePlayListener(pausePlayListener);
            seekBar = controller.getSeekBar();
            seekBar.setProgress(0);

            mPlayButtonShowsPlay = true;
        } catch (IOException e) {
            Log.e(TAG, "Failed to open session", e);
            controller.removeChromeCastListener();
            controller.setChromeCast(false);
            nowifi.setVisibility(View.GONE);
        }
    }

Это панель громкости, которая не обновляется


person heero    schedule 14.08.2013    source источник


Ответы (3)


Я искал это несколько дней и внезапно нашел решение сам: P

Во-первых, вам понадобится MediaRouteStateChangeListener, чтобы справиться с этим.

MediaRouteStateChangeListener mRouteStateListener;

Во-вторых, назначьте слушателя в onDeviceAvailable.

@Override
public void onDeviceAvailable(CastDevice device, String arg1, MediaRouteStateChangeListener listener) {
    mSelectedDevice = device;
    mRouteStateListener = listener;
    openSession();
}

Наконец, позвоните MediaRouteStateListener.onVolumeChanged() в onSetVolume или onUpdateVolume.

@Override
public void onSetVolume(double volume) {
    try {
        if (mMessageStream != null) {
            mMessageStream.setVolume(volume);
            mRouteStateListener.onVolumeChanged(volume);
        }
    } catch (IllegalStateException e) {
        Log.e(TAG, "Problem sending Set Volume", e);
    } catch (IOException e) {
        Log.e(TAG, "Problem sending Set Volume", e);
    }
}

Это должно помочь вашей панели поиска громкости работать нормально. :)

person Allan Sun    schedule 18.09.2013
comment
Ваше решение работало в проекте android-cast-sample. Но когда я меняю android.support.v7.app.MediaRouteActionProvider на элемент действия с MediaRouteButton для использования с ActionBarSherlock. Это не работает. Вы использовали actionProviderClass или MediaRouteButton? - person Huy Duong Tu; 29.11.2013

На уровне приемника есть два способа установить громкость:

  1. cast.Receiver.Platform.setVolume([0.0,1.0]) Это установит громкость и покажет синюю полосу. Это то, что обычно вызывается сообщением onVolume.

  2. mediaElement.volume = [0.0, 1.0]; Это установит громкость без отображения синей полосы. Вы можете использовать это для плавного появления/затухания и для эквалайзера.

Теперь перейдем к вашему коду Java: я не понимаю, как вы получаете свой поток сообщений в том, что вы опубликовали, но поскольку это, вероятно, будет правильным. Вот строки из справочные документы:

открытый окончательный MediaProtocolCommand setVolume (двойной объем)

Устанавливает громкость звука. Параметры volume Громкость в диапазоне от 0,0 (0%) до 1,0 (100%). Возвращает Объект команды для этого запроса Выдает IOException Если при отправке сообщения возникает ошибка ввода-вывода. IllegalStateException Если этот поток не подключен к подключенному каналу.

person Les Vogel - Google DevRel    schedule 15.08.2013
comment
Я создаю объект MediaProtocolMessageStream внутри ApplicationSession.Listener onSessionStarted. Я добавлю код выше. У меня уже есть MediaProcolCommand setVolume внутри onSetVolume. Я ищу, как обновить панель поиска громкости во всплывающем диалоговом окне, где она показывает панель громкости и кнопку отключения. - person heero; 16.08.2013

Этим летом Google обновил регуляторы громкости, чтобы они были общими для подключенных устройств и приложений. Пожалуйста, посмотрите мое решение здесь:

https://stackoverflow.com/a/26554007/672373

person radley    schedule 24.10.2014