基于android平臺(tái)的音樂播放器的設(shè)計(jì)與實(shí)現(xiàn)_第1頁
基于android平臺(tái)的音樂播放器的設(shè)計(jì)與實(shí)現(xiàn)_第2頁
基于android平臺(tái)的音樂播放器的設(shè)計(jì)與實(shí)現(xiàn)_第3頁
基于android平臺(tái)的音樂播放器的設(shè)計(jì)與實(shí)現(xiàn)_第4頁
基于android平臺(tái)的音樂播放器的設(shè)計(jì)與實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

學(xué)校代碼:10128學(xué)校代碼:10128學(xué)號(hào):200920201076嵌入式系統(tǒng)綜合設(shè)計(jì)說明書題目:基于Android的音樂播放器設(shè)計(jì)與實(shí)現(xiàn)姓名:學(xué)院:信息工程學(xué)院班級(jí):指導(dǎo)教師:2012年9月24日摘要Android是一種以Linux為基礎(chǔ)的開放源代碼操作系統(tǒng),本文就android平臺(tái)下設(shè)計(jì)和實(shí)現(xiàn)音樂播放器,利用java語言和Eclipse編程工具實(shí)現(xiàn)。通過設(shè)計(jì)能夠?qū)崿F(xiàn)音樂的播放、暫停、上一曲、下一曲、音樂列表、聲音控制、幫助菜單等功能,通過對(duì)基于android平臺(tái)下的播放器的設(shè)計(jì),了解音樂播放器的設(shè)計(jì)的原理和實(shí)現(xiàn)的相關(guān)技術(shù),掌握了android編程思想以及基本的應(yīng)用組件,對(duì)以后從事android開發(fā)有很大的幫助。關(guān)鍵詞:android;音樂播放器;嵌入式;java第一章總體功能介紹1.1功能介紹設(shè)計(jì)的音樂播放器是基于android平臺(tái)下的,能夠?qū)崿F(xiàn)音樂的播放、暫停、快進(jìn)、快退、上一曲、下一曲、聲音控制、播放列表,播放時(shí)間以及播放列表。通過播放列表,用戶可以選擇播放的音樂,播放器也可以顯示該音樂的歌曲名、專輯、歌手以及歌曲的播放總時(shí)間,播放進(jìn)度等歌曲的相關(guān)功能;用戶還可以通過音樂增減按鈕調(diào)節(jié)聲音大小,還可以選擇循環(huán)播放和順序播放;該音樂播放器能夠?qū)d卡中的MP3格式的音樂文件進(jìn)行查找和播放;用戶可以通過系統(tǒng)幫助退出系統(tǒng)、更新播放列表、設(shè)置、幫助等功能。1.11各功能模塊圖AAndroid音樂播放器聲音控制上一曲\下一曲音樂文件播放列表播放\暫停圖1.11音樂播放器模塊圖1.12設(shè)計(jì)思想圖1.12搭建模擬器圖1.2系統(tǒng)結(jié)構(gòu)用例圖根據(jù)音樂播放器的功能設(shè)計(jì),UML用例圖更直觀的反映了用戶對(duì)該軟件的需求,通過用例特征的分析,又用例模型抽象出該軟件為用戶的功能,以及詳細(xì)的敘述,音樂播放器系統(tǒng)的用例圖如下:圖1.2音樂播放器功能用例圖圖1.21音樂播放器播放列表功能用例圖第二章詳細(xì)設(shè)計(jì)及功能實(shí)現(xiàn)2.1播放器界面的設(shè)計(jì)先實(shí)現(xiàn)播放頁面的(包括各種控制按鈕和專輯圖片)布局代碼main.xml以及播放列表的界面設(shè)計(jì)playlist.xml文件。圖2.1播放界面和播放列表界面其中播放按鈕、暫停、上一曲、下一曲、聲音按鈕采用xml文件,在按下和得到焦點(diǎn)的時(shí)候會(huì)做相應(yīng)的改變,關(guān)鍵代碼如下:<selectorxmlns:android="/apk/res/android"><itemandroid:state_focused="true"android:drawable="@drawable/desktop_music_voice2"/><itemandroid:state_selected="true"android:drawable="@drawable/desktop_music_voice2"/><itemandroid:state_pressed="true"android:drawable="@drawable/desktop_music_voice2"/><itemandroid:drawable="@drawable/desktop_music_voice"/></selector>2.2播放動(dòng)畫的設(shè)計(jì)有兩個(gè)動(dòng)畫文件log.xml和log_two.xml文件,當(dāng)動(dòng)畫結(jié)束時(shí)啟動(dòng)另外一個(gè)activity動(dòng)畫特效是兩個(gè)imageView同時(shí)采用淡入,旋轉(zhuǎn)和,縮放的特效其調(diào)入動(dòng)畫關(guān)鍵代碼為:Animationanimation=AnimationUtils.loadAnimation(Logo.this,R.anim.logo);Animationanimation2=AnimationUtils.loadAnimation(Logo.this,R.anim.logo_two);圖2.2播放動(dòng)畫界面2.3各模塊詳細(xì)設(shè)計(jì)音樂播放器包括聲音控制模塊,上一曲\下一曲,播放,暫停,播放列表,系統(tǒng)幫助等幾個(gè)模塊。2.31聲音控制模塊聲音有兩個(gè)按鈕控制,一個(gè)增加聲音和一個(gè)減少聲音。通過這兩個(gè)按鈕用戶可以調(diào)節(jié)播放音樂的聲音大小,使用AudioManager組件對(duì)聲音的大小進(jìn)行增減,最大為7,最小為0。當(dāng)用戶點(diǎn)擊聲音按鈕時(shí),若是增按鈕,對(duì)聲音進(jìn)行增加;若是減按鈕對(duì)聲音進(jìn)行減小。圖2.31聲音控制圖關(guān)鍵代碼如下:獲取點(diǎn)擊事件voiceUp=(ImageButton)findViewById(R.id.music_voic_up);//音量增加voiceDown=(ImageButton)findViewById(R.id.music_voic_down);//音量增減小執(zhí)行事件audiomanage=(AudioManager)getSystemService(Context.AUDIO_SERVICE); voiceDown.setOnClickListener(newOnClickListener(){ publicvoidonClick(Viewv){ //TODOAuto-generatedmethodstub audiomanage.adjustVolume(AudioManager.ADJUST_LOWER,0); volume=audiomanage.getStreamVolume(AudioManager.STREAM_RING); if(volume>0){ volume--; audiomanage.setRingerMode(volume); } } });//聲音控制按鈕,聲音增加 voiceUp.setOnClickListener(newOnClickListener(){ publicvoidonClick(Viewv){ //TODOAuto-generatedmethodstub audiomanage.adjustVolume(AudioManager.ADJUST_RAISE,0); volume=audiomanage.getStreamVolume(AudioManager.STREAM_RING); if(volume<7){ volume++; audiomanage.setRingerMode(volume); } } });聲音控制的程序流程圖:圖2.311聲音控制流程圖2.32播放暫停模塊當(dāng)用戶點(diǎn)擊播放\暫停按鈕時(shí),播放器就對(duì)當(dāng)前播放事件監(jiān)聽,從而控制當(dāng)前音樂的播放\暫停,其界面圖如圖2.31所示,關(guān)鍵代碼如下://播放按鈕playPauseBtn.setOnClickListener(newOnClickListener(){ publicvoidonClick(Viewv){ intcmd=0; Intenti=newIntent(MusicService.MUSIC_CONTROL); //判斷當(dāng)前的狀態(tài)值是什么狀態(tài)如果是播放狀態(tài) if(status==MusicService.STATUS_PLAYING){ cmd=MusicService.CMD_PAUSE;//發(fā)送暫停的命令 }elseif(status==MusicService.STATUS_STOPPED){ cmd=MusicService.CMD_START;//發(fā)送播放的命令 }else{ cmd=MusicService.CMD_RESUME;//繼續(xù)播放的命令 } i.putExtra("cmd",cmd);//將命令廣播出去 sendBroadcast(i);//發(fā)送廣播 }});2.34上一曲\下一曲模塊當(dāng)用戶點(diǎn)擊上一曲\下一曲按鈕時(shí),播放器就對(duì)當(dāng)前播放事件監(jiān)聽,從音樂列表中轉(zhuǎn)換音樂,從而控制當(dāng)前音樂的上一曲\下一曲,其界面圖如圖2.31所示,關(guān)鍵代碼如下://上一曲鍵事件監(jiān)聽器 previousbtn.setOnClickListener(newOnClickListener(){ publicvoidonClick(Viewv){ Intenti=newIntent(MusicService.MUSIC_CONTROL); intcmd=MusicService.CMD_PREV;//發(fā)送前一首的命令 i.putExtra("cmd",cmd); sendBroadcast(i); } }); //下一曲鍵事件監(jiān)聽器 nextBtn.setOnClickListener(newOnClickListener(){ publicvoidonClick(Viewv){ Intenti=newIntent(MusicService.MUSIC_CONTROL); intcmd=MusicService.CMD_NEXT; i.putExtra("cmd",cmd); sendBroadcast(i); } }); //設(shè)置SeekBar的監(jiān)聽事件 sb.setOnSeekBarChangeListener(newOnSeekBarChangeListener(){ //當(dāng)停止拖動(dòng)時(shí)調(diào)用的方法 publicvoidonStopTrackingTouch(SeekBarseekBar){ } publicvoidonStartTrackingTouch(SeekBarseekBar){ } //當(dāng)SeekBar拖動(dòng)時(shí)會(huì)執(zhí)行此方法 publicvoidonProgressChanged(SeekBarseekBar,intprog, booleanfromUser){//fromUser參數(shù)意思是判斷拖動(dòng)是否是用戶用手拖動(dòng)的 if(fromUser==true&&Math.abs(prog-progress)>=5){ progress=prog; Intenti=newIntent(MusicService.MUSIC_CONTROL); intcmd=MusicService.CMD_SEEK;//發(fā)送拖動(dòng)的命令 i.putExtra("cmd",cmd); i.putExtra("progress",progress);//講拖動(dòng)的進(jìn)度傳進(jìn)Service sendBroadcast(i); sb.setProgress(progress); } } });}2.34音樂播放列表模塊音樂播放列表由activity組件是實(shí)現(xiàn),能夠?qū)Ξ?dāng)前android手機(jī)模擬器sd卡中MP3音樂文件進(jìn)行讀取和顯示,包括歌曲名、專輯、歌曲時(shí)間以及歌手名。用戶可以選擇想要播放的音樂對(duì)其播放。其關(guān)鍵代碼如下:privateList<Map<String,Object>>getMultiData(){ List<Map<String,Object>>musicList=newArrayList<Map<String,Object>>(); System.out.println(musicList+"0"); //循環(huán)找出所有的歌曲和信息 ContentResolverresolver=this.getContentResolver(); CursormusicCursor=resolver.query( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,null,null,null,null); intmusicColumnIndex; //遍歷游標(biāo)內(nèi)容 if(null!=musicCursor&&musicCursor.getCount()>0){ for(musicCursor.moveToFirst();!musicCursor.isAfterLast();musicCursor.moveToNext()){ Map<String,Object>musicDataMap=newHashMap<String,Object>();//取得音樂的名字 musicColumnIndex=musicCursor .getColumnIndex(MediaStore.Audio.AudioColumns.TITLE); musicName=musicCursor.getString(musicColumnIndex); musicDataMap.put("musicName",musicName); musicColumnIndex=musicCursor .getColumnIndex(MediaStore.Audio.AudioColumns.ALBUM); musicAlbum=musicCursor.getString(musicColumnIndex); musicDataMap.put("musicAlbum",musicAlbum); musicColumnIndex=musicCursor .getColumnIndex(MediaStore.Audio.AudioColumns.ARTIST); musicArtist=musicCursor.getString(musicColumnIndex); musicDataMap.put("musicArtist",musicArtist); musicColumnIndex=musicCursor .getColumnIndex(MediaStore.Audio.AudioColumns.DURATION); musicDuration=musicCursor.getString(musicColumnIndex); musicDataMap.put("musicdurction",musicDuration); //取得歌曲對(duì)應(yīng)的專輯Key這里由于專輯圖片太占內(nèi)存就不在播放列表上顯示了 musicColumnIndex=musicCursor .getColumnIndex(MediaStore.Audio.AudioColumns.ALBUM_KEY); musicAlbumKey=musicCursor.getString(musicColumnIndex); String[]argArr={musicAlbumKey}; ContentResolveralbumResolver=this.getContentResolver(); CursoralbumCursor=albumResolver.query( MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,null, MediaStore.Audio.AudioColumns.ALBUM_KEY+"=?", argArr,null); if(null!=albumCursor&&albumCursor.getCount()>0){ albumCursor.moveToFirst(); intalbumArtIndex=albumCursor .getColumnIndex(MediaStore.Audio.AlbumColumns.ALBUM_ART); musicAlbumArtPath=albumCursor.getString(albumArtIndex); if(null!=musicAlbumArtPath){ musicDataMap .put("musicAlbumArtPath",musicAlbumArtPath); }else{ musicDataMap.put("musicAlbumArtPath",R.drawable.icon); } }else{ musicDataMap.put("musicAlbumArtPath",R.drawable.icon); } albumCursor.close(); musicList.add(musicDataMap); } musicCursor.close(); } returnmusicList; }音樂列表截圖如下:圖2.34音樂播放器列表2.35系統(tǒng)幫助模塊系統(tǒng)幫助主要為用戶提供使用軟件的幫助功能,包括設(shè)置、幫助、列表、退出、刷新曲庫等功能。其截圖如下:圖2.35系統(tǒng)幫助模塊關(guān)鍵代碼如下:publicbooleanonCreateOptionsMenu(Menumenu){ menu.add(Menu.NONE,Menu.FIRST+1,5,"刷新曲庫").setIcon( android.R.drawable.ic_menu_search); menu.add(Menu.NONE,Menu.FIRST+2,6,"退出").setIcon( android.R.drawable.ic_menu_set_as); menu.add(Menu.NONE,Menu.FIRST+3,2,"幫助").setIcon( android.R.drawable.ic_menu_help); menu.add(Menu.NONE,Menu.FIRST+4,1,"列表").setIcon( android.R.drawable.ic_menu_agenda); menu.add(Menu.NONE,Menu.FIRST+5,4,"關(guān)于").setIcon( android.R.drawable.ic_menu_info_details); menu.add(Menu.NONE,Menu.FIRST+6,3,"設(shè)置").setIcon( android.R.drawable.ic_menu_preferences); returnsuper.onCreateOptionsMenu(menu); } @Override publicbooleanonOptionsItemSelected(MenuItemitem){ switch(item.getItemId()){ //這里的Menu.FIRST是一個(gè)常量Id的標(biāo)示 //根據(jù)得到的ID判斷當(dāng)前那個(gè)菜單項(xiàng)被點(diǎn)中 caseMenu.FIRST+1: Toast.makeText(this,"正在刷新歌曲...",Toast.LENGTH_SHORT).show(); break; caseMenu.FIRST+2: finish(); Toast.makeText(this,"退出...",Toast.LENGTH_SHORT).show(); break; caseMenu.FIRST+3: Toast.makeText(this,"此功能暫未開放",Toast.LENGTH_SHORT).show(); break; caseMenu.FIRST+4://跳轉(zhuǎn)到播放列表 IntentsetIntent=newIntent(PlayActivity.this,Musiclist.class); PlayActivity.this.startActivity(setIntent); break; caseMenu.FIRST+5: Stringshowtxt="幫助文件丟失!"; InputStreamis; try{ is=getAssets().open("readme.txt"); intsize=is.available(); byte[]buffer=newbyte[size]; is.read(buffer); is.close(); showtxt=newString(buffer,"utf-8"); }catch(IOExceptione){ thrownewRuntimeException(e); } newCustomDialog(PlayActivity.this,CustomDialog.DIALOG_DETAILS, "關(guān)于",showtxt).show(); break; caseMenu.FIRST+6: Toast.makeText(this,"此功能暫未開放",Toast.LENGTH_SHORT).show(); break; } returnfalse; }第三章調(diào)試及運(yùn)行結(jié)果3.1實(shí)驗(yàn)測(cè)試問題實(shí)驗(yàn)主要讀錯(cuò)誤提示進(jìn)行調(diào)試,在課設(shè)中主要出現(xiàn)的錯(cuò)誤時(shí)“系統(tǒng)異常,強(qiáng)制終止”如下圖所示圖3.1異常終止3.2實(shí)驗(yàn)調(diào)試大多數(shù)時(shí)間出現(xiàn)如上所示的情況,這是我們需要對(duì)LogCat查看錯(cuò)誤,課設(shè)中曾經(jīng)常出現(xiàn)的是內(nèi)存空間已滿,需要釋放進(jìn)程空間,以導(dǎo)致出現(xiàn)程序運(yùn)行時(shí)出現(xiàn)圖3.1所示的現(xiàn)象,所以,當(dāng)出現(xiàn)錯(cuò)誤時(shí),我們必須查看錯(cuò)在哪兒,然后改

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論