2013-08-14 16 views
5

Używam registerMediaRouteProvider i daje pasek głośności, aby zaktualizować głośność telewizora. Zaimplementowałem MediaRouteAdapter, a po wyszukaniu paska głośności głośność zmienia się, ale pasek ui zawsze resetuje się z powrotem do 0. Jak zaktualizować ui paska głośności, gdy zmienia się głośność?Jak zaktualizować pasek głośności w MinimalMediaRouteProvider

@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); 
    } 
} 

EDIT - dodaje gdzie zainicjować 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); 
     } 
    } 

This is the volume bar that is not updating

Odpowiedz

1

Na poziomie odbiornika, istnieją dwa sposoby, aby ustawić wielkość:

  1. cast.Receiver .Platform.setVolume ([0.0.1.0]) To ustawi głos lume i pokaż niebieski pasek. Jest to zwykle wywoływane przez komunikat onVolume.

  2. mediaElement.volume = [0,0, 1,0]; Spowoduje to ustawienie głośności bez wyświetlania niebieskiego paska. Możesz użyć tego do zanikania/zanikania i do wyrównania.

Teraz na kodzie Java: nie widzę, w jaki sposób są coraz messageStream w co pan pisał, ale ponieważ to może być słuszne. Oto lines from the reference docs:

public final MediaProtocolCommand setVolume (podwójna objętość)

Ustawia głośność dźwięku. Parametry Głośność w zakresie od 0,0 (0%) do 1,0 (100%). Zwroty Obiekt polecenia dla tego żądania Zgłasza Wyjątek IOException Jeśli wystąpi błąd wejścia/wyjścia podczas wysyłania wiadomości. IllegalStateException Jeśli ten strumień nie jest podłączony do podłączonego kanału.

+0

Tworzę 'MediaProtocolMessageStream' obiekt wewnątrz' ApplicationSession.Listener onSessionStarted'. Dodam powyższy kod.Mam już 'MediaProcolCommand'' setVolume' wewnątrz 'onSetVolume'. To, czego szukam, to jak zaktualizować pasek wyszukiwania głośności w wyskakującym okienku dialogowym, w którym pokazuje pasek głośności i przycisk rozłączenia. – heero

4

Szukałem tego przez kilka dni, a ja nagle znalazł rozwiązanie przeze mnie: P

Najpierw Musisz MediaRouteStateChangeListener sobie z tym poradzić.

MediaRouteStateChangeListener mRouteStateListener; 

Po drugie, przypisz słuchacza w onDeviceAvailable.

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

Ostatni zadzwoń MediaRouteStateListener.onVolumeChanged() w onSetVolume lub 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); 
    } 
} 

To powinno pomóc twojemu ruchowi objętościowemu w normalnym działaniu. :)

+0

Twoje rozwiązanie działało na przykładowym projekcie opartym na Androidzie. Ale kiedy zmieniam android.support.v7.app.MediaRouteActionProvider "na akcję z MediaRouteButton do użycia z ActionBarSherlock. Nie działa. Czy użyłeś actionProviderClass lub MediaRouteButton –

Powiązane problemy