版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第页基于android平台的音乐播放器开发实验报告学生姓名:温从林学号:201926630215班级:计自1201第一章引言1.1项目背景当今社会的生活节奏越来越快,人们对手机的要求也越来越高,由于手机市场发展迅速,使得手机操作系统也出现了不同各类,现在的市场上主要有三个手机操作系统,Windowsmobile,symbian,以及谷歌的Android操作系统,其中占有开放源代码优势的Android系统有最大的发展前景。那么能否在手机上拥有自己编写的个性音乐播放器呢?能的,谷歌Android系统就能做到。本文的音乐播放器就是基于谷歌Android手机平台的播放器。Android:是谷歌于2019年公布的开放式源代码手机系统,它的开放性就优于其它封闭式的手机系统,因此,任何人都可能根据自己的喜好将手机系统中的所有功能重新编写。这使得越来越多的人关注这个操作系统。本次作品音乐播放器就是基于Android平台的。1.2编写目的现今社会生活紧张,而欣赏音乐是其中最好的舒缓压力的方式之一,本项目的目的是开发一个可以播放主流音乐文件格式的播放器,本设计实现的主要功能是播放Mp3,Wav多种格式的音乐文件,并且能够控制播放,暂停,停止,播放列等基本播放控制功能,界面简明,操作简单。本项目是一款基于Android手机平台的音乐播放器,使Android手机拥有个性的多媒体播放器,使手机显得更生动灵活化,及人们更为接近,让手机主人随时随地处于音乐视频的旋律之中。使人们的生活更加多样化。也使设计者更加熟练Android的技术和其它在市场上的特点。1.3开发环境Eclipse、AndroidSDK3.2.0第二章系统需求分析2.1功能需求(用例图分析)根据项目的目标,我们可获得项目系统的基本需求,以下从不同角度来描述系统的需求,并且使用用例图来描述,系统的功能需求,我们分成四部分来概括,即播放器的基本控制需要,播放列表管理需求,播放器友好性需求和播放器扩展卡需求。以下分别描述:2.1.1播放器的用例图假设安装了音乐播放器的用户是系统的主要设计对象,其拥有以下操作,启动软件、播放音乐、暂停播放、停止播放、退出软件,其用例图如下图2.1播放器基本用例图2.1.2用例分析用例名称:启动软件参及者:用户目标:使得用户启动软件并加载手机和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{ @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数组 privateString_titles[];//存放音乐文件的标题数组 privateString_artists[];//存放音乐艺术家的标题数组 privateString[]_path;//存放音乐路径的标题数组 privateString[]_times;//存放总时间的标题数组 privateString[]_album;//存放专辑的标题数组 privateint_sizes[];//存放文件大小的标题数组 privateString[]_displayname;//存放名称的标题数组 @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(){ //用游标查找媒体详细信息 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{ @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>>>();//第一组二级科目数据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.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数组 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播放音乐**/ publicvoidplayMusicII(intposition){ musicpath="/mnt"+_path[position]; try{
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度股权投资合同投资金额及投资期限
- 二零二四年度采购代理合同服务内容详细
- 2024年度电梯安装工程保险服务协议3篇
- 2024年度建筑工程项目风险评估与管理合同
- 二零二四年度软件开发与代工服务合同
- 二零二四年度能源供应合同.风能发电项目合作开发
- 二零二四年度出版发行担保合同
- 店铺转租合同范本
- 二零二四年度软件开发与技术授权合同
- 二零二四年风力发电项目开发合同
- 人教版数学四年级上册-第五单元-平行四边形和梯形-单元测试卷(含答案)
- 警服+春秋执勤服
- 植物学分类哈钦松系统
- 压力容器基本知识课件
- 臭 氧大 自 血 疗 法PPT课件
- 【最新】八年级历史上册 第八单元 近代经济 社会生活与教育文化事业的发展第26课 教育文化事业的发展作业课件 新人教版-新人教版初中八年级上册历史课件
- 《医疗质量管理办法》(2021版全文)
- 工程材料品牌变更申请表(共1页)
- 煤矿铺设轨道质量标准
- 中国摄影家协会会员登记表
- 阿里巴巴与京东的商业模式及竞争优势对比分析——以财务报告为基础会计学专业
评论
0/150
提交评论