




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于android平台的音乐播放器开发实验报告学生姓名:温从林学号:202326630215班级:计自1201第一章引言1.1工程背景当今社会的生活节奏越来越快,人们对的要求也越来越高,由于市场开展迅速,使得操作系统也出现了不同各类,现在的市场上主要有三个操作系统,Windowsmobile,symbian,以及谷歌的Android操作系统,其中占有开放源代码优势的Android系统有最大的开展前景。那么能否在上拥有自己编写的个性音乐播放器呢?能的,谷歌Android系统就能做到。本文的音乐播放器就是基于谷歌Android平台的播放器。Android:是谷歌于2007年公布的开放式源代码系统,它的开放性就优于其它封闭式的系统,因此,任何人都可能根据自己的喜好将系统中的所有功能重新编写。这使得越来越多的人关注这个操作系统。本次作品音乐播放器就是基于Android平台的。1.2编写目的现今社会生活紧张,而欣赏音乐是其中最好的舒缓压力的方式之一,本工程的目的是开发一个可以播放主流音乐文件格式的播放器,本设计实现的主要功能是播放Mp3,Wav多种格式的音乐文件,并且能够控制播放,暂停,停止,播放列等根本播放控制功能,界面简明,操作简单。本工程是一款基于Android平台的音乐播放器,使Android拥有个性的多媒体播放器,使显得更生动灵活化,与人们更为接近,让主人随时随地处于音乐视频的旋律之中。使人们的生活更加多样化。也使设计者更加熟练Android的技术和其它在市场上的特点。1.3开发环境第二章系统需求分析2.1功能需求〔用例图分析〕根据工程的目标,我们可获得工程系统的根本需求,以下从不同角度来描述系统的需求,并且使用用例图来描述,系统的功能需求,我们分成四局部来概括,即播放器的根本控制需要,播放列表管理需求,播放器友好性需求和播放器扩展卡需求。以下分别描述:2.1.1播放器的用例图假设安装了音乐播放器的用户是系统的主要设计对象,其拥有以下操作,启动软件、播放音乐、暂停播放、停止播放、退出软件,其用例图如下图2.1播放器根本用例图用例分析用例名称:启动软件参与者:用户目标:使得用户启动软件并加载和sd卡上的音频文件到播放列表前置条件:无根本领件流:1.用户启动软件2.播放器将播放列表中的当前的歌曲用例名称:播放参与者:用户目标:使得用户可以播放在播放列表中选中的歌曲前置条件:播放器正在运行根本领件流:1.用户单击“播放〞按钮2.播放器将播放列表中的当前的歌曲用例名称:暂停参与者:用户目标:使得用户可以暂停正在播放的歌曲前置条件:歌曲正在播放且未停止和暂停根本领件流:1.用户单击“暂停〞按钮2.播放器将暂停当前的歌曲用例名称:停止参与者:用户目标:使得用户可以停止正在播放的歌曲前置条件:歌曲正在播放或暂停根本领件流:1.用户单击“停止〞按钮2.播放器将停止当前播放的歌曲用例名称:退出参与者:用户目标:使得用户退出或者后台播放音乐前置条件:程序在运行根本领件流:1.用户按返回键2.播放器退出或者进入后台播放第三章概要设计3.1软件播放流程图Step1.启动软件后,软件自动检索和sd卡的音频文件,并组织显示成列表.Step2.点击列表的歌曲名字。Step3.播放音乐。Step4.点击暂停,音乐暂停Step5.点击播放转到step3Step6.点击停止停止播放音乐Step7.点击退出。启动软件自动检索中的音乐文件,并显示自动检索中的音乐文件,并显示选择歌曲,点击播放暂停暂停/退出软件图3.1音乐播放器流程图第四章界面展示4.1软件部署系统编译生成apk文件,将apk文件拷到或者sd卡中,直接翻开即可安装。4.2启动软件翻开软件后的界面4.3歌曲列表界面歌曲列表界面4.4播放界面4.5收藏界面4.6在线搜索音乐界面结论(1)通过本次开发解决了诸如SD卡音乐文件搜索并显示、联网搜索歌曲等难题,对安卓的开发有了更深入的认识。(2)通过对Android平台的音乐播放器软件的开发,使我对Android音乐播放器系统的整体设计有一个深入的了解,对整个流程也会有一个清晰的认识。开发Android音乐播放器,要抓住开发的核心局部,音乐播放器大体由播放主界面、播放列表、菜单、播放设置、文件浏览、歌曲搜索六大核心组成。(3)本次程序设计,对播放器的系统结构框架做了精心的构思与设计,采用主要开发工具是Eclips4.0+Java语言的支持,AndroidDevelopmentTool的插件,和AndroidSDK2.1版本的全面结合,才使整个音乐播放器系统得以实现。第五章局部源代码以下给出功能实现代码,布局,风格等代码量过大,放在压缩文件中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{@OverrideprotectedvoidonCreate(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(); }@OverridepublicbooleanonCreateOptionsMenu(Menumenu){//Inflatethemenu;thisaddsitemstotheactionbarifitispresent. getMenuInflater().inflate(R.menu.main,menu);returntrue; }@OverridepublicbooleanonOptionsItemSelected(MenuItemitem){//Handleactionbaritemclickshere.Theactionbarwill//automaticallyhandleclicksontheHome/Upbutton,solong//asyouspecifyaparentactivityinAndroidMid=item.getItemId();if(id==R.id.action_settings){returntrue; }returnsuper.onOptionsItemSelected(item); }/** *Aplaceholderfragmentcontainingasimpleview. */publicstaticclassPlaceholderFragmentextendsFragment{publicPlaceholderFragment(){ }@OverridepublicViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer, BundlesavedInstanceState){ ViewrootView=inflater.inflate(R.layout.fragment_main,container,false);returnrootView; } }}BandanActivity.javapackage;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数组privateString_titles[];//存放音乐文件的标题数组privateString_artists[];//存放音乐艺术家的标题数组privateString[]_path;//存放音乐路径的标题数组privateString[]_times;//存放总时间的标题数组privateString[]_album;//存放专辑的标题数组privateint_sizes[];//存放文件大小的标题数组privateString[]_displayname;//存放名称的标题数组@OverrideprotectedvoidonCreate(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(){//用游标查找媒体详细信息 Cursorcursor=this.getContentResolver().query( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,newString[]{ MediaStore.Audio.Media.TITLE,//标题,游标从0读取 MediaStore.Audio.Media.DURATION,//持续时间,1 MediaStore.Audio.Media.ARTIST,//艺术家,2 MediaStore.Audio.Media._ID,//id,3 MediaStore.Audio.Media.DISPLAY_NAME,//显示名称,4 MediaStore.Audio.Media.DATA,//数据,5 MediaStore.Audio.Media.ALBUM_ID,//专辑名称ID,6 MediaStore.Audio.Media.ALBUM,//专辑,7 MediaStore.Audio.Media.SIZE},null,null,MediaStore.Audio.Media.ARTIST);//大小,8/**将游标移到第一位**/ cursor.moveToFirst();/**分别将各个标题数组实例化**/_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的关系 到的内容格式为/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);/*****以下是为提供音乐详细信息而生成的******/_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)); }/**时间的转换*/publicStringtoTime(inttime){ time/=1000;intminute=time/60;intsecond=time%60; minute%=60;/**返回结果用string的format方法把时间转换成字符类型**/returnString.format("%02d:%02d",minute,second); }/**音乐列表添加监听器,点击之后播放音乐*/publicclassMusicListOnClickListenerimplementsOnItemClickListener{@OverridepublicvoidonItemClick(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(); }@OverrideprotectedvoidonStop(){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>>>();//第一组二级科目数据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);//第二组二级科目数据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构造函数参数//1.content//2.一级条目数据//3.一级条目布局文件//4.一级条目Key//5.一级条目显示信息控件id//6.二级条目数据//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;//提示图标 privateCharSequencemTitle;//提示标题 privateCharSequencemMessage;//提示内容 privateCharSequencemPositiveButtonText;//确定按钮文本 privateCharSequencemNegativeButtonText;//拒绝按钮文本 privateCharSequencemNeutralButtonText;//中间按钮文本 privatebooleanmCancelable=true;//是否启用取消键 privateintmViewSpacingLeft; privateintmViewSpacingTop; privateintmViewSpacingRight; privateintmViewSpacingBottom; privatebooleanmViewSpacingSpecified=false; //提示内容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); //设置取消键事件 if(mCancelListener!=null){ dialog.setOnCancelListener(mCancelListener); } //设置键盘监听事件 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)); //设置标题 ((TextView)layout.findViewById(R.id.alertTitle)).setText(mTitle); //设置图标 if(mIcon!=-1){ ((ImageView)layout.findViewById(R.id.icon)).setBackgroundResource(mIcon); } intcount=0; //设置确定按钮 if(setButton(layout,mPositiveButtonText,R.id.button1,dialog,mPositiveButtonClickListener)) count++; //设置拒绝按钮 if(setButton(layout,mNegativeButtonText,R.id.button2,dialog,mNegativeButtonClickListener)) count++; //设置中间按钮 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); } //设置提示消息 if(!TextUtils.isEmpty(mMessage)){ ((TextView)layout.findViewById(R.id.message)).setText(mMessage); }else{ ((LinearLayout)layout.findViewById(R.id.contentPanel)).setVisibility(View.GONE); } //设置提示内容布局 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{ //默认事件为关闭对话框 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._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数组 privateString_titles[];//存放音乐文件的标题数组 privateString_artists[];//存放音乐艺术家的标题数组 privateString[]_path;//存放音乐路过的标题数组 privateString[]_times;//存放总时间的标题数组 privateString[]_album;//存放专辑的标题数组 privateint_sizes[];//存放文件大小的标题数组 privateString[]_displayname;//存放名称的标题数组 privateintnum;//num确定一个标识 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(){ /**用游标查找媒体详细信息**/ Cursorcursor=this.getContentResolver().query( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, newString[]{MediaStore.Audio.Media.TITLE,//标题,游标从0读取 MediaStore.Audio.Media.DURATION,//持续时间,1 MediaStore.Audio.Media.ARTIST,//艺术家,2 MediaStore.Audio.Media._ID,//id,3 MediaStore.Audio.Media.DISPLAY_NAME,//显示名称,4 MediaStore.Audio.Media.DATA,//数据,5 MediaStore.Audio.Media.ALBUM_ID,//专辑名称ID,6 MediaStore.Audio.Media.ALBUM,//专辑,7 MediaStore.Audio.Media.SIZE},null,null,MediaStore.Audio.Media.ARTIST);//大小,8 /**判断游标是否为空,有些地方即使没有音乐也会报异常。而且游标不稳定。稍有不慎就出错了,其次,如果用户没有音乐的话,不妨可以告知用户没有音乐让用户添加进去*/ if(cursor!=null&&cursor.getCount()==0){ finalMDialogxfdialog=newMDialog.Builder(MusicListActivity.this).setTitle("提示:").setMessage("你的未找到音乐,请添加音乐").setPositiveButton("确定",null).create(); xfdialog.show(); return; } /**将游标移到第一位**/ cursor.moveToFirst(); /**分别将各个标题数组实例化**/ _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的关系 到的内容格式为/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); /**以下是为提供音乐详细信息而生成的**/ _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)); } /**时间的转换**/ publicStringtoTime(inttime){ time/=1000; intminute=time/60; intsecond=time%60; minute%=60; /**返回结果用string的format方法把时间转换成字符类型**/ returnString.format("%02d:%02d",minute,second); } /**音乐列表添加监听器,点击之后播放音乐*/ publicclassMusicListOnClickListenerimplementsOnItemClickListener{ @Override publicvoidonItemClick(AdapterView<?>arg0,Viewview,intposition, longid){ playMusic(position); } } /**长按Listview后弹出菜单**/ privateclassMusicListContextListenerimplementsOnCreateContextMenuListener{ @Override publicvoidonCreateContextMenu(ContextMenumenu,Viewv,ContextMenuInfoinfo){ SongItemDialog(); /**当显示AdapterView的上下文菜单时,为onCreateContextMenu(ContextMenu,View,ContextMenuInfo)回调函数提供的额外的菜单信息.**/ finalAdapterView.AdapterContextMenuInfomenuInfo=(AdapterView.AdapterContextMenuInfo)info; num=menuInfo.position; } } /**根据Position播放
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 四川公务员考试试题及答案
- 《总有一天会长大》测试题(附答案)
- 社区社区服务经济学研究管理基础知识点归纳
- DDX42在调控RNA剪接与认知功能中的作用研究
- 车辆智能驾驶技术在农业运输中的应用-洞察阐释
- 创新驱动与绿色园区产业链协同发展
- 加快数字化转型助力产业提质增效
- 康师傅一刻馆奶茶上市计划创意制作执行细案
- 2025至2030年中国煮牙盒螺丝行业投资前景及策略咨询报告
- 2025至2030年中国灯笼布行业投资前景及策略咨询报告
- 单层钢结构厂房施工组织设计方案
- (新版)供电可靠性理论考试题库大全-下(填空题)
- 村项目验收表(村级验收)
- 收费站年度工作计划
- ECMO技术参数要求
- 城市轨道交通供电技术442页完整版教学课件汇总全书电子教案
- 高填深挖路基稳定性监控观测方案
- 安全标准化现场评审所需资料清单(共14页)
- 班组会议运作技巧ppt课件
- 链家房屋买卖合同范本(共10篇)
- 柱上变压器台与设备安装标准
评论
0/150
提交评论