2016-10-10 64 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); 
    } 
} 

然後,連接VolumeProviderCompatMediaSessionCompat

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被稱爲與delta 0任何想法,爲什麼音量鍵?當使用投影對話框更改音量時,此功能正常工作 – ingsaurabh

+0

可能會調用它來更新當前音量。它是否發生過一次以上? – 0xcaff

+0

另外,「STEPS」應該不爲零。 – 0xcaff