MediaControllerとは
MediaController とは、再生・早送り・シークといった、音楽や動画の基本的な制御を行うことのできるViewです。
MediaPlayerやVideoViewと連携して使うことができます。
ExoPlayerの1.x時代のサンプルアプリの中でも使われていました。
※Android SDK上にはandroid.widget.MediaController
とandroid.session.MediaController
とで
2つあってややこしいのですが、今回触れるのは前者の方です。(後者はsupportもあるのでなおややこしい)
MediaControllerの仕様と問題点
MediaControllerの仕様は以下のようになっています。
- 早送りボタンを押すと15秒移動
- 早戻しボタンは5秒移動
- 表示されてから3秒経つと自動で強制非表示
- ボタン画像はSDK同梱の古いもので固定
- 時間表示部分のテキストの色が絶妙(端末によっては視認できない)
しかしながら、これらの値は変更できるようになっていません。
あまりに使いづらいため誰も使ってないと思いきや、
StackOverFlow で検索すると最近でも結構悲鳴が上がっている ので、
「機能としてはMediaControllerで十分だけど、数値の変更やViewの調整だけはしたい」という需要はあるんじゃないかと思いました。
ライブラリ作りました
というわけでPlayerControlViewというライブラリを作りました。
前述した問題を解消できるように、基本機能はMediaControllerのままで書き直しました。
一例ですが、見た目の変更すると以下の感じになります。
基本的な使い方
PlayerControlViewではMediaController.MediaPlayerControlをプレイヤーとして使うようにしています。
PlayerControlView playerControlView = new PlayerControlView(this);
playerControlView.attach(this);
playerControlView.setPlayer(/* mediaPlayerControl */);
MediaControllerでは以下のように書くので、なるべく移行しやすいように計らいました。
MediaController mediaController = new MediaController(this);
mediaController.setAnchorView(/* view */);
mediaController.setMediaPlayer(/* mediaPlayerControl */);
ExoPlayer1.xではMediaPlayerControlをラップしたPlayerControlというクラスがあるため、それを使うことでプレイヤーとして利用できます。
Javadocでnot require this class.
と書かれてますけど使わせてもらいました。
カスタマイズ方法についてはGitHubのREADMEやサンプルを見ていただけたらと思います。
ターゲット
- MediaPlayer
- VideoView
- ExoPlayer1.x
現状この3つのプレイヤーはサポートしています。
今からちゃんと音楽や動画をやるならExoPlayer2を使うことになると思いますが、
カジュアルにやるならまだ彼らはまだ活躍するでしょうし、
カジュアルだからこそプレイヤーの見た目は用意されたやつでいいってこともあるんじゃないでしょうか。
(LINEの動画再生部分はほぼMediaControllerですし…)
そんな中でMediaControllerじゃアカンというときには、この記事のことを思い出していただけたらと思います。
これ以上のレイアウト変更や機能の追加をしたい場合は独自で作りましょう。
ちなみにExoPlayer2ではPlaybackControlViewというMediaControllerのような見た目のViewが使えるようになりましたが、ExoPlayer2そのものに依存しているため他のプレイヤーでは使えません。
尚、PlaybackControlViewの方はViewの変更はできませんが、早送りなどの時間の変更は可能です。
おわりに
この記事の内容は2016年の6月に行われた kyobashi.dexでLTしたものですが、ライブラリの公開まではしてない状態でした。
あれから色々ありましたが2016年中に公開できてよかったです。(小並感)
現場からは以上です。