MediaController の Play と PAUSEボタン切り替え

android.widget.MediaController と、MediaPlayer を使って音楽を再生する時、
MediaPlayerprepare() 実行
MediaPlayer.OnPreparedListeneronPrepared で再生を開始(=手動でなく自動)
を行った場合、以下のコードのようにしてしまうと。。。

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 ボタンが演奏していない状態のまま表示されてしまう。

f:id:posturan:20160313195050p:plain



演奏中は、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){
            }

         }
      });
   }
});

画面が以下のようになる。

f:id:posturan:20160313195040p:plain