android.widget.MediaController と、MediaPlayer を使って音楽を再生する時、
MediaPlayer の prepare() 実行
→ MediaPlayer.OnPreparedListener の onPrepared で再生を開始(=手動でなく自動)
を行った場合、以下のコードのようにしてしまうと。。。
MediaPlayer mediaPlayer = new MediaPlayer();
MediaController controller = new MediaController(this);
:
省略
:
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener(){
@Override
public void onPrepared(final MediaPlayer mp){
new Handler().post(new Runnable(){
@Override
public void run(){
controller.setEnabled(true);
controller.show(0);
mp.start();
}
});
}
});
次の画面のように。。。
Play ボタンが演奏していない状態のまま表示されてしまう。
演奏中は、PAUSEマークのボタンが表示されるのが、UIとして正しい。
これを、MediaPlayer の start() を実行して、Playのマークにしたいと思っても
MediaController では、演奏開始のメソッドは提供されてこない。
MediaController を調べると、ボタンの切り替えのメソッドが、private で存在する。
private void updatePausePlay()
というのがあって、この中で、MediaPlayer の isPlaying() の状態を見て
com.android.internal.R.drawable.ic_media_play ・・・Play マークの画像
com.android.internal.R.drawable.ic_media_pause ・・・PAUSEマークの画像
を切り替えてるだけだ。
上のコード、、setOnPreparedListener で、、、
良くないとされる以下の方法にすれば、自動で演奏開始、PAUSEマークのボタンが
表示される。
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener(){
@Override
public void onPrepared(final MediaPlayer mp){
new Handler().post(new Runnable(){
@Override
public void run(){
controller.setEnabled(true);
controller.show(0);
mp.start();
try{
Method m = android.widget.MediaController.class.getDeclaredMethod("updatePausePlay");
m.setAccessible(true);
m.invoke(controller);
}catch(Exception e){
}
}
});
}
});
画面が以下のようになる。