安卓音樂播放器開發(fā)含源代碼_第1頁
安卓音樂播放器開發(fā)含源代碼_第2頁
安卓音樂播放器開發(fā)含源代碼_第3頁
安卓音樂播放器開發(fā)含源代碼_第4頁
安卓音樂播放器開發(fā)含源代碼_第5頁
已閱讀5頁,還剩76頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第頁基于android平臺的音樂播放器開發(fā)實驗報告學(xué)生姓名:溫從林學(xué)號:201926630215班級:計自1201第一章引言1.1項目背景當(dāng)今社會的生活節(jié)奏越來越快,人們對手機(jī)的要求也越來越高,由于手機(jī)市場發(fā)展迅速,使得手機(jī)操作系統(tǒng)也出現(xiàn)了不同各類,現(xiàn)在的市場上主要有三個手機(jī)操作系統(tǒng),Windowsmobile,symbian,以及谷歌的Android操作系統(tǒng),其中占有開放源代碼優(yōu)勢的Android系統(tǒng)有最大的發(fā)展前景。那么能否在手機(jī)上擁有自己編寫的個性音樂播放器呢?能的,谷歌Android系統(tǒng)就能做到。本文的音樂播放器就是基于谷歌Android手機(jī)平臺的播放器。Android:是谷歌于2019年公布的開放式源代碼手機(jī)系統(tǒng),它的開放性就優(yōu)于其它封閉式的手機(jī)系統(tǒng),因此,任何人都可能根據(jù)自己的喜好將手機(jī)系統(tǒng)中的所有功能重新編寫。這使得越來越多的人關(guān)注這個操作系統(tǒng)。本次作品音樂播放器就是基于Android平臺的。1.2編寫目的現(xiàn)今社會生活緊張,而欣賞音樂是其中最好的舒緩壓力的方式之一,本項目的目的是開發(fā)一個可以播放主流音樂文件格式的播放器,本設(shè)計實現(xiàn)的主要功能是播放Mp3,Wav多種格式的音樂文件,并且能夠控制播放,暫停,停止,播放列等基本播放控制功能,界面簡明,操作簡單。本項目是一款基于Android手機(jī)平臺的音樂播放器,使Android手機(jī)擁有個性的多媒體播放器,使手機(jī)顯得更生動靈活化,及人們更為接近,讓手機(jī)主人隨時隨地處于音樂視頻的旋律之中。使人們的生活更加多樣化。也使設(shè)計者更加熟練Android的技術(shù)和其它在市場上的特點。1.3開發(fā)環(huán)境Eclipse、AndroidSDK3.2.0第二章系統(tǒng)需求分析2.1功能需求(用例圖分析)根據(jù)項目的目標(biāo),我們可獲得項目系統(tǒng)的基本需求,以下從不同角度來描述系統(tǒng)的需求,并且使用用例圖來描述,系統(tǒng)的功能需求,我們分成四部分來概括,即播放器的基本控制需要,播放列表管理需求,播放器友好性需求和播放器擴(kuò)展卡需求。以下分別描述:2.1.1播放器的用例圖假設(shè)安裝了音樂播放器的用戶是系統(tǒng)的主要設(shè)計對象,其擁有以下操作,啟動軟件、播放音樂、暫停播放、停止播放、退出軟件,其用例圖如下圖2.1播放器基本用例圖2.1.2用例分析用例名稱:啟動軟件參及者:用戶目標(biāo):使得用戶啟動軟件并加載手機(jī)和sd卡上的音頻文件到播放列表前置條件:無基本事件流:1.用戶啟動軟件2.播放器將播放列表中的當(dāng)前的歌曲用例名稱:播放參及者:用戶目標(biāo):使得用戶可以播放在播放列表中選中的歌曲前置條件:播放器正在運行基本事件流:1.用戶單擊“播放”按鈕2.播放器將播放列表中的當(dāng)前的歌曲用例名稱:暫停參及者:用戶目標(biāo):使得用戶可以暫停正在播放的歌曲前置條件:歌曲正在播放且未停止和暫?;臼录鳎?.用戶單擊“暫?!卑粹o2.播放器將暫停當(dāng)前的歌曲用例名稱:停止參及者:用戶目標(biāo):使得用戶可以停止正在播放的歌曲前置條件:歌曲正在播放或暫停基本事件流:1.用戶單擊“停止”按鈕2.播放器將停止當(dāng)前播放的歌曲用例名稱:退出參及者:用戶目標(biāo):使得用戶退出或者后臺播放音樂前置條件:程序在運行基本事件流:1.用戶按返回鍵2.播放器退出或者進(jìn)入后臺播放第三章概要設(shè)計3.1軟件播放流程圖Step1.啟動軟件后,軟件自動檢索手機(jī)和sd卡的音頻文件,并組織顯示成列表.Step2.點擊列表的歌曲名字。Step3.播放音樂。Step4.點擊暫停,音樂暫停Step5.點擊播放轉(zhuǎn)到step3Step6.點擊停止停止播放音樂Step7.點擊退出。啟動軟件自動檢索手機(jī)中的音樂文件,并顯示自動檢索手機(jī)中的音樂文件,并顯示選擇歌曲,點擊播放暫停暫停/退出軟件圖3.1音樂播放器流程圖第四章界面展示4.1軟件部署系統(tǒng)編譯生成apk文件,將apk文件拷到手機(jī)或者sd卡中,直接打開即可安裝。4.2啟動軟件打開軟件后的界面4.3歌曲列表界面歌曲列表界面4.4播放界面4.5收藏界面4.6在線搜索音樂界面結(jié)論(1)通過本次開發(fā)解決了諸如SD卡音樂文件搜索并顯示、聯(lián)網(wǎng)搜索歌曲等難題,對安卓的開發(fā)有了更深入的認(rèn)識。(2)通過對Android手機(jī)平臺的音樂播放器軟件的開發(fā),使我對Android音樂播放器系統(tǒng)的整體設(shè)計有一個深入的了解,對整個流程也會有一個清晰的認(rèn)識。開發(fā)Android音樂播放器,要抓住開發(fā)的核心部分,音樂播放器大體由播放主界面、播放列表、菜單、播放設(shè)置、文件瀏覽、歌曲搜索六大核心組成。(3)本次程序設(shè)計,對播放器的系統(tǒng)結(jié)構(gòu)框架做了精心的構(gòu)思及設(shè)計,采用主要開發(fā)工具是Eclips4.0+Java語言的支持,AndroidDevelopmentTool的插件,和AndroidSDK2.1版本的全面結(jié)合,才使整個音樂播放器系統(tǒng)得以實現(xiàn)。第五章部分源代碼以下給出功能實現(xiàn)代碼,布局,風(fēng)格等代碼量過大,放在壓縮文件中MainActivity.java:packagecom.example.xindong;importandroid.support.v7.app.ActionBarActivity;importandroid.support.v4.app.Fragment;importandroid.content.Intent;importandroid.os.Bundle;importandroid.view.LayoutInflater;importandroid.view.Menu;importandroid.view.MenuItem;importandroid.view.View;importandroid.view.ViewGroup;importandroid.view.Window;publicclassMainActivityextendsActionBarActivity{ @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.fragment_main); Threadthread=newThread(){ publicvoidrun(){ try{ sleep(2500); }catch(InterruptedExceptione){ e.printStackTrace(); finish(); Intentintent=newIntent(MainActivity.this,MusicActivity.class); startActivity(intent); thread.start(); @Override publicbooleanonCreateOptionsMenu(Menumenu){ //Inflatethemenu;thisaddsitemstotheactionbarifitispresent. getMenuInflater().inflate(R.menu.main,menu); returntrue; @Override publicbooleanonOptionsItemSelected(MenuItemitem){ //Handleactionbaritemclickshere.Theactionbarwill //automaticallyhandleclicksontheHome/Upbutton,solong //asyouspecifyaparentactivityinAndroidManifest.xml. intid=item.getItemId(); if(id==R.id.action_settings){ returntrue; returnsuper.onOptionsItemSelected(item); *Aplaceholderfragmentcontainingasimpleview. publicstaticclassPlaceholderFragmentextendsFragment{ publicPlaceholderFragment(){ @Override publicViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer, BundlesavedInstanceState){ ViewrootView=inflater.inflate(R.layout.fragment_main,container, false); returnrootView;BandanActivity.javapackagecom.example.xindong;importcom.example.Adapter.MusicListAdapter;importandroid.app.Activity;importandroid.content.Intent;importandroid.database.Cursor;importandroid.media.MediaPlayer;importandroid.os.Bundle;importvider.MediaStore;importandroid.view.KeyEvent;importandroid.view.View;importandroid.widget.AdapterView;importandroid.widget.ListView;importandroid.widget.Toast;importandroid.widget.AdapterView.OnItemClickListener;publicclassBangdanActivityextendsActivity{ privateListViewlistview; privateStringmusicpath; privateint_ids[];//存放音樂文件的id數(shù)組 privateString_titles[];//存放音樂文件的標(biāo)題數(shù)組 privateString_artists[];//存放音樂藝術(shù)家的標(biāo)題數(shù)組 privateString[]_path;//存放音樂路徑的標(biāo)題數(shù)組 privateString[]_times;//存放總時間的標(biāo)題數(shù)組 privateString[]_album;//存放專輯的標(biāo)題數(shù)組 privateint_sizes[];//存放文件大小的標(biāo)題數(shù)組 privateString[]_displayname;//存放名稱的標(biāo)題數(shù)組 @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.bangdanmusic_list); listview=(ListView)findViewById(R.id.bangdan_music_list); listview.setOnItemClickListener(newMusicListOnClickListener()); ShowMp3List(); *顯示MP3信息,其中_ids保存了所有音樂文件的_ID,用來確定到底要播放哪一首歌曲,_titles存放音樂名,用來顯示在播放界面, *而_path存放音樂文件的路徑(刪除文件時會用到)*/ privatevoidShowMp3List(){ //用游標(biāo)查找媒體詳細(xì)信息 Cursorcursor=this.getContentResolver().query( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, newString[]{ MediaStore.Audio.Media.TITLE,//標(biāo)題,游標(biāo)從0讀取 MediaStore.Audio.Media.DURATION,//持續(xù)時間,1 MediaStore.Audio.Media.ARTIST,//藝術(shù)家,2 MediaStore.Audio.Media._ID,//id,3 MediaStore.Audio.Media.DISPLAY_NAME,//顯示名稱,4 MediaStore.Audio.Media.DATA,//數(shù)據(jù),5 MediaStore.Audio.Media.ALBUM_ID,//專輯名稱ID,6 MediaStore.Audio.Media.ALBUM,//專輯,7 MediaStore.Audio.Media.SIZE},null,null,MediaStore.Audio.Media.ARTIST);//大小,8 /**將游標(biāo)移到第一位**/ cursor.moveToFirst(); /**分別將各個標(biāo)題數(shù)組實例化**/ _ids=newint[cursor.getCount()]; _titles=newString[cursor.getCount()]; _artists=newString[cursor.getCount()]; _path=newString[cursor.getCount()]; _album=newString[cursor.getCount()]; _times=newString[cursor.getCount()]; _displayname=newString[cursor.getCount()]; _sizes=newint[cursor.getCount()]; /**這里獲取路徑的格式是_path[i]=c.geString,為什么這么寫?是因為MediaStore.Audio.Media.DATA的關(guān)系 到的內(nèi)容格式為/mnt/sdcard/[子文件夾名/]音樂文件名,而我們想要得到的是/sdcard/[子文件夾名]音樂文件名 for(inti=0;i<cursor.getCount();i++){ _ids[i]=cursor.getInt(3); _titles[i]=cursor.getString(0); _artists[i]=cursor.getString(2); _path[i]=cursor.getString(5).substring(4); /*****以下是為提供音樂詳細(xì)信息而生成的******/ _album[i]=cursor.getString(7); _times[i]=toTime(cursor.getInt(1)); _sizes[i]=cursor.getInt(8); _displayname[i]=cursor.getString(4); cursor.moveToNext(); listview.setAdapter(newMusicListAdapter(this,cursor)); /**時間的轉(zhuǎn)換*/ publicStringtoTime(inttime){ time/=1000; intminute=time/60; intsecond=time%60; minute%=60; /**返回結(jié)果用string的format方法把時間轉(zhuǎn)換成字符類型**/ returnString.format("%02d:%02d",minute,second); /**音樂列表添加監(jiān)聽器,點擊之后播放音樂*/ publicclassMusicListOnClickListenerimplementsOnItemClickListener{ @Override publicvoidonItemClick(AdapterView<?>arg0,Viewview,intposition, longid){ musicpath="/mnt"+_path[position]; playMusic(musicpath); /*putExtraMusic(position); */ Intentintent=newIntent(BangdanActivity.this,PlayMusicActivity.class); startActivity(intent); finish(); publicvoidplayMusic(Stringmusicpath){ try{ MediaPlayermp=newMediaPlayer(); mp.reset(); mp.setDataSource(musicpath); mp.prepare(); mp.start(); }catch(Exceptione){ Toast.makeText(getApplicationContext(),"無法播放此文件",Toast.LENGTH_SHORT).show(); publicvoidputExtraMusic(intposition){ Intentintent=newIntent(BangdanActivity.this,PlayMusicActivity.class); /*intent.putExtra("_ids",_ids); intent.putExtra("_path",_path); intent.putExtra("_titles",_titles); intent.putExtra("_artists",_artists); intent.putExtra("position",position); startActivity(intent); finish();*/ intent=newIntent(); Bundlebundle=newBundle(); bundle.putInt("position",25); intent.putExtras(bundle); intent.setClass(BangdanActivity.this,PlayMusicActivity.class); startActivity(intent); finish(); @Override protectedvoidonStop(){ super.onStop(); privatelongexitTime=0;publicbooleanonKeyDown(intkeyCode,KeyEventevent){ if(keyCode==KeyEvent.KEYCODE_BACK&&event.getAction()==KeyEvent.ACTION_DOWN){ if((System.currentTimeMillis()-exitTime)>2000){ Toast.makeText(getApplicationContext(),"再按一次退出程序",Toast.LENGTH_SHORT).show();exitTime=System.currentTimeMillis(); else{finish();System.exit(0);returntrue;returnsuper.onKeyDown(keyCode,event);CollectionActivity.javapackagecom.example.xindong;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importandroid.app.ExpandableListActivity;importandroid.os.Bundle;importandroid.view.KeyEvent;importandroid.widget.SimpleExpandableListAdapter;importandroid.widget.Toast;publicclassCollectionActivityextendsExpandableListActivity{@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.fragment_collection);//一級條目List<Map<String,String>>groups=newArrayList<Map<String,String>>();Map<String,String>group1=newHashMap<String,String>();group1.put("group","【歌手】");Map<String,String>group2=newHashMap<String,String>();group2.put("group","【專輯】");groups.add(group1);groups.add(group2);//二組條目List<List<Map<String,String>>>childs=newArrayList<List<Map<String,String>>>();//第一組二級科目數(shù)據(jù)List<Map<String,String>>child1=newArrayList<Map<String,String>>();Map<String,String>item1=newHashMap<String,String>();item1.put("child","林俊杰");Map<String,String>item2=newHashMap<String,String>();item2.put("child","周杰倫");child1.add(item1);child1.add(item2);//第二組二級科目數(shù)據(jù)List<Map<String,String>>child2=newArrayList<Map<String,String>>();Map<String,String>item3=newHashMap<String,String>();item3.put("child","<<因你而在>>");Map<String,String>item4=newHashMap<String,String>();item4.put("child","<<流行主教>>");Map<String,String>item5=newHashMap<String,String>();item5.put("child","<<第二天堂>>");child2.add(item3);child2.add(item4);child2.add(item5);childs.add(child1);childs.add(child2);//SimpleExpandableListAdapter構(gòu)造函數(shù)參數(shù)//1.content//2.一級條目數(shù)據(jù)//3.一級條目布局文件//4.一級條目Key//5.一級條目顯示信息控件id//6.二級條目數(shù)據(jù)//7.二級條目布局文件//8.二級條目Key//9.二級條目顯示信息控件idSimpleExpandableListAdapteradapter=newSimpleExpandableListAdapter(this,groups,R.layout.group,newString[]{"group"},newint[]{R.id.groupTo},childs,R.layout.child,newString[]{"child"},newint[]{R.id.childTo});setListAdapter(adapter);privatelongexitTime=0;publicbooleanonKeyDown(intkeyCode,KeyEventevent){ if(keyCode==KeyEvent.KEYCODE_BACK&&event.getAction()==KeyEvent.ACTION_DOWN){ if((System.currentTimeMillis()-exitTime)>2000){ Toast.makeText(getApplicationContext(),"再按一次退出程序",Toast.LENGTH_SHORT).show();exitTime=System.currentTimeMillis(); else{finish();System.exit(0);returntrue;returnsuper.onKeyDown(keyCode,event); *初始化菜單publicbooleanonMenuKeyDown(intkeyCode,KeyEventevent){ if(keyCode==KeyEvent.KEYCODE_MENU&&event.getAction()==KeyEvent.ACTION_DOWN){ Toast.makeText(getApplicationContext(),"未定義菜單",Toast.LENGTH_SHORT).show(); returntrue;Contsant.javapackagecom.example.xindong;importandroid.content.Context;importandroid.util.DisplayMetrics;importandroid.view.Display;importandroid.view.WindowManager;publicclassContsant{ *獲取屏幕的大小0:寬度1:高度 publicstaticint[]getScreen(Contextcontext){ WindowManagerwindowManager=(WindowManager)context.getSystemService(Context.WINDOW_SERVICE); Displaydisplay=windowManager.getDefaultDisplay(); DisplayMetricsoutMetrics=newDisplayMetrics(); display.getMetrics(outMetrics); returnnewint[]{(int)(outMetrics.density*outMetrics.widthPixels), (int)(outMetrics.density*outMetrics.heightPixels)}; *獲取文件的后綴名,返回大寫 publicstaticStringgetSuffix(Stringstr){ inti=str.lastIndexOf('.'); if(i!=-1){ returnstr.substring(i+1).toUpperCase(); returnstr; *格式化文件大小Byte->MB publicstaticStringformatByteToMB(intsize){ floatmb=size/1024f/1024f; returnString.format("%.2f",mb);LRCbean.javapackagecom.example.xindong;/**歌詞實體*/publicclassLRCbean{ privateintbeginTime=0;//開始時間 publicintgetBeginTime(){ returnbeginTime; publicvoidsetBeginTime(intbeginTime){ this.beginTime=beginTime; publicintgetLineTime(){ returnlineTime; publicvoidsetLineTime(intlineTime){ this.lineTime=lineTime; publicStringgetLrcBody(){ returnlrcBody; publicvoidsetLrcBody(StringlrcBody){ this.lrcBody=lrcBody; privateintlineTime=0; privateStringlrcBody=null;//歌詞實體MDialog.javapackagecom.example.xindong;importandroid.app.Activity;importandroid.app.Dialog;importandroid.content.Context;importandroid.content.DialogInterface;importandroid.text.TextUtils;importandroid.view.LayoutInflater;importandroid.view.View;importandroid.view.ViewGroup;importandroid.view.ViewGroup.LayoutParams;importandroid.widget.Button;importandroid.widget.FrameLayout;importandroid.widget.ImageView;importandroid.widget.LinearLayout;importandroid.widget.TextView;*自定義的對話框publicclassMDialogextendsDialog{ publicMDialog(Contextcontext){ super(context); publicMDialog(Contextcontext,inttheme){ super(context,theme); publicstaticclassBuilder{ privateContextcontext; privateintmIcon=-1;//提示圖標(biāo) privateCharSequencemTitle;//提示標(biāo)題 privateCharSequencemMessage;//提示內(nèi)容 privateCharSequencemPositiveButtonText;//確定按鈕文本 privateCharSequencemNegativeButtonText;//拒絕按鈕文本 privateCharSequencemNeutralButtonText;//中間按鈕文本 privatebooleanmCancelable=true;//是否啟用取消鍵 privateintmViewSpacingLeft; privateintmViewSpacingTop; privateintmViewSpacingRight; privateintmViewSpacingBottom; privatebooleanmViewSpacingSpecified=false; //提示內(nèi)容View privateViewmView; privateOnClickListenermPositiveButtonClickListener, mNegativeButtonClickListener,mNeutralButtonClickListener; privateOnCancelListenermCancelListener;//取消鍵事件 privateOnKeyListenermKeyListener;//按鍵處理 publicBuilder(Contextcontext){ this.context=context; publicBuildersetMessage(CharSequencemessage){ this.mMessage=message; returnthis; publicBuildersetMessage(intmessage){ this.mMessage=context.getText(message); returnthis; publicBuildersetTitle(inttitle){ this.mTitle=context.getText(title); returnthis; publicBuildersetTitle(CharSequencetitle){ this.mTitle=title; returnthis; publicBuildersetIcon(inticon){ this.mIcon=icon; returnthis; publicBuildersetView(Viewview){ this.mView=view; mViewSpacingSpecified=false; returnthis; publicBuildersetView(Viewview,intleft,inttop,intright, intbottom){ this.mView=view; this.mViewSpacingLeft=left; this.mViewSpacingTop=top; this.mViewSpacingRight=right; this.mViewSpacingBottom=bottom; mViewSpacingSpecified=true; returnthis; publicBuildersetPositiveButton(inttextId, finalOnClickListenerlistener){ this.mPositiveButtonText=context.getText(textId); this.mPositiveButtonClickListener=listener; returnthis; publicBuildersetPositiveButton(Stringtext, finalOnClickListenerlistener){ this.mPositiveButtonText=text; this.mPositiveButtonClickListener=listener; returnthis; publicBuildersetNeutralButton(inttextId, finalOnClickListenerlistener){ this.mNeutralButtonText=context.getText(textId); this.mNeutralButtonClickListener=listener; returnthis; publicBuildersetNeutralButton(Stringtext, finalOnClickListenerlistener){ this.mNeutralButtonText=text; this.mNeutralButtonClickListener=listener; returnthis; publicBuildersetNegativeButton(inttextId, finalOnClickListenerlistener){ this.mNegativeButtonText=context.getText(textId); this.mNegativeButtonClickListener=listener; returnthis; publicBuildersetNegativeButton(Stringtext, finalOnClickListenerlistener){ this.mNegativeButtonText=text; this.mNegativeButtonClickListener=listener; returnthis; publicBuildersetCancelable(booleancancelable){ this.mCancelable=cancelable; returnthis; publicBuildersetOnCancelListener(OnCancelListenerlistener){ this.mCancelListener=listener; returnthis; publicBuildersetOnKeyListener(OnKeyListenerlistener){ this.mKeyListener=listener; returnthis; publicMDialogcreate(){ LayoutInflaterinflater=(LayoutInflater)context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); finalMDialogdialog=newMDialog(context,R.style.XfDialog); dialog.setCancelable(mCancelable); //設(shè)置取消鍵事件 if(mCancelListener!=null){ dialog.setOnCancelListener(mCancelListener); //設(shè)置鍵盤監(jiān)聽事件 if(mKeyListener!=null){ dialog.setOnKeyListener(mKeyListener); //獲取對話框布局 Viewlayout=inflater.inflate(R.layout.alert_dialog,(ViewGroup)(((Activity)context).findViewById(R.id.parentPanel))); layout.setLayoutParams(newLayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT)); //設(shè)置標(biāo)題 ((TextView)layout.findViewById(R.id.alertTitle)).setText(mTitle); //設(shè)置圖標(biāo) if(mIcon!=-1){ ((ImageView)layout.findViewById(R.id.icon)).setBackgroundResource(mIcon); intcount=0; //設(shè)置確定按鈕 if(setButton(layout,mPositiveButtonText,R.id.button1,dialog,mPositiveButtonClickListener)) count++; //設(shè)置拒絕按鈕 if(setButton(layout,mNegativeButtonText,R.id.button2,dialog,mNegativeButtonClickListener)) count++; //設(shè)置中間按鈕 if(setButton(layout,mNeutralButtonText,R.id.button3,dialog,mNeutralButtonClickListener)) count++; if(count==0){ layout.findViewById(R.id.buttonPanel).setVisibility(View.GONE); //一個按鈕時,顯示兩邊空間 if(count==1){ layout.findViewById(R.id.leftSpacer).setVisibility(View.INVISIBLE); layout.findViewById(R.id.rightSpacer).setVisibility(View.INVISIBLE); //設(shè)置提示消息 if(!TextUtils.isEmpty(mMessage)){ ((TextView)layout.findViewById(R.id.message)).setText(mMessage); }else{ ((LinearLayout)layout.findViewById(R.id.contentPanel)).setVisibility(View.GONE); //設(shè)置提示內(nèi)容布局 if(mView!=null){ finalFrameLayoutcustomPanel=(FrameLayout)layout.findViewById(R.id.customPanel); if(mViewSpacingSpecified){ customPanel.setPadding(mViewSpacingLeft,mViewSpacingTop,mViewSpacingRight,mViewSpacingBottom); customPanel.addView(mView); }else{ ((FrameLayout)layout.findViewById(R.id.customPanel)).setVisibility(View.GONE); dialog.setContentView(layout); returndialog; publicMDialogshow(){ MDialogdialog=create(); dialog.show(); returndialog; privatebooleansetButton(Viewlayout,CharSequencemPositiveButtonText2,intid, finalDialogdialog,finalOnClickListenerlistener){ if(!TextUtils.isEmpty(mPositiveButtonText2)){ finalButtonbutton1=(Button)layout.findViewById(id); button1.setText(mPositiveButtonText2); if(listener!=null){ button1.setOnClickListener(newView.OnClickListener(){ publicvoidonClick(Viewv){ listener.onClick(dialog,DialogInterface.BUTTON_POSITIVE); }else{ //默認(rèn)事件為關(guān)閉對話框 button1.setOnClickListener(newView.OnClickListener(){ publicvoidonClick(Viewv){ dialog.cancel(); dialog.dismiss(); returntrue; }else{ layout.findViewById(id).setVisibility(View.GONE); returnfalse;MusicActivity.javapackagecom.example.xindong;importandroid.os.Bundle;importandroid.view.Window;importandroid.widget.RadioGroup;importandroid.widget.TabHost;importandroid.widget.RadioGroup.OnCheckedChangeListener;importandroid.app.TabActivity;importandroid.content.Intent;/*以Tabhost+RadioGroup組合*/publicclassMusicActivityextendsTabActivityimplementsOnCheckedChangeListener{privateTabHosttabhost;privateRadioGroupradiogroup; @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.fragment_music); tabhost=getTabHost(); radiogroup=(RadioGroup)findViewById(R.id.tab_group); radiogroup.setOnCheckedChangeListener(this); radiogroup.setClickable(true); tabhost.addTab(tabhost.newTabSpec("local_music").setIndicator("local_music").setContent(newIntent(this,MusicListActivity.class))); tabhost.addTab(tabhost.newTabSpec("my_collect").setIndicator("my_collect").setContent(newIntent(this,CollectionActivity.class))); tabhost.addTab(tabhost.newTabSpec("net_music").setIndicator("net_music").setContent(newIntent(this,NetMusicActivity.class))); @Override publicvoidonCheckedChanged(RadioGroupgroup,intcheckedId){ switch(checkedId){ caseR.id.local_music: tabhost.setCurrentTabByTag("local_music"); break; caseR.id.my_collect: tabhost.setCurrentTabByTag("my_collect"); break; caseR.id_music: tabhost.setCurrentTabByTag("net_music"); break;MusicListActivity.javapackagecom.example.xindong;importcom.example.Adapter.MusicListAdapter;importandroid.app.Activity;importandroid.content.Intent;importandroid.database.Cursor;importandroid.graphics.Color;importandroid.media.MediaPlayer;importandroid.os.Bundle;importvider.MediaStore;importandroid.view.ContextMenu;importandroid.view.ContextMenu.ContextMenuInfo;importandroid.view.KeyEvent;importandroid.view.LayoutInflater;importandroid.view.View;importandroid.view.View.OnCreateContextMenuListener;importandroid.view.ViewGroup.LayoutParams;importandroid.widget.AdapterView;importandroid.widget.AdapterView.OnItemClickListener;importandroid.widget.ArrayAdapter;importandroid.widget.ListView;importandroid.widget.TextView;importandroid.widget.Toast;publicclassMusicListActivityextendsActivity{ /**音樂列表**/ privateListViewlistview; privateStringmusicpath; privateint_ids[];//存放音樂文件的id數(shù)組 privateString_titles[];//存放音樂文件的標(biāo)題數(shù)組 privateString_artists[];//存放音樂藝術(shù)家的標(biāo)題數(shù)組 privateString[]_path;//存放音樂路過的標(biāo)題數(shù)組 privateString[]_times;//存放總時間的標(biāo)題數(shù)組 privateString[]_album;//存放專輯的標(biāo)題數(shù)組 privateint_sizes[];//存放文件大小的標(biāo)題數(shù)組 privateString[]_displayname;//存放名稱的標(biāo)題數(shù)組 privateintnum;//num確定一個標(biāo)識 privateLayoutInflaterinflater;//裝載布局 privateLayoutParamsparams; privateToasttoast;//提示 publicstaticfinalintRingtone=0; publicstaticfinalintAlarm=1; publicstaticfinalintNotification=2; privateTextViewtimers;//顯示倒計時的文字 publicMusicListAdapteradapter; @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.music_list); /**選擇子項點擊事件***/ listview=(ListView)findViewById(R.id.local_music_list); listview.setOnItemClickListener(newMusicListOnClickListener()); listview.setOnCreateContextMenuListener(newMusicListContextListener()); timers=(TextView)findViewById(R.id.timer_clock); inflater=(LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE); params=newLayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT); ShowMp3List(); /**顯示MP3信息,其中_ids保存了所有音樂文件的_ID,用來確定到底要播放哪一首歌曲,_titles存放音樂名,用來顯示在播放界面, _path存放音樂文件的路徑(刪除文件時會用到)。**/ privatevoidShowMp3List(){ /**用游標(biāo)查找媒體詳細(xì)信息**/ Cursorcursor=this.getContentResolver().query( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, newString[]{MediaStore.Audio.Media.TITLE,//標(biāo)題,游標(biāo)從0讀取 MediaStore.Audio.Media.DURATION,//持續(xù)時間,1 MediaStore.Audio.Media.ARTIST,//藝術(shù)家,2 MediaStore.Audio.Media._ID,//id,3 MediaStore.Audio.Media.DISPLAY_NAME,//顯示名稱,4 MediaStore.Audio.Media.DATA,//數(shù)據(jù),5 MediaStore.Audio.Media.ALBUM_ID,//專輯名稱ID,6 MediaStore.Audio.Media.ALBUM,//專輯,7 MediaStore.Audio.Media.SIZE},null,null,MediaStore.Audio.Media.ARTIST);//大小,8 /**判斷游標(biāo)是否為空,有些地方即使沒有音樂也會報異常。而且游標(biāo)不穩(wěn)定。稍有不慎就出錯了,其次,如果用戶沒有音樂的話,不妨可以告知用戶沒有音樂讓用戶添加進(jìn)去*/ if(cursor!=null&&cursor.getCount()==0){ finalMDialogxfdialog=newMDialog.Builder(MusicListActivity.this).setTitle("提示:").setMessage("你的手機(jī)未找到音樂,請?zhí)砑右魳?).setPositiveButton("確定",null).create(); xfdialog.show(); return; /**將游標(biāo)移到第一位**/ cursor.moveToFirst(); /**分別將各個標(biāo)題數(shù)組實例化**/ _ids=newint[cursor.getCount()];// _titles=newString[cursor.getCount()]; _artists=newString[cursor.getCount()]; _path=newString[cursor.getCount()]; _album=newString[cursor.getCount()]; _times=newString[cursor.getCount()]; _displayname=newString[cursor.getCount()]; _sizes=newint[cursor.getCount()]; /**這里獲取路徑的格式是_path[i]=c.geString,為什么這么寫?是因為MediaStore.Audio.Media.DATA的關(guān)系 到的內(nèi)容格式為/mnt/sdcard/[子文件夾名/]音樂文件名,而我們想要得到的是/sdcard/[子文件夾名]音樂文件名 for(inti=0;i<cursor.getCount();i++){ _ids[i]=cursor.getInt(3); _titles[i]=cursor.getString(0); _artists[i]=cursor.getString(2); _path[i]=cursor.getString(5).substring(4); /**以下是為提供音樂詳細(xì)信息而生成的**/ _album[i]=cursor.getString(7); _times[i]=toTime(cursor.getInt(1)); _sizes[i]=cursor.getInt(8); _displayname[i]=cursor.getString(4); cursor.moveToNext(); /**一直將游標(biāo)往下走**/ listview.setAdapter(newMusicListAdapter(this,cursor)); /**時間的轉(zhuǎn)換**/ publicStringtoTime(inttime){ time/=1000; intminute=time/60; intsecond=time%60; minute%=60; /**返回結(jié)果用string的format方法把時間轉(zhuǎn)換成字符類型**/ returnString.format("%02d:%02d",minute,second); /**音樂列表添加監(jiān)聽器,點擊之后播放音樂*/ publicclassMusicListOnClickListenerimplementsOnItemClickListener{ @Override publicvoidonItemClick(AdapterView<?>arg0,Viewview,intposition, longid){ playMusic(position); /**長按Listview后彈出菜單**/ privateclassMusicListContextListenerimplementsOnCreateContextMenuListener{ @Override publicvoidonCreateContextMenu(ContextMenumenu,Viewv,ContextMenuInfoinfo){ SongItemDialog(); /**當(dāng)顯示AdapterView的上下文菜單時,為onCreateContextMenu(ContextMenu,View,ContextMenuInfo)回調(diào)函數(shù)提供的額外的菜單信息.**/ finalAdapterView.AdapterContextMenuInfomenuInfo=(AdapterView.AdapterContextMenuInfo)info; num=menuInfo.position; /**根據(jù)Position播放音樂**/ publicvoidplayMusicII(intposition){ musicpath="/mnt"+_path[position]; try{

溫馨提示

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

評論

0/150

提交評論