2010-12-16 46 views
17

我在我的應用程序中使用了mediacontroller,但它只顯示了3秒鐘。我搜索了很多,但在每個文檔中,我只看到了顯示功能,設置超時,但它沒有效果。我怎樣才能始終顯示媒體控制器?MediaController始終顯示在Android上

我測試過show(0),但它沒有效果。

回答

23

你可以它的一個實例擴展的MediaController類和編程設置爲VideoView類:

import android.content.Context; 
import android.util.AttributeSet; 
import android.widget.MediaController; 

public class MyMediaController extends MediaController { 
    public MyMediaController(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public MyMediaController(Context context, boolean useFastForward) { 
     super(context, useFastForward); 
    } 

    public MyMediaController(Context context) { 
     super(context); 
    } 

    @Override 
    public void show(int timeout) { 
     super.show(0); 
    } 

} 

這裏的用法:

VideoView myVideoView = (VideoView) findViewById(R.id.my_video_view); 
MediaController mc = new MyMediaController(myVideoView.getContext()); 
mc.setMediaPlayer(myVideoView); 
myVideoView.setMediaController(mc); 
5

你需要做的是,overrride的在自定義控制器中隱藏方法並且什麼都不做。

public class MyMediaController extends MediaController { 
.. 
@Override 
    public void hide() { 
     // Do Nothing to keep the show the controller all times 

    } 
... 
} 

PS:您仍然需要點擊視頻以顯示媒體控制器。

+0

如何在不選擇任何視頻的情況下顯示媒體控制器 - 當然,只有在選擇了視頻後才能正常工作,但要佔用該空間。 – Jasper 2015-01-07 05:45:26

7

您還可以創建一個匿名類內聯和重寫隱藏方法有,而不必創建一個全新的類是:

mediaController = new MediaController(this) { 
    @Override 
    public void hide() { 
    //Do not hide. 
    } 
}; 
+4

爲什麼downvote?解釋下調時的常見禮節 – Gerard 2014-08-20 19:24:25

11

您可以創建匿名類內聯和重寫某些方法。你需要重寫隱藏方法,並在那裏不做任何事情。您還需要重寫dispatchKeyEvent方法來檢查後退按鍵並調用super.hide()。否則在後面按控制器不會隱藏,並且活動不能關閉。

mediaController = new MediaController(this){ 
     @Override 
     public void hide() { 
      // TODO Auto-generated method stub 
      //do nothing 
     } 

     @Override 
     public boolean dispatchKeyEvent(KeyEvent event) { 

      if(event.getKeyCode() == KeyEvent.KEYCODE_BACK) { 

       if (mediaPlayer != null) { 
        mediaPlayer.reset(); 
        mediaPlayer.release(); 
        mediaPlayer = null; 
       } 
       super.hide(); 
       Activity a = (Activity)getContext(); 
       a.finish(); 

      } 
     return true; 
     } 
    }; 
+1

當我覆蓋這些功能時,我的音量控制(在屏幕和設備按鈕上)根本無法使用。 – blackcompe 2014-08-12 13:06:49

+1

最後一篇文章中的代碼(http://stackoverflow.com/questions/23338989/android-overriding-back-button-causes-volume-buttons-stop-working)完美地工作。 – blackcompe 2014-08-12 13:12:02

+0

只有'event.getKeyCode()== KeyEvent.KEYCODE_BACK'返回true。否則'返回false',然後其他設備按鈕將繼續工作 – 2017-03-07 14:09:12

4

在嘗試了所有我能做到的事情之後,下面的代碼適用於我!

mVideoView = (VideoView) findViewById(R.id.video); 

    mMediaController = new MediaController(this) { 
     //for not hiding 
     @Override 
     public void hide() {} 

     //for 'back' key action 
     @Override 
     public boolean dispatchKeyEvent(KeyEvent event) { 
      if(event.getKeyCode() == KeyEvent.KEYCODE_BACK) { 
       Activity a = (Activity)getContext(); 
       a.finish(); 
      } 
      return true; 
     } 
    }; 

    mMediaController.setAnchorView(mVideoView); 
    mMediaController.setMediaPlayer(mVideoView); 
    mVideoView.setMediaController(mMediaController); 
    mMediaController.requestFocus(); 

    //only this showed the controller for me!! 
    mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
     @Override 
     public void onPrepared(MediaPlayer mp) { 
      mVideoView.start(); 
      mMediaController.show(900000000); 
     } 
    }); 

    //finish after playing 
    mVideoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
     @Override 
     public void onCompletion(MediaPlayer mediaPlayer) { 
      finish(); 
     } 
    }); 
+0

使用這個,這爲我工作: mediaController.show(0); – ralphgabb 2015-02-24 01:37:33

0

這可能是一個古老的線程,但仍然沒有答案,試試這個:

final MediaController mediaController = new MediaController(this); 
mediaController.setAlwaysDrawnWithCacheEnabled(true); 
mediaController.setAnchorView(vView); 
mediaController.requestFocus(); 
    vView.setOnPreparedListener(new OnPreparedListener() { 
     @Override 
     public void onPrepared(MediaPlayer mp) { 
      mediaController.show(0); 
     } 
    }); 

vView.setVideoPath(Preview_Path); 
vView.setMediaController(mediaController); 
vView.start(); 

那裏有對的MediaController類的註釋中 「秀」 的方法

**Use 0 to show 
* the controller until hide() is called** 

所以用90萬或較大的值不會幫助。 希望它可以幫助你。

歡呼聲。

0

試試這個:

videoView.setOnCompletionListener(onVideoCompleted); 
videoView.setOnPreparedListener(onVideoPrepared); 

mc.setAnchorView(videoView); 
mc.setMediaPlayer(videoView); 

MediaController mc = new MediaController(this); 
videoView.setMediaController(mc); 

MediaPlayer.OnPreparedListener onVideoPrepared = new MediaPlayer.OnPreparedListener() { 
    @Override 
    public void onPrepared(MediaPlayer mp) { 
     mc.show(0); 
    } 
}; 

MediaPlayer.OnCompletionListener onVideoCompleted = new MediaPlayer.OnCompletionListener() { 
    @Override 
    public void onCompletion(MediaPlayer mp) { 
     mc.hide(); 
    } 
}; 
0

我想褪色的視頻控制器,並始終顯示它的音頻。這工作

mController = new MediaController(this) { 
     @Override 
     public void hide() { 

      if (mType != TYPE_AUDIO) super.hide(); 
     } 

     @Override 
     public boolean dispatchKeyEvent(KeyEvent event) { 
      if(event.getKeyCode() == KeyEvent.KEYCODE_BACK) { 
       mController.hide(); 
       Activity a = (Activity)getContext(); 
       a.finish(); 
       return true; 
      } 
      return false; 
     } 
    }; 

在MediaPlayer中。onPrepared我說:

if (mType == TYPE_AUDIO) mController.show(0); 

這使得控制器在音頻播放的開始展現,而不是視頻的播放。

其他手機控制按鈕繼續正常工作。

0

簡單!在事件隱藏中設置可見性「GONE」,並在顯示中設置可見性「可見」!

 MediaController mc= new MediaController(zoom.this){ 

      @Override 
      public void setMediaPlayer(MediaPlayerControl player) { 
       super.setMediaPlayer(player); 
       this.show(4000); 
      } 
      @Override 
      public void show(int timeout) { 
       super.show(timeout); 
       this.setVisibility(View.VISIBLE); 
      } 
      //instead of press twice with press once "back" button to back 
      @Override 
      public boolean dispatchKeyEvent(KeyEvent event) { 
       if(event.getKeyCode() == KeyEvent.KEYCODE_BACK) { 
        Activity a = (Activity)getContext(); 
        a.finish(); 
       } 
       return true; 
      } 
      @Override 
      public void hide() { 
       // TODO Auto-generated method stub 
       super.hide(); 
       this.setVisibility(View.GONE); 
       //super.show(3000); 
      } 

     };