MediaSession.Callbackの作成
MediaSession.Callbackは、再生ボタンなどのボタンが押された時や、MediaItem.FLAG_PLAYABLEのフラグが付いたMediaItemが選択された時などのコールバックを受け取り、処理するクラスです。
/**
* ユーザーが特定の楽曲を指定した場合に呼ばれます。
*/
public void onPlayFromMediaId(String mediaId, Bundle extras) {
int index = -1;
final List<MediaSession.QueueItem> queue = mSession.getController().getQueue();
final int size = queue.size();
MediaSession.QueueItem queueItem = null;
for(int i = 0; i < size; i++) {
MediaSession.QueueItem item = queue.get(i);
if (mediaId.equals(item.getDescription().getMediaId())) {
index = i;
queueItem = item;
break;
}
}
if (queueItem != null) {
play(queueItem);
mPlayQueueIndex = index;
}
}
/**
* 楽曲を再生する場合に呼ばれます
* 一時停止からの復帰時にも呼ばれます。
*/
public void onPlay() {
PlaybackState state = mSession.getController().getPlaybackState();
if (state.getState() == PlaybackState.STATE_PAUSED) {
resume();
} else {
playFromQueue();
}
}
/**
* 楽曲が一時停止された場合に呼ばれます
*/
public void onPause() {
long position = 0L;
if (mMediaPlayer != null) {
mMediaPlayer.pause();
position = mMediaPlayer.getCurrentPosition();
}
setPlaybackState(PlaybackState.STATE_PAUSED, position, 0f);
}
/**
* 楽曲が停止された場合に呼ばれます
*/
public void onStop() {
if (mMediaPlayer != null) mMediaPlayer.reset();
setPlaybackState(PlaybackState.STATE_STOPPED, 0L, 0f);
}
/**
* 次の曲に進むボタンが押された場合に呼ばれます
*/
@Override
public void onSkipToNext() {
mPlayQueueIndex++;
if (mPlayQueueIndex >= getQueueSize()) {
mPlayQueueIndex = 0;
}
playFromQueue();
}
/**
* 前の曲に戻るボタンが押された場合に呼ばれます
*/
@Override
public void onSkipToPrevious() {
mPlayQueueIndex--;
if (mPlayQueueIndex < 0) {
mPlayQueueIndex = 0;
}
playFromQueue();
}
/**
* 楽曲を演奏し終えた際に呼ばれます。
* @param mp MediaPlayer
*/
@Override
public void onCompletion(MediaPlayer mp) {
// 今の楽曲の再生が終わりました。
if (mPlayQueueIndex < getQueueSize() -1) {
// キューが残っている場合は、次の楽曲を再生します
mPlayQueueIndex++;
playFromQueue();
} else {
// キューが残っていない場合は、停止します
mPlayQueueIndex = 0;
setPlaybackState(PlaybackState.STATE_STOPPED, 0L, 0f);
}
}
/**
* 楽曲を再生する準備が整った時に呼ばれます。
* @param mp MediaPlayer
*/
@Override
public void onPrepared(MediaPlayer mp) {
// 再生の準備が整ったので、実際に再生します。
mp.start();
setPlaybackState(PlaybackState.STATE_PLAYING, 0L, 1.0f);
}
動作を確認する
では、実際に動かしてみましょう。テストするためには、Android Auto用のシミュレータを端末にインストールする必要があります。シミュレータは、SDK Managerを通じて配布されています。
SDK Managerからダウンロードしたあとは、sdk/extras/google/simulators/に音楽再生アプリ用のシミュレータ(media-browser-simulator.apk)と、 メッセージ系アプリ用のシミュレータ(messaging-simulator.apk)が置かれますので、インストールしましょう。
adb install path/to/sdk/extras/google/simulators/media-browser-simulator.apk
シミュレータアプリを起動すると、このように表示されます。
ナビゲーションドロワーを開いて、Google Playミュージックから、作成したアプリを選択しましょう。このように表示され、選択していくと、音楽が再生されます。
