2013-06-21 123 views
5

我研究了一下,但找不到解決此問題的任何解決方案: 我想播放MediaPlayer並在給定時間暫停/停止它。 :從第二次6到第二次17)。以編程方式暫停/停止MediaPlayer Android在給定時間

我知道我可以用seekTo()方法設置它的起點,但是我可以通過設置一個終點(當然,在達到文件結束限制之前)暫停/停止它的播放嗎?

回答

14

有不同的方法可以做到這一點,這裏有一個:

int startFrom = 6000; 
int endAt = 11000; 

MediaPlayer mp; 

Runnable stopPlayerTask = new Runnable(){ 
    @Override 
    public void run() { 
     mp.pause(); 
    }}; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_main); 

    mp = MediaPlayer.create(this, R.raw.my_sound_file); 
    mp.seekTo(startFrom); 
    mp.start(); 

    Handler handler = new Handler(); 
    handler.postDelayed(stopPlayerTask, endAt); 
} 

的媒體播放器將開始玩6秒後暫停11秒(以秒17)。

+0

謝謝,你的回答看起來正是我要找的。 – DoruAdryan

+0

爲什麼使用'mp.pause();'而不是'mp.stop();'? –

+0

@SomeoneSomewhere曾經停止過,它不能在不調用'prepare()'的情況下再次啓動。如果有機會我想再次播放,我寧願暫停。調用'stop()'更加最終。 –

1

您可以使用CountDownTimer

new CountDownTimer(30000, 1000) { 

    public void onTick(long millisUntilFinished) { 

    } 

    public void onFinish() { 
     mp.stop; 
     mp.relese(); 
    } 
    }.start(); 
3

我想你可以直接從它的任務創建Timer並調用seekTo()。然後在該Timer Task內部調用stop()/ pause()。

也許this後會對你有幫助。

或者您可以使用處理程序執行此任務,如Ken Wolf顯示您。

祝福。

+0

謝謝,這也是一個很好的回答,但我更喜歡處理程序,因爲我會處理更簡單的情況,如:用戶自己暫停/停止玩家..或者在活動停止時不得不暫停玩家。 (在調用sleep()後暫停線程有點煩人:)) – DoruAdryan

0

我知道這已經有一個答案,但這是任何人想要爲控制視頻有效地做到這一點的替代方案。

我看到了一個不同的答案,包括不斷地檢查位置。

請注意,這假設您不需要一個視頻的很多不同部分。即使在這種情況下,我建議遵循以下內容。

如果您只需要播放一部分視頻並希望它在某處結束,那麼爲什麼不使用免費視頻編輯軟件並剪輯結尾?你仍然可以使用seekTo()從任何地方啓動它,但這樣你不必浪費資源來檢查某個位置(帶有控件的視頻)。

如果您沒有視頻播放器控件,則接受的答案將起作用。但是如果你有播放器控制,那麼它不會因爲用戶可以暫停和播放視頻。

0

videoView.start()和準備播放的視頻之間存在時間差,這取決於視頻格式,這些時間差可能超過10幀。

所以最好的辦法是在OnPreparedListener裏面啓動定時器來最小化時間差,或者甚至更多地獲得當前的播放持續時間並且在該點設置postDelayed定時器。