freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內容

mp3播放器項目實踐-資料下載頁

2025-07-28 08:55本頁面
  

【正文】 rvice,而不是原有的Activity中執(zhí)行(提高其優(yōu)先級)。實現(xiàn)歌詞同步播放的功能。功能分解:在PlayerActivtity中通過intent傳遞選中的按鈕,啟動一個 PlayerService,實現(xiàn)在Service中執(zhí)行播放、暫停和停止編寫對LRC文件進行處理的類LrcProcesser,將時間和歌詞分別讀取到 一條單獨的隊列(Queue)中,再將兩條隊列放入一個List中在DownloadServive的run()函數(shù)中實現(xiàn)對LRC文件的下載,同時在 WriteSdcard 中對Mp3Info中的getLocalMp3Info()方法中對 lrcName和lrcSize 進行相應設置。下載:(lrcUrlStr,Mp3/, ())。設置lrcName和lrcSize: public ListMp3Info getLocalMp3Info(String dirName){ ListMp3Info localMp3Infos=new ArrayListMp3Info()。 File file=new File(SDPATH++dirName)。 File[] files=()。 for (int i = 0。 i 。 i=i+2) { Mp3Info localmp3Info=new Mp3Info()。 (files[i].getName())。 (files[i].length()+)。 (files[i+1].getName())。 (files[i+1].length()+)。 (localmp3Info)。 } return localMp3Infos。 }在PlayerActivity中,通過Handler控制一個run函數(shù)反復執(zhí)行來不 斷比較已經(jīng)播放的時間與通過LrcProcesser處理后的時間隊列中的時 間,在合適的時間取出時間隊列和歌詞隊列中對應的隊列元素,將歌詞隊列 顯示在lrcText(一個TextView)中,從而實現(xiàn)歌詞的同步更新。功能實現(xiàn):新建PlayerService類,繼承Service,通過intent接收PlayerActivity中按下不同按鈕的Msg,分別調用play(),pause(),stop()方法。代碼如下:import .*。import .*。import 。import 。import 。import 。import 。import 。import 。import .*。import 。public class PlayerService extends Service{ private Button play,pause,stop。 private Mp3Info localmp3Info。 private int msg。 private boolean isPlay=false。 private boolean isPause=false。 private boolean isStop=false。 private MediaPlayer mediaPlayer。 @Override public IBinder onBind(Intent arg0) { // TODO Autogenerated method stub return null。 } @Override public int onStartCommand(Intent intent, int flags, int startId) { localmp3Info=(Mp3Info) (localmp3Info)。 msg=(Msg, 0)。 if(msg==){ play()。 } else if(msg==){ pause()。 } else if(msg==){ stop()。 } //prepareToPlay(localmp3Info)。 return (intent, flags, startId)。 } private void play(){ if(!isPlay){ mediaPlayer=(this, (getUri(localmp3Info)))。 (false)。 ()。 isPlay=true。 isPause=false。 isStop=false。 } } private void pause(){ if(mediaPlayer!=null){ if(isPlay){ if(!isPause){ ()。 isPause=true。 }else{ ()。 isPause=false。 } } } } private void stop(){ if(mediaPlayer!=null){ if(isPlay){ ()。 isStop=true。 isPlay=false。 } } } public String getUri(Mp3Info mp3Info){ String sdPath=().getAbsolutePath()。 String Uri=sdPath++Mp3/++()。 return Uri。 }}注意點:為傳遞按下不同按鈕時的不同Msg,應將Msg賦值為一個定義的常量,而不是一個具體的數(shù)據(jù),這樣以便以后修改和程序的擴展。為此,新建一個接口AppConstant,在接口中創(chuàng)建的PlayMsg類中定義三個Msg,表示按下不同按鈕時需要傳遞的不同值 ,以及在三個按鈕事件監(jiān)聽器中對intent設置不同的putExtra值,并啟動PlayerService實現(xiàn)歌詞同步功能的邏輯分析:目的:實現(xiàn)歌詞同步歌詞同步實現(xiàn)的過程:LRC文件中的每句(行)歌詞在其[]中的對應時間點開始進行顯示,在下一個[]中的對應時間結束顯示。([]中的時間指Mp3總共的播放時間。)從而,歌詞同步的實現(xiàn)需要用程序設計來得到以下三個元素: ① 統(tǒng)計Mp3總共播放了多長時間(為方便比較,以Long型來計算時間)② 由LRC文件中的內容得到每個[]中的時間(將其都轉換為Long型)③ 由LRC文件中的內容得到每個[]中的時間對應的每句(行)歌詞(String 類型)歌詞同步顯示的實現(xiàn): 創(chuàng)建LrcProcesser類。該類中實現(xiàn)以下功能(LRC文件處理的邏輯分析):① 根據(jù)讀取LRC文件得到的字節(jié)流input對LRC文件進行一行一行的讀 ?。˙ufferedReader);② 在讀取到的每一行中,以正則表達式判斷是否具有[]符號,以判斷該行 中是否具有對應時間和歌詞;(注意:如果LRC文件中有[]中不是時間的 行,需要將LRC文件進行處理:刪除該行,或者將[]中的文字改為時間)③ 如果在讀取到的LRC文件的一行中具有[]符號,則需要在讀取改行以后 做以下兩個工作:(1) 將檢測到[]之前讀取到的[]中的時間和與該時間對應的歌詞內容經(jīng)過處理(調用處理時間的方法timeToLong(),用substring()方法得到歌詞)存放到時間隊列和歌詞隊列中(注意第一次檢測到[]時存放了一個空時間節(jié)點和空歌詞節(jié)點,這就需要在PlayerActivity中調用LrcProcesser取的List并得到時間隊列和歌詞隊列后立即取出一個時間節(jié)點和一個歌詞節(jié)點扔掉(poll()方法))(2) 通過java中Pattern類的match()方法和Matcher類的group()方法取得[]中內容,以及該行中除了[]以外的內容(即歌詞),并將歌詞內容存放到一個清空的message中。④ 如果某行中不存在[],則將該行的內容追加到上一次的message中。注意:由于歌詞同步的時候是按從開始時間到結束時間的順序來取,而在讀取LRC文件進行每一行時間和歌詞的存放的時候也是按照從開始時間到結束時間的順序來存放的,而隊列具有先進先出的特點,也就是先存先取的特點,因此選區(qū)隊列進行存放每行的時間和歌詞內容。LrcProcesser類的代碼如下:import .*。import .*。import .*。public class LrcProcesser { public ArrayListQueue process(InputStream input){ QueueLong timeMills=new LinkedListLong()。 QueueString messages=new LinkedListString()。 ArrayListQueue queues=new ArrayListQueue()。 BufferedReader br = null。 try { br = new BufferedReader(new InputStreamReader(input,gb2312))。 } catch (UnsupportedEncodingException e1) { // TODO Autogenerated catch block ()。 } String line。 Long timeMill=null。 String queueMsg=null。 Pattern p=(\\[([^\\]]+)\\])。 try { while((line=())!=null){ Matcher m=(line)。 if(()){ (timeMill)。 (queueMsg)。 String timeStr=()。 timeMill=timeToLong((1, 9))。 queueMsg=+(10)+\n。 }else{ queueMsg=queueMsg+line+\n。 } } (timeMills)。 (messages)。 ()。 } catch (IOException e) { // TODO Autogenerated catch block ()。 } return queues。 } public Long timeToLong(String timeStr){ Long timeMill = null。 String s[]=(:)。 int minute=(s[0])。 String ss[]=s[1].split(\\.)。 int secends=(ss[0])。 int mill=(ss[1])。 timeMill=minute*60*1000+secends*1000+mill*10L。 return timeMill。 }} 在PlayerActivity類中實現(xiàn)歌詞同步顯示功能的邏輯分析: 歌詞的同步實現(xiàn)是根據(jù)LrcProcesser處理后得到的實際隊列中的每個時間節(jié)點中的時間與Mp3總共播放的時間進行比較后決定是否應該在TextView中顯示歌詞隊列中與該時間節(jié)點對應的歌詞節(jié)點中的歌詞內容。因此需要完成以下功能:① 讀取選中Mp3文件的LRC文件的字節(jié)流,并用LrcProcesser進行處理得到時間隊列timeMills和歌詞隊列messages。將此過程放在prepareToPlay()方法中實現(xiàn)② 統(tǒng)計Mp3總共播放的時間offSet:當前系統(tǒng)時間減去開始播放Mp3時的系統(tǒng)時間startTimes③ 不斷的比較從時間隊列中取出的時間timeMill與offSet的大小,以確定是否應該在TextView中進行顯示歌詞以及是否應該從時間隊列中取出下次要比較和顯示的timeMill。④ 總體分析:要實現(xiàn)程序自動循環(huán)不斷的執(zhí)行某個過程,就需要Handler的postDelayed()方法與Runnable的run()方法聯(lián)合使用。因此將以上過程放在實現(xiàn)了Runnable接口的內部類UpdateLrc的run()函數(shù)中,并在run()函數(shù)中調用Handler的postDelayed()方法,以實現(xiàn)每隔一定的時間(10毫秒)執(zhí)行一次run()函數(shù)中的過程。⑤ 在prepareToPlay()方法中創(chuàng)建一個UpdateLrc對象,以便在三個按鈕的事件監(jiān)聽器中調用prepareToPlay()方法的自動時候創(chuàng)建一個UpdateLrc對象。同時清空timeMill和message的值,以便再次調用prepareToPlay()方法的時候使用timeMill和message⑥ 三個按鈕的事件監(jiān)聽器中歌詞同步的實現(xiàn): (1) play按鈕: a、按下play()按鈕的同時,開始計時,將此刻的系統(tǒng)時間設為Mp3 開始播放的時間startTimes。b、調用prepareToPlay()方法,產(chǎn)生UpdateLrc對象update,同 時(或者隔5毫秒)開始執(zhí)行update對象的run()方法(利用 Handler的postDelayed()方法)。C、將
點擊復制文檔內容
規(guī)章制度相關推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1