2013-08-14 10 views
5

Ich verwende registerMediaRouteProvider und es gibt Ihnen eine Lautstärkeleiste, um die Lautstärke des Fernsehers zu aktualisieren. Ich habe MediaRouteAdapter implementiert und wenn ich die Lautstärkeleiste schrubbe, ändert sich das Volumen, aber die Lautstärkeleiste des Volumes wird immer auf 0 zurückgesetzt. Wie aktualisiere ich das UI der Lautstärkeleiste, wenn sich das Volumen ändert?So aktualisieren Sie die Lautstärkeleiste in 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 - hinzugefügt, wo ich 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

Antwort

1

Auf der Empfängerebene gibt es zwei Möglichkeiten, um die Lautstärke einzustellen initialisieren:

  1. cast.Receiver .Platform.setVolume ([0.0,1.0]) Damit wird vo eingestellt lumen und zeige den blauen Balken. Dies wird üblicherweise von der onVolume-Nachricht aufgerufen.

  2. mediaElement.volume = [0.0, 1.0]; Damit wird die Lautstärke eingestellt, ohne den blauen Balken anzuzeigen. Sie können dies zum Ein-/Ausblenden und zur Entzerrung verwenden.

Nun zu Ihrem Java-Code: Ich sehe nicht, wie Sie Ihre Message in das bekommen, was Sie gepostet haben, aber da ist es wahrscheinlich das Richtige sein. Hier ist die lines from the reference docs:

public final MediaProtocolCommand setVolume (doppeltes Volumen)

Legt die Lautstärke. Parameter Volumen Das Volumen im Bereich von 0,0 (0%) bis 1,0 (100%). Rückgabe Das Befehlsobjekt für diese Anforderung löst IOException Wenn ein E/A-Fehler beim Senden der Nachricht auftritt. IllegalStateException Wenn dieser Stream nicht an einen verbundenen Kanal angeschlossen ist.

+0

Ich bin ein 'MediaProtocolMessageStream' Objekt innerhalb des' ApplicationSession.Listener onSessionStarted' zu schaffen. Ich füge den obigen Code hinzu.Ich habe bereits 'MediaProcollCommand'' setVolume' in 'onSetVolume'. Was ich suche, ist, wie man die Lautstärke-Suchleiste in dem Dialog-Popup aktualisiert, wo es dir die Lautstärkeleiste zeigt und die Taste – heero

4

Ich habe seit Tagen für diese Suche und fand ich plötzlich die Lösung von mir: P

Zunächst werden Sie eine MediaRouteStateChangeListener brauchen, dies zu umgehen.

MediaRouteStateChangeListener mRouteStateListener; 

Zweitens zuweisen Sie den Listener in onDeviceAvailable.

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

Last, rufen MediaRouteStateListener.onVolumeChanged() in onSetVolume oder 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); 
    } 
} 

Dies sollte Ihrem Volume seekbar helfen, normal zu handeln. :)

+0

löscht. Deine Lösung hat am android-Cast-Sample-Projekt funktioniert. Aber wenn ich android.support.v7.app.MediaRouteActionProvider "zu Aktion Element mit MediaRouteButton mit ActionBarSherlock zu verwenden. Es funktioniert nicht. Haben Sie actionProviderClass oder MediaRouteButton verwendet –