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

正文內(nèi)容

mp3播放器項(xiàng)目實(shí)踐-資料下載頁(yè)

2025-07-28 08:55本頁(yè)面
  

【正文】 rvice,而不是原有的Activity中執(zhí)行(提高其優(yōu)先級(jí))。實(shí)現(xiàn)歌詞同步播放的功能。功能分解:在PlayerActivtity中通過(guò)intent傳遞選中的按鈕,啟動(dòng)一個(gè) PlayerService,實(shí)現(xiàn)在Service中執(zhí)行播放、暫停和停止編寫對(duì)LRC文件進(jìn)行處理的類LrcProcesser,將時(shí)間和歌詞分別讀取到 一條單獨(dú)的隊(duì)列(Queue)中,再將兩條隊(duì)列放入一個(gè)List中在DownloadServive的run()函數(shù)中實(shí)現(xiàn)對(duì)LRC文件的下載,同時(shí)在 WriteSdcard 中對(duì)Mp3Info中的getLocalMp3Info()方法中對(duì) lrcName和lrcSize 進(jìn)行相應(yīng)設(shè)置。下載:(lrcUrlStr,Mp3/, ())。設(shè)置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中,通過(guò)Handler控制一個(gè)run函數(shù)反復(fù)執(zhí)行來(lái)不 斷比較已經(jīng)播放的時(shí)間與通過(guò)LrcProcesser處理后的時(shí)間隊(duì)列中的時(shí) 間,在合適的時(shí)間取出時(shí)間隊(duì)列和歌詞隊(duì)列中對(duì)應(yīng)的隊(duì)列元素,將歌詞隊(duì)列 顯示在lrcText(一個(gè)TextView)中,從而實(shí)現(xiàn)歌詞的同步更新。功能實(shí)現(xiàn):新建PlayerService類,繼承Service,通過(guò)intent接收PlayerActivity中按下不同按鈕的Msg,分別調(diào)用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。 }}注意點(diǎn):為傳遞按下不同按鈕時(shí)的不同Msg,應(yīng)將Msg賦值為一個(gè)定義的常量,而不是一個(gè)具體的數(shù)據(jù),這樣以便以后修改和程序的擴(kuò)展。為此,新建一個(gè)接口AppConstant,在接口中創(chuàng)建的PlayMsg類中定義三個(gè)Msg,表示按下不同按鈕時(shí)需要傳遞的不同值 ,以及在三個(gè)按鈕事件監(jiān)聽(tīng)器中對(duì)intent設(shè)置不同的putExtra值,并啟動(dòng)PlayerService實(shí)現(xiàn)歌詞同步功能的邏輯分析:目的:實(shí)現(xiàn)歌詞同步歌詞同步實(shí)現(xiàn)的過(guò)程:LRC文件中的每句(行)歌詞在其[]中的對(duì)應(yīng)時(shí)間點(diǎn)開始進(jìn)行顯示,在下一個(gè)[]中的對(duì)應(yīng)時(shí)間結(jié)束顯示。([]中的時(shí)間指Mp3總共的播放時(shí)間。)從而,歌詞同步的實(shí)現(xiàn)需要用程序設(shè)計(jì)來(lái)得到以下三個(gè)元素: ① 統(tǒng)計(jì)Mp3總共播放了多長(zhǎng)時(shí)間(為方便比較,以Long型來(lái)計(jì)算時(shí)間)② 由LRC文件中的內(nèi)容得到每個(gè)[]中的時(shí)間(將其都轉(zhuǎn)換為L(zhǎng)ong型)③ 由LRC文件中的內(nèi)容得到每個(gè)[]中的時(shí)間對(duì)應(yīng)的每句(行)歌詞(String 類型)歌詞同步顯示的實(shí)現(xiàn): 創(chuàng)建LrcProcesser類。該類中實(shí)現(xiàn)以下功能(LRC文件處理的邏輯分析):① 根據(jù)讀取LRC文件得到的字節(jié)流input對(duì)LRC文件進(jìn)行一行一行的讀 ?。˙ufferedReader);② 在讀取到的每一行中,以正則表達(dá)式判斷是否具有[]符號(hào),以判斷該行 中是否具有對(duì)應(yīng)時(shí)間和歌詞;(注意:如果LRC文件中有[]中不是時(shí)間的 行,需要將LRC文件進(jìn)行處理:刪除該行,或者將[]中的文字改為時(shí)間)③ 如果在讀取到的LRC文件的一行中具有[]符號(hào),則需要在讀取改行以后 做以下兩個(gè)工作:(1) 將檢測(cè)到[]之前讀取到的[]中的時(shí)間和與該時(shí)間對(duì)應(yīng)的歌詞內(nèi)容經(jīng)過(guò)處理(調(diào)用處理時(shí)間的方法timeToLong(),用substring()方法得到歌詞)存放到時(shí)間隊(duì)列和歌詞隊(duì)列中(注意第一次檢測(cè)到[]時(shí)存放了一個(gè)空時(shí)間節(jié)點(diǎn)和空歌詞節(jié)點(diǎn),這就需要在PlayerActivity中調(diào)用LrcProcesser取的List并得到時(shí)間隊(duì)列和歌詞隊(duì)列后立即取出一個(gè)時(shí)間節(jié)點(diǎn)和一個(gè)歌詞節(jié)點(diǎn)扔掉(poll()方法))(2) 通過(guò)java中Pattern類的match()方法和Matcher類的group()方法取得[]中內(nèi)容,以及該行中除了[]以外的內(nèi)容(即歌詞),并將歌詞內(nèi)容存放到一個(gè)清空的message中。④ 如果某行中不存在[],則將該行的內(nèi)容追加到上一次的message中。注意:由于歌詞同步的時(shí)候是按從開始時(shí)間到結(jié)束時(shí)間的順序來(lái)取,而在讀取LRC文件進(jìn)行每一行時(shí)間和歌詞的存放的時(shí)候也是按照從開始時(shí)間到結(jié)束時(shí)間的順序來(lái)存放的,而隊(duì)列具有先進(jìn)先出的特點(diǎn),也就是先存先取的特點(diǎn),因此選區(qū)隊(duì)列進(jìn)行存放每行的時(shí)間和歌詞內(nèi)容。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類中實(shí)現(xiàn)歌詞同步顯示功能的邏輯分析: 歌詞的同步實(shí)現(xiàn)是根據(jù)LrcProcesser處理后得到的實(shí)際隊(duì)列中的每個(gè)時(shí)間節(jié)點(diǎn)中的時(shí)間與Mp3總共播放的時(shí)間進(jìn)行比較后決定是否應(yīng)該在TextView中顯示歌詞隊(duì)列中與該時(shí)間節(jié)點(diǎn)對(duì)應(yīng)的歌詞節(jié)點(diǎn)中的歌詞內(nèi)容。因此需要完成以下功能:① 讀取選中Mp3文件的LRC文件的字節(jié)流,并用LrcProcesser進(jìn)行處理得到時(shí)間隊(duì)列timeMills和歌詞隊(duì)列messages。將此過(guò)程放在prepareToPlay()方法中實(shí)現(xiàn)② 統(tǒng)計(jì)Mp3總共播放的時(shí)間offSet:當(dāng)前系統(tǒng)時(shí)間減去開始播放Mp3時(shí)的系統(tǒng)時(shí)間startTimes③ 不斷的比較從時(shí)間隊(duì)列中取出的時(shí)間timeMill與offSet的大小,以確定是否應(yīng)該在TextView中進(jìn)行顯示歌詞以及是否應(yīng)該從時(shí)間隊(duì)列中取出下次要比較和顯示的timeMill。④ 總體分析:要實(shí)現(xiàn)程序自動(dòng)循環(huán)不斷的執(zhí)行某個(gè)過(guò)程,就需要Handler的postDelayed()方法與Runnable的run()方法聯(lián)合使用。因此將以上過(guò)程放在實(shí)現(xiàn)了Runnable接口的內(nèi)部類UpdateLrc的run()函數(shù)中,并在run()函數(shù)中調(diào)用Handler的postDelayed()方法,以實(shí)現(xiàn)每隔一定的時(shí)間(10毫秒)執(zhí)行一次run()函數(shù)中的過(guò)程。⑤ 在prepareToPlay()方法中創(chuàng)建一個(gè)UpdateLrc對(duì)象,以便在三個(gè)按鈕的事件監(jiān)聽(tīng)器中調(diào)用prepareToPlay()方法的自動(dòng)時(shí)候創(chuàng)建一個(gè)UpdateLrc對(duì)象。同時(shí)清空timeMill和message的值,以便再次調(diào)用prepareToPlay()方法的時(shí)候使用timeMill和message⑥ 三個(gè)按鈕的事件監(jiān)聽(tīng)器中歌詞同步的實(shí)現(xiàn): (1) play按鈕: a、按下play()按鈕的同時(shí),開始計(jì)時(shí),將此刻的系統(tǒng)時(shí)間設(shè)為Mp3 開始播放的時(shí)間startTimes。b、調(diào)用prepareToPlay()方法,產(chǎn)生UpdateLrc對(duì)象update,同 時(shí)(或者隔5毫秒)開始執(zhí)行update對(duì)象的run()方法(利用 Handler的postDelayed()方法)。C、將
點(diǎn)擊復(fù)制文檔內(nèi)容
規(guī)章制度相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1