動かざることバグの如し

近づきたいよ 君の理想に

結論から言うとMediaControllerはクソ

俺の2日間を返せ

動画や音楽の再生の制御をたったの数行で実装してくれる、とても便利なハズのMediaController。
だがこいつは欠陥品だ。とても使えるシロモノではない。

常に表示が出来ない

確かにフルスクリーンで生成したい場合にはコントローラは邪魔だが、必ずしもフルスクリーンで再生したいとは限らない。
ましてや今回のように音楽再生に用いたい場合だってあるだろ。なのに数秒経つと勝手に消える。show()メソッドで表示させる際、show(0);のように0を引数にしたら常に表示されるはずなんだけど・・・
結果的に常に表示させる場合はMediaControllerクラスのhide()メソッドを無効化させるしかない。

mc = new MediaController(this){
	@Override
	public void hide() {}
};

だがこうやると逆に絶対に非表示させることができなくなる。それが次のやつで仇になる。

コントローラ表示中は他の全てのtouchイベントが無効になる

そのまんま。再生状況にかかわらず、表示されているだけで同一アクティビティ、例えばボタンやテキストボックス、また物理ボタン等のイベントも効かなくなる。つまり何もできなくなるのである。じゃあどうすればいいのか。通常はhide()で一度非表示にさせてから戻る・・・とやるんだろうが、さっきhide()メソッドを無効化したのでそれが使えない。

他にもボタンカスタマイズ一切できないし、表示位置も不自由極まりない。

結論:MediaControllerはクソ

失敗コードでも載せておくか。
前述のhide()メソッド無効化に加えて、前ボタンと次ボタンを有効化させた。

public class MainActivity extends Activity implements MediaPlayerControl{
	
	private MediaPlayer mp;
	private MediaController mc;
	private Handler handler;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		mp = new MediaPlayer();
		try{
			mp.setDataSource("/storage/sdcard1/test.mp3");
			mp.prepare();
		}catch(Exception e){ }
		mc = new MediaController(this){
			@Override
			public void hide() {}
		};
		mc.setMediaPlayer(this);
		mc.setAnchorView(findViewById(R.id.dummy));
		mc.setPrevNextListeners(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				//Handle next click here
			}
		}, new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				mp.seekTo(0);
				mc.show(0);
			}
		});
		handler = new Handler();
		mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener(){
			@Override
			public void onPrepared(final MediaPlayer mp){
			handler.post(new Runnable(){
				@Override
				public void run(){ mc.show(); }
			});
			}
		});
		mp.start();
	}
	@Override
	public void start() {
		mp.start();
	}
	@Override
	public void pause() {
		mp.pause();
	}
	@Override
	public int getDuration() {
		return mp.getDuration();
	}
	@Override
	public int getCurrentPosition() {
		return mp.getCurrentPosition();
	}
	@Override
	public void seekTo(int pos) {
		mp.seekTo(pos);
	}
	@Override
	public boolean isPlaying() {
		return mp.isPlaying();
	}
	@Override
	public int getBufferPercentage() {
		return 0;
	}
	@Override
	public boolean canPause() {
		return true;
	}
	@Override
	public boolean canSeekBackward() {
		return true;
	}
	@Override
	public boolean canSeekForward() {
		return true;
	}
	@Override
	public int getAudioSessionId() {
		return 0;
	}
}