2011-07-27 143 views
5

我寫了一個小型音樂播放控制測試應用程序。我有一個戲劇,暫停,停止和倒帶按鈕。我的問題是, player.stop(); 的行爲與 player.pause()相同; 我在player.stop()之後調用player.prepare(),以便我可以讓播放器實例準備好start()操作。MediaPlayer實例:停止行爲像暫停

我在執行stop()之後調用prepare()時未看到任何錯誤[IOexceptions或IllegalStateExceptions]。另外,我不會在stop()之後調用任何seekTo(0)。所以,我並沒有把這個位置放回到歌曲的開頭。

我正在使用運行2.3.4的Nexus Google One手機。

任何想法,如果我正在做一些愚蠢的事情,或者我正在觀察的實際上是如何建立狀態機。

TIA。

+0

自你問了三年以來,我的疑問也一樣。 。 。我只是想檢查他們更新api的天氣,以便在停止後開始啓動? – user3726986

+0

@ user3726986請在具有「已接受」答案的線索中查看我的評論。那是在2011年。它應該仍然有效。 –

回答

2

不是狀態圖http://developer.android.com/reference/android/media/MediaPlayer.html 表示停止意味着「停留在停止狀態」?

調用stop()將停止播放並使MediaPlayer處於已啓動,暫停,準備或播放完成狀態以進入停止狀態。

一旦進入停止狀態,直到調用prepare()或prepareAsync()以再次將MediaPlayer對象設置爲Prepared狀態時才能開始播放。 調用stop()對已處於停止狀態的MediaPlayer對象沒有影響。

有沒有確認stop()應該改變CurrentPosition

有沒有確認撥打prepare()應該改變CurrentPosition

因此,要開始音樂,你應該mannualy設置其位置。

但我同意你的看法。由於pause()方法聲明它將從當前位置繼續播放,因此我希望它在調用stop()時回到起點。

而且它有一定的影響,當你需要調用prepare()

例如,呼叫準備()可能需要很長的時間來執行,因爲它可能涉及到取和解碼媒體數據。

所以stop()需要調用prepare(),可以使需要較長的時間,而pause()具有影響較小:您可以後立即致電start()

+0

問題是,當你從停止狀態轉到預備狀態,然後調用start()時,我們是否希望歌曲從開始或從播放器停止的位置開始。我覺得它應該從一開始就開始,但我正在觀察它是從停止點開始的。所以,這讓我覺得stop()和pause()之間沒有區別。糾正我,如果我錯了。 –

+0

這是我期望它的行爲,但是......看看「停止」不會讓它進入另一個位置(沒有什麼會說它會去的)。即使在停止狀態下,getCurrentPosition()也可以工作。 – woliveirajr

+0

hhmm ...我期望getCurrentPosition()在停止狀態返回0.所以,pause()之間的區別是什麼?並停止()?爲什麼有兩個國家基本上功能相同的方式。同意暫停()後你不需要調用prepare()。但從用戶的角度來看,這兩種狀態沒有區別。謝謝woliveirajr。 –

3

我認爲這可能是一個錯誤,因爲對於MediaPlayer的啓動方法的API文檔建議您所期望的行爲:

公共無效的start()

開始或繼續播放。如果播放先前已暫停,則 將從暫停播放的位置繼續播放。如果播放已停止,或從未開始播放,播放將從 開始。

目前,一旦玩家準備好顯式調用seekTo(0)似乎是一個合理的解決方法。