俺の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; } }