2016-10-10 7 views
6

Я хочу осуществить изменение объема, как показано на Youtube приложение во время литья, как если приложение в фоновом режиме или на экране блокировкиAndroid MediaRouter Объемные события

Like this

private void createSession() { 
    ComponentName receiver = new ComponentName(getPackageName(), RemoteReceiver.class.getName()); 
    mediaSession = new MediaSessionCompat(this, "PlayerService", receiver, null); 
    mediaSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS | 
      MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS); 
    mediaSession.setPlaybackState(new PlaybackStateCompat.Builder() 
      .setState(PlaybackStateCompat.STATE_PLAYING, 0, 1f) 
      .setActions(PlaybackStateCompat.ACTION_PLAY_PAUSE) 
      .build()); 
    AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 
    audioManager.requestAudioFocus(new AudioManager.OnAudioFocusChangeListener() { 
     @Override 
     public void onAudioFocusChange(int focusChange) { 
      // Ignore 
     } 
    }, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN); 
    mediaSession.setActive(true); 

    mediaRouter = MediaRouter.getInstance(this); 
    mediaRouter.setMediaSessionCompat(mediaSession); 
} 

Теперь я получаю ползунок так же, как Изображение выше, и оно реагирует на кнопки регулировки громкости, но я не получаю изменения в своем широковещательном приемнике.

ответ

4

Все, что вам нужно сделать, это создать MediaSessionCompat с VolumeProviderCompat.

// Here is a volume provider which sets the volume of a remote route. 
// Extend VolumeProviderCompat with your own implementation. 
public static class RemoteVolume extends VolumeProviderCompat { 
    public RemoteVolume(MediaRouter.RouteInfo routeInfo) { 
     super(VolumeProviderCompat.VOLUME_CONTROL_ABSOLUTE, STEPS, 0); 
     this.stepSize = routeInfo.getVolumeMax()/STEPS; 
     this.routeInfo = routeInfo; 
    } 

    @Override 
    public void onSetVolumeTo(int volume) { 
     routeInfo.requestSetVolume(volume * stepSize); 
     setCurrentVolume(volume); 
    } 

    @Override 
    public void onAdjustVolume(int delta) { 
     int newVolume = getCurrentVolume() + delta; 
     routeInfo.requestSetVolume(newVolume * stepSize); 
     setCurrentVolume(newVolume); 
    } 
} 

Затем подключите VolumeProviderCompat к вашему MediaSessionCompat:

MediaSessionCompat session = new MediaSessionCompat(context, TAG); 

// might need some of these flags 
session.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS | 
      MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS | 
      MediaSessionCompat.FLAG_HANDLES_QUEUE_COMMANDS); 

// the volume buttons are routed to this session when it is 
// active and currently playing 
session.setPlaybackState(new PlaybackStateCompat.Builder() 
     .setState(PlaybackStateCompat.STATE_PLAYING, 0, 1.0f) 
     .build()); 

session.setActive(true); 

// The media router tries to bind its own VolumeProvider which kinda 
// works. We need to unbind the one provided and put ours in. 
router.setMediaSessionCompat(session); 
session.setPlaybackToRemote(new RemoteVolume(myRemoteRoute)); 
+0

С помощью клавиш регулировки громкости onAdjustVolume вызывается с дельта 0 Любая идея, почему? при изменении громкости с использованием диалогового окна с отрисовкой это отлично работает – ingsaurabh

+0

Он может быть вызван для обновления текущего тома. Это происходит не один раз? – 0xcaff

+0

Кроме того, 'STEPS' должно быть отличным от нуля. – 0xcaff

 Смежные вопросы

  • Нет связанных вопросов^_^