收藏 分享(赏)

基于android音乐播放器的设计.doc

上传人:wo7103235 文档编号:6145785 上传时间:2019-03-30 格式:DOC 页数:33 大小:1.96MB
下载 相关 举报
基于android音乐播放器的设计.doc_第1页
第1页 / 共33页
基于android音乐播放器的设计.doc_第2页
第2页 / 共33页
基于android音乐播放器的设计.doc_第3页
第3页 / 共33页
基于android音乐播放器的设计.doc_第4页
第4页 / 共33页
基于android音乐播放器的设计.doc_第5页
第5页 / 共33页
点击查看更多>>
资源描述

1、湖南工业大学本科毕业设计(论文)1本科毕业设计(论文)资料题目名称 : 基于 android 音乐播放器的设计学院(部) : 计算机与通信学院专业 : 软件工程学生姓名 :班级 : 软件 学号: 指导教师姓名 :职称: 职称:最终评定成绩 :湖南工业大学教务处湖南工业大学本科毕业设计(论文)2本科毕业设计(论文)资料第一部分 毕业论文湖南工业大学本科毕业设计(论文)3本科毕业设计(论文)题目名称 : 基于 android 音乐播放器的设计学院(部) : 计算机与通信学院专业 : 软件工程学生姓名 :班级 : 学号: 指导教师姓名 :职称: 职称:最终评定成绩 :年 月湖南工业大学本科毕业设计(

2、论文)4摘 要本文说明了制作音乐播放器所用的技术,制作流程和功能介绍。Android 是一个开源的系统,它底层是基于 Linux 的操作系统,本论文的音乐播放器采用了 Android 开源系统技术,利用 Java 语言和 Eclipse 编辑工具对播放器进行编写。同时给出了详细的系统设计过程、部分界面图及主要功能运行流程图,本文还对调试过程中遇到的问题和解决方法进行了详细的讨论。通过制作这个软件,我丰富了见闻,接触了曾经没有涉猎的技术领域。同时也系统地复习了 android 和 java 语言,可以说是收获颇丰。该播放器能流畅的播放所有 MP3 文件,操作流畅,使用方便。关键词: 界面; 服务

3、;网络爬虫;数据库;消息机制 湖南工业大学本科毕业设计(论文)5ABSTRACTThis paper illustrates the production technology used in the music player, production processes and functions is introduced.Android is an open source system, its bottom is based on the Linux operating system, this paper music player USES the Android open sourc

4、e system technology, using the Java language and Eclipse editing tools to write player.At the same time gives a detailed system design process, part of the interface diagram and main function operation flow chart, the article also in the process of debugging problems and solving method is discussed

5、in detail.By making this software, I am rich experiences, once contact with no dabble in technical field.Also systematically review the android and the Java language, can be said to be fruitful.The player can smooth play all MP3 files, smooth operation, easy to useKeywords: fragment and activity; se

6、rvice; Jsoup; SqliteDataBase;Handler湖南工业大学本科毕业设计(论文)6目 录第 1 章 引言 .41.1 项目背景 41.2 编写目的 4第 2 章 系统需求分析 .52.1 功能需求 52.1.1 播放器基本控制需求 52.1.2 网络歌曲需求 62.1.2 歌词显示需求 72.2 界面需求 82.3 系统结构图和流程图 .102.4 性能需求 .112.5 运行环境需求 .11第 3 章 Android 项目介绍 123.1 什么是 Android? .123.2 Android 工程目录结构 13第 4 章 播放器系统功能详细设计 .154.1 播放音

7、乐与模式 .154.2 收藏音乐 .174.3 音乐切换时界面状态改变 .194.4 网络歌曲下载 .194.5 歌词滚动显示 .21结 论 .22致 谢 .28附 录 .29湖南工业大学本科毕业设计(论文)7第 1 章 引言Android 开发是当今两大手机开发之一,另一个便是 IOS 系统。它的优势在于广泛的用户量,开发门槛较低。而苹果系统虽然运行流畅,它有垃圾处理机制,使手机运行十几个软件都不卡;但相对开发较难,而且开发环境配置要求高,不便于平民开发。更主要是 Android 优点在于开放性,能接受海量的应用程序,包括一些个人自创程序软件,所以安卓的软件会比较丰富,而这点也正是 IOS

8、特点所缺少并且坚持的,只接受承认应用程序,并且非免费程序很多。1.1 项目背景在广大安卓手机用户的前提下,java 走 android 路线也像 web 路线有很好的前途,个人立志在 java 领域能熟悉有关 java 的所有技术,然后择其一发展。此次毕业设计是一个基于 android 在线音乐播放器,主要用于综合 android 技术,熟练使用各种组件,以及一个完整 android 项目所碰到的难题。随着社会迅速的发展,人们有忙不完的工作,如何在忙碌中享受生活,智能手机的普遍使得听音乐成为了一个不错的舒缓选择;在这样的背景下我制做了一款集本地和在线播放,下载和歌词显示以及播放模式于一体的基于

9、 android 系统的音乐播放器。同时也锻炼了自己的专业技能,对大学四年也有一个圆满的答卷。1.2 编写目的作为一个毕业设计,我觉得应该把我们学过的专业知识总结出来,应用在项目中,我的 android 音乐播放器就是 java 和 android 这一块最好的总结,它使用 eclipse adt编写 java 和 android 代码及其布局文件实现界面与数据的交互,通过观察者设计模式制作手机软件,不仅达到了锻炼自己专业技术能力的目的,而且巩固了大学课程的知识。丰富了我们见闻,也为以后找工作打下坚实的基础。湖南工业大学本科毕业设计(论文)8第 2 章 系统需求分析2.1 功能需求2.1.1

10、播放器基本控制需求用例图表示如下:图 2.1.1 播放器基本控制功能用例图 用例名称:播放;参与者:用户;目标:播放选中列表的歌曲;前置条件:播放器正在运行;基本事件流:点击“播放”按钮实现当前歌曲的播放。用例名称:暂停;参与者:用户;目标:暂停当前播放的歌曲;前置条件:播放器正在运行且正在播放;基本事件流:点击“暂停”按钮实现暂停歌曲。用例名称:上一首;参与者:用户;目标:跳转播放当前歌曲的上一首歌曲;前置条件:正在播放或暂停;基本事件流:点击“上一首”按钮实现上一首歌曲的播放。湖南工业大学本科毕业设计(论文)9用例名称:下一首;参与者:用户;目标:跳转播放当前歌曲的下一首歌曲;前置条件:正

11、在播放或暂停;基本事件流:点击“下一首”按钮实现下一首歌曲的播放。2.1.2 网络歌曲需求用例图表示如下:图 2.1.2 网络请求用例图用例名称:歌曲下载;参与者:用户;目标:在线类别选中的歌曲;前置条件:播放器正在运行;基本事件流:点击“下载”按钮实现对应选中歌曲的下载。用例名称:在线播放;参与者:用户;目标:播放在线列表选中的歌曲;前置条件:播放器正在运行;基本事件流:点击“列表中的 Item”播放选中的在线歌曲。用例名称:网上搜索;参与者:用户;目标:跳转到搜索结果显示列表;前置条件:播放器正在运行;基本事件流:输入搜索关键字点击“搜索”按钮返回网路音乐查询结果。湖南工业大学本科毕业设计

12、(论文)102.1.2 歌词显示需求用例图表示如下:图 2.1.2 歌词显示用例图用例名称:歌词滚动显示;参与者:播放器系统;目标:当前播放歌词的滚动显示;前置条件:歌曲正在播放;基本事件流:点击“播放”按钮后选中“正在播放”的 tab页。用例名称:状态量改变;参与者:播放器系统;目标:切换列表的歌曲在播放页面改变状态栏;前置条件:播放器正在运行;基本事件流:切换歌曲时播放页面的状态图标改变。用例名称:播放进度显示;参与者:播放器系统;目标:实时播放进度更新;湖南工业大学本科毕业设计(论文)11前置条件:歌曲正在播放;基本事件流:切换到“正在播放”tab 页的歌曲进度条实时变化。2.2 界面需

13、求一个软件除了功能外,优秀的 UI 界面影响着用户的使用体验。是一个能改变用户看法,增加用户数量的主要因素。这里就要我们熟练的使用 Android 的各种组件和界面控件,尤其是布局方式:线性布局,相对布局,帧布局,绝对布局;而线性布局又分为表格布局,网格布局等;它们的正确使用既能帮助我们日后美化界面,又能使整个软件看起来工整无暇。我的界面做得一般,不够华丽但也很清新,这个音乐播放器包括五大界面,收藏界面,播放界面,列表界面,在线音乐界面,下载界面;采用统一的颜色格调,操作流畅,代码结构严谨,可读性强。操作也很简便,是一款适用于休闲的音乐播放软件。界面截图如下:湖南工业大学本科毕业设计(论文)1

14、2这里展示了播放界面,网络界面,本地列表界面和收藏界面。其他还有长按歌曲弹出删除分享菜单和登陆注册,实现分享到微信,qq,微博的功能,以及根据储存路径删除音乐文件和根据 id 删除 mediastore 的歌曲记录。登陆注册是一个自定义的 alertdialog 弹出框,写入 sqlitedatabase 进行验证判断湖南工业大学本科毕业设计(论文)132.3 系统结构图和流程图程序开始进入欢迎界面本地列表界面是否显示全部音乐?播放列表是否点击播放列表选项?音乐播放程序结束播放界面网络歌曲界面是否点击暂停/播放暂停/播放状态不变是否选中歌曲?是否下载?下载并进入下载界面是否点击下一首/上一首播

15、放下一首/上一首湖南工业大学本科毕业设计(论文)142.4 性能需求性能方面我做了如下优化:1、java 类的归并,归并冗长的重复的代码。2、在对 sqlite 数据库做了查询优化。3、下次进入播放器依旧保存着上次的设置和播放位置,状态量保存完好。4、采用观察者设计模式,优化了代码结构。2.5 运行环境需求开发工具:Android SDK,eclipse adt22运行环境:在 windows7,jdk1.6 和 android 环境下使用 eclipse 编写代码在 adv4.4 和 android 测试真机上调试运行湖南工业大学本科毕业设计(论文)15第 3 章 Android 项目介绍3

16、.1 什么是 Android?1、什么是 Android?这个问题从不同的角度来说有不同的答案!在普通用户眼中,它是一个智能手机操作系统,拥有很多功能。在 android 程序员眼中,它就是一个程序运行环境,许多功能都需要编写然后再添加到系统中实现运行。它也是一个开源的框架,任何人都可以自己给他添加代码,改变样式和功能。官方介绍:Android 是一种基于 Linux 的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由 Google 公司和开放手机联盟领导及开发。2、Android 系统的四大组件(1)Activity:提供可视化用户界面,一个 android 程序通常

17、由多个 Activity 组成,它有自己的生命周期,由 Android 系统控制。(2)Service:运行在后台的一种服务程序,它很少和用户交互,因此没有可视化界面,定义一个 Service 很容易,只需继承 Service 类实现其生命周期中的方法;它必须在清单文件中注册才能使用。(3)BroadcastReceiver:顾名思义广播接收器,它和事件处理机制类似,只不过事件处理机制是程序组件级别的(例如,某个按钮的单击事件),而广播事件处理机制是系统级别的。到目前为止我们可以使用 Intent 来启动一个程序组件,我们还可以通过使用 sendBroadcast()方法来发起一个系统级别的事

18、件广播来传递消息。我们可以在你的应用程序中实现 Broadcast Receiver 来监听和响应这些广播的 Intent。(4)ContentProvider:用来保存和检索数据,并且使应用程序之间相互访问数据成为可能。它是跨应用程序共享数据的唯一方法。湖南工业大学本科毕业设计(论文)16Android 系统有如下的几大特性: 应用程序框架 支持组件的重用与替换 Dalvik 虚拟机 专门为移动设备做了优化 内部集成浏览器 该浏览器基于开源的 WebKit 引擎 优化的图形库 包括 2D 和 3D 图形库,3D 图形库基于 OpenGL ES SQLite 用作结构化的数据存储 多媒体支持

19、包括常见的音频、视频和静态印象文件格式 GSM 电话,蓝牙 Bluetooth,EDGE,3G and WiFi,照相机,GPS,指南针,和加速度计丰富的开发环境 包括设备模拟器,调试工具,内存及性能分析图表,和 Eclipse 集成开发环境插件3.2 Android 工程目录结构如图:湖南工业大学本科毕业设计(论文)17下面我来详细介绍一下它的每一个目录的作用res 目录主要是用来存放 android 项目的各种资源文件,res 就是 resource 单词的缩写。该目录几乎存放了 android 应用所用的全部资 源,包括:图片资源、字符串资源、颜色资源、尺寸资源,以及布局文件等。不同的文

20、件存放在不同的目录当中,在 res 目录下面又有下一级目录:1、layout 目录主要是存放布局文件,比如主界面布局文件 main.xml 就在这里面。我们可以在页面中加入各种界面显示的控件。2、menu 目录主要是存放菜单文件,现在在 android 开发中使用菜单不是很频繁,比如手机很多软件在点击菜单按钮是弹出来的对话框的布局就是放在这个目录当中。3、valus 目录主要是存放一些数值,比如字符串资源存放在 strings.xml 中,color.xml 可以被定义成存储颜色的代码文件;style.xml 主题样式;dimens.xml 存尺寸元素。4、drawable 目录都是用来存放图

21、片元素的,可根据图片的大小像素决定存储位置。assets 目录主要存放二进制资源文件或网页等等,如音乐,影视,html 文件等等。src 目录主要存放 java 源代码,我们一般把不同类别的 java 文件分开包装,增强可读性。gen 目录android 工程自动生成的文件,如 R.java 文件bin 目录自动生成的二进制文件和编译后生成的文件libs 目录存放引用的 java 第三方 jar 包AndroidManifest.xml 文件Android 工程的配置清单文件,也是整个 android 应用的全局描述文件。清单文件说明了 android 应用的名称、所使用的图标以及包含的组件等

22、,主要包括:1、应用程序的包名,该包名将会作为该 android 应用的唯一标识。2、应用程序包含的组件,如 activity、server、broadcastreceier、contentprovider 等,这个就告诉我们在新建一个类继承这些组件时,我们要在清单文件中进行注册一下,否则应用程序在执行时会报错,无法找到相应的类。3、应用程序兼容的最低版本。4、应用程序使用系统所要获取的权限,比如你要向 sd 卡中写入文件就要加入:湖南工业大学本科毕业设计(论文)18第 4 章 播放器系统功能详细设计4.1 播放音乐与模式播放音乐是主要功能,它通过四大组件之一的 service 来实现的,这样

23、做的好处就是退出界面,音乐可以后台播放,因此我们需要建立一个 PlayService.java 用来播放服务的类。在服务类中我们调用系统的媒体播放器 android.media.MediaPlayer,在播放服务类的 onCreate()方法中实例化 mediaPlayer=new MediaPlayer()。然后调用它的播放,暂停,获取当前播放位置等等内置方法并加以封装修改更好的实现功能。播放模式就简单了,只需自己设置几个播放模式常量,在调用播放方法时判断一下当前模式,在分别调用就行了,具体实现代码中有。下面是 MediaPlayer 的相关方法:湖南工业大学本科毕业设计(论文)19播放模式

24、private Random random=new Random();Overridepublic void onCompletion(MediaPlayer arg0) switch (play_mode) case ORDER_PLAY:next();/顺序播放break;case RANDOM_PLAY:play(random.nextInt(mp3Infos.size();/随机播放break;case SINGLE_PLAY:湖南工业大学本科毕业设计(论文)20play(currentPosition);/单曲循环default:break;由以上代码可知 android 服务的调用

25、流程,先绑定 onbind()后调用,以下为绑定服务的流程:还可以 startservice()。4.2 收藏音乐收藏音乐看起来很高端,其实无非是把点击收藏的音乐写入 sqlite 数据库,当我们点击收藏的“心形”图标时,会执行对新建的 lovemusic.db 的插入数据操作,跳转收藏页面在调用查询所有收藏歌曲的操作,判断“心形”图标的背景颜色是否为已收藏的显示的颜色,然后再次点击会执行删除当前歌曲的收藏操作。SqliteDataBase 代表一个数据库对象,它的一些方法展示如下:湖南工业大学本科毕业设计(论文)21public class DBhelper extends SQLiteOp

26、enHelperpublic DBhelper(Context context, String name, CursorFactory factory,int version) super(context, “lovemusic.db“, null, 5);Overridepublic void onCreate(SQLiteDatabase db) db.execSQL(“create table mymusic(id integer primary key autoincrement,“+“title varchar(20),“+“mp3infoID varchar(20)“);PlayA

27、ctivity.java 部分代码case R.id.love_music:if(query(playService.getCurrentPosition()delete(playService.getCurrentPosition();img_love.setImageResource(R.drawable.nokeep);Toast.makeText(this, “取消收藏“,1).show();elseadd(playService.getCurrentPosition(), mp3Infos.get(playService.getCurrentPosition().getTitle()

28、;img_love.setImageResource(R.drawable.keep);Toast.makeText(this, “添加收藏“,1).show();private void add(int mp3id,String mp3name) SQLiteDatabase db=helper.getWritableDatabase();ContentValues values=new ContentValues();values.put(“mp3infoID“, mp3id+“);values.put(“title“, mp3name);db.insert(“mymusic“, null

29、, values);private void delete(int mp3id) SQLiteDatabase db=helper.getWritableDatabase();db.delete(“mymusic“, “mp3infoID=?“, new Stringmp3id+“);db.close();private boolean query(int mp3id) SQLiteDatabase db=helper.getWritableDatabase();Cursor cursor=db.rawQuery(“select * from mymusic where mp3infoID=?

30、“,new Stringmp3id+“);boolean result=cursor.moveToNext();湖南工业大学本科毕业设计(论文)22cursor.close();db.close();return result;4.3 音乐切换时界面状态改变状态改变需要调用 PlayService 的更新状态接口 interface MusicUpdateListener 中的onChange()方法,这个接口在基类 BaseActivity 中实现,而 PlayActivity 继承了这个基类,实际上所有的界面 Activity 都继承了这个基类用于绑定服务等,所以在 PlayActivit

31、y 实现了 onChange()方法。在 onChange()把所有状态属性的量一一根据当前播放的 position进行更改,实现了对 service 的监听。public void change(int position) /状态性变量改变Mp3Info mp3Info=mp3Infos.get(position);setLrcView();title.setText(mp3Info.getTitle();end_time.setText(MediaUtils.formatTime(mp3Info.getDuration();if(query(playService.getCurrentPo

32、sition()img_love.setImageResource(R.drawable.keep);else img_love.setImageResource(R.drawable.nokeep);Bitmap bm=MediaUtils.getArtwork(this,mp3Info.getId(), mp3Info.getAlbumId(), true, false);img_lyric.setImageBitmap(bm);seekBar.setProgress(0);seekBar.setMax(int) mp3Info.getDuration();if(playService.i

33、splaying()img_play.setImageResource(R.drawable.pause);else img_play.setImageResource(R.drawable.begin);switch (playService.getPlay_mode() case PlayService.ORDER_PLAY:menu.setImageResource(R.drawable.menu);menu.setTag(PlayService.ORDER_PLAY);break;case PlayService.RANDOM_PLAY:menu.setImageResource(R.

34、drawable.shuffl);menu.setTag(PlayService.RANDOM_PLAY);break;case PlayService.SINGLE_PLAY:menu.setImageResource(R.drawable.repeat);menu.setTag(PlayService.SINGLE_PLAY);default:break;4.4 网络歌曲下载本次软件设计采用的是百度上的音乐,其实一般情况是自己在做播放器的基础之上再做一个音乐后台,用来作为网络请求。而我觉得自己做个后台然后发出请求,这样有弊端,如音乐不全面等,我这里是利用网络爬虫 Jsoup 对百度音乐湖南

35、工业大学本科毕业设计(论文)23(http:/ ID,歌名,歌手和专辑实现 listview 的显示布局及其通过歌曲 ID 和歌曲 URL 下载音乐。使用 Handler 机制实现方法的跳转调用具体实现代码如下:mp3url=“http:/ void downloadMusic(final SearchResult searchResult,final String url,final Handler handler) mThreadPool.execute(new Runnable() Overridepublic void run() File musicDirFile=new File(

36、Environment.getExternalStorageDirectory()+Contant.DIR_MUSIC);if(!musicDirFile.exists()musicDirFile.mkdirs();String mp3url=url;System.out.println(“mp3url:“+mp3url);String target=musicDirFile+“/“+searchResult.getMusicname()+“.mp3“;File filetarget=new File(target);if(filetarget.exists()handler.obtainMe

37、ssage(MUSIC_EXISTS).sendToTarget();return;else try URL url=new URL(mp3url);HttpURLConnection connection=(HttpURLConnection)url.openConnection();InputStream inputStream=connection.getInputStream();FileOutputStream fileOutputStream=new FileOutputStream(filetarget);byte b=new byte1024;int j=0;while(j=i

38、nputStream.read(b)!=-1)fileOutputStream.write(b, 0, j);fileOutputStream.flush();fileOutputStream.close();handler.obtainMessage(SUCCESS_MP3,target).sendToTarget(); catch (Exception e) e.printStackTrace();handler.obtainMessage(SUCCESS_MP3).sendToTarget(););湖南工业大学本科毕业设计(论文)24既然说到了网页爬虫 jsoup,我还使用了它调用百度音

39、乐的搜索引擎来获取百度音乐的热歌榜和按输入的关键字进行搜索;SearchUtil 的主要部分代码:/Jsoup 请求网络数据private ArrayList getMusicList(final String key,final int page)final String start=String.valueOf(page-1)*SIZE);Document doc=Jsoup.connect(URL).data(“key“,key,“start“,start,“size“,String.valueOf(SIZE).userAgent(Contant.USER_AGENT).timeout(

40、60*1000).get();Elements songTitles=doc.select(“div.song-item.clearfix“);Elements songInfos;ArrayListsearchResults=new ArrayList();TAG:for(Element song:songTitles)songInfos=song.getElementsByTag(“a“);SearchResult searchResult=new SearchResult();for(Element info:songInfos)/歌曲链接if(info.attr(“href“).sta

41、rtsWith(“/song“)searchResult.setMusicname(info.text();searchResult.setUrl(info.attr(“href“);searchResult.setMusicId(info.attr(“href“).substring(info.attr(“href“).lastIndexOf(“/“)+1);System.out.println(info.attr(“href“).substring(info.attr(“href“).lastIndexOf(“/“)+1);/歌手链接if(info.attr(“href“).startsW

42、ith(“/data“)searchResult.setArtist(info.text();/专辑链接if(info.attr(“href“).startsWith(“/album“)searchResult.setAlbum(info.text().replaceAll(“,“);searchResults.add(searchResult);return searchResults; 4.5 歌词滚动显示歌词滚动显示主要原理就是一个滚动的 TextView 控件,先通过路径和歌名读取歌词文件,写入流,然后解析歌词格式,把歌词前的时间作为播放某一句的时间,然后把当前的播放的那行设为高亮等等

43、,部分代码如下:LyricView.java/ 绘图歌词湖南工业大学本科毕业设计(论文)25onDraw(Canvas canvas) super.onDraw(canvas);currentPaint.setColor(Color.YELLOW);notCurrentPaint.setColor(Color.WHITE);currentPaint.setTextSize(TEXT_SIZE); / 设置字体大小currentPaint.setTypeface(Typeface.SERIF); / 设置字体样式notCurrentPaint.setTextSize(textSize);notC

44、urrentPaint.setTypeface(Typeface.DEFAULT);setText(“);canvas.drawText(mLrcList.get(index).getLrcStr(), width / 2,height / 2, currentPaint);float tempY = height / 2;/ 画出本句之前句for (int i = index - 1; i = 0; i-) / 向上推移tempY = tempY - textHeight;canvas.drawText(mLrcList.get(i).getLrcStr(), width / 2, temp

45、Y,notCurrentPaint);tempY = height / 2;/ 画出本句之后的句子for (int i = index + 1; i mLrcList.size(); i+) / 往下推移tempY = tempY + textHeight;canvas.drawText(mLrcList.get(i).getLrcStr(), width / 2, tempY,notCurrentPaint);处理歌词的方法:parseLrc(InputStream inputStream) /解析歌词时间timeStr(String timeStr) LyricContent.java(用

46、来存放歌词的实体类 )歌词部分我借鉴了网上的一些资料,其实在 github 网上有这样歌词的 demo,我下载下来仿照制作了自己的歌词显示,由于我使用 eclipse adt 开发工具无法像 android studio 那样直接引入三方插件为自己所用,只能自己看资料理解它的类的使用。湖南工业大学本科毕业设计(论文)26结 论通过本次毕业设计,让我对 java 基础知识进行了巩固和提升,对 android 体系有了更加深刻的认识,对程序设计模式和面向对象编程思想了解得更加透彻。下面来说说我制作这个应用的历程和心得吧!历程:(1) 的确,做这个东西花费了我一个寒假的时间,起初只是实现了基本的播放

47、和下一首的功能,这些书上就有介绍,界面没有美化,光秃秃的几个按钮,歌曲的路径还得自己写,慢慢的我找到了 mediaplayer 这个自带的 android 媒体库,可以通过它得到url,这让我又方便了许多,起码没必要自己输入歌曲路径了。启动 Service 一个Service 有两种方法:一种是 startService (Intent);另外一种是:bindService (Intent);第一种启动方式,适用于 Service 独立完成任务,例如说一个下载,如果不需要暂停或者取消的话,可以这样来做。但是,我们这是音乐播放应用,把 MediaPlayer 放在Service 中执行播放,这样

48、的方式很难有暂停等交互。(其实也可以这样做,例如每次交互操作都用 startService 来做,通过 Intent 把暂停等命令出入进去,进度条也可以通过广播来发送出去,但是这样做,感觉很丑陋,肯定不是常规的高效做法);第二种启动方式,可以在 onServiceConnected 中,获得一个 Service 对象(可能不是一个Service 对象,至少是一个可以接触 Service 内部操作的句柄)。这样,便可以轻松操作播放和接收进度通知。但是这种方式有弊端,一旦与之绑定的 context 退出,则绑定接触,Service 也会被回收(但是不会执行 onDestory 方法);那么是不是就只是简单用第二种启动方式?当然不是这样,这两种方式并不冲突,而且十分适用于音乐播放类的应用。(2) 接着,我使用了 listview 实现了歌曲列表,这个比较简单,以前学过也使用过;然而在 tab 布局时发生了奇怪的事情,TabActivity 不能像往常一样调用 PlayService 服务,我找了很多地方,由于我开始并不知道是 TabActivity 的问题以为是 PlayService 在绑定服务时 ServiceConnection 连不上,后来才一步步排除这些可能,应该是 TabActivity的问题,在一个微博上看到一个人的解说,它与普通的 Activity 有所不同:bin

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 学术论文 > 毕业论文

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报