SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Yahoo! JAPAN 黒帯シリーズ

Android Autoのはじめ方

Yahoo! JAPAN 黒帯シリーズ 第3回 ~ 「Android技術黒帯」による車載用Androidプラットフォームの解説

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ミュージックから、作成したアプリを選択しましょう。このように表示され、選択していくと、音楽が再生されます。

メニューをたどっている画面
メニューをたどっている画面

次のページ
通知アプリの実装

この記事は参考になりましたか?

Yahoo! JAPAN 黒帯シリーズ連載記事一覧

もっと読む

この記事の著者

森 洋之(ヤフー株式会社)(モリ ヒロユキ)

ヤフー株式会社 ヤフオク!カンパニー開発本部 サービス開発部 黒帯 Android 技術1982年広島県生まれ。Androidアプリの個人開発などを経て、2012年ヤフー株式会社入社。「ヤフオク!」などのAndroidアプリ開発に携わる。2014年10月にAndroid技術の分野で黒帯に認定される。...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/8711 2015/06/19 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー