生产实习报告题目:音乐播放器学生姓名:张凡学号: 201220220123 班级: 1222201 专业:数字媒体技术指导教师:张金2015年08 月08日目录一、引言 (3)1.1 项目背景 (3)1.2 项目研究的目的 (4)1.3 安卓简介 (4)二.功能分析 (5)2.1 功能需求分析 (5)2.2 系统性能需求 (6)2.3 运行环境需求 (6)三.程序详细设计 (6)3.1 主界面的设计 (6)3.2 播放界面设计 (11)3.3 其他功能 (14)四.调试与运行 (18)4.1 调试 (18)4.2 运行结果 (19)五.总结 (21)一、引言1.1 项目背景当今社会的生活节奏越来越快,人们对手机的要求也越来越高,由于手机市场发展迅速,使得手机操作系统也出现了不同各类,现在的市场上主要有三个手机操作系统,symbian,Windows mobile,以及谷歌的Android操作系统,其中占有开放源代码优势的Android系统有最大的发展前景。
那么能否在手机上拥有自己编写的个性音乐播放器呢?答案是:肯定的,谷歌Android系统就能做到。
本文的音乐播放器就是基于谷歌Android手机平台的播放器。
随着计算机的广泛运用,手机市场的迅速发展,各种音频视频资源也在网上广为流传,这些资源看似平常,但已经渐渐成为人们生活中必不可少的一部分了。
于是各种手机播放器也紧跟着发展起来,但是很多播放器一味追求外观花哨,功能庞大,对用户的手机造成了很多资源浪费,比如CPU,内存等的占用率过高,在用户需要多任务操作时,受到了不小的影响,带来了许多不便,而对于大多数普通用户,许多功能用不上,形同虚设。
针对以上各种弊端,选择了开发多语种的音频视频播放器,将各种性能优化,继承播放器的常用功能,满足一般用户(如听歌,看电影)的需求,除了能播放常见格式的语音视频文件,高级功能:还能播放RMVB格式的视频文件。
此外,还能支持中文、英文等语言界面。
1.2 项目研究的目的1.熟悉一下eclipse工具和安卓的环境配置及开发的过程;2.熟练掌握java的组件如button,textview,listView,menu等组件的灵活应用;3.熟练掌握安卓的一个关于数据保存的方式SQLite3;4.锻炼一下自己遇到问题,然后解决问题的能力。
1.3 安卓简介1.3.1 Android特征1.提供访问硬件的API函数,简化像摄像头、GPS等硬件的访问过程具有自己的运行时和虚拟机2.提供丰富的界面控件供使用者之间调用,加快用户界面的开发速度,保证Android平台上程序界面的一致性3.提供轻量级的进程间通讯机制Intent,使跨进程组件通信和发送系统级广播成为可能4.提供了Service作为无用户界面,长时间后台运行的组件5.支持高效、快速的数据存储方式1.3.2 Android应用程序框架提供Android平台基本的管理功能和组件重用机制:Activity Manager,管理应用程序的生命周期Windows Manager,启动应用程序的窗体Content Provider,共享私有数据,实现跨进程的数据访问Package Manager,管理安装在Android系统内的应用程序Teleghony Manager,管理与拨打和接听电话的相关功能二.功能分析2.1 功能需求分析根据项目的目标,我们可获得项目系统的基本需求,以下从不同角度来描述系统的需求,并且使用用例图来描述,系统的功能需求,我们分成四部分来概括,即播放器的基本控制需要,播放列表管理需求,播放器友好性需求和播放器扩展卡需求。
下面图2-1是音乐播放器的基本用例图,描述了程序的基本功能2.2 系统性能需求根据Android手机系统要求无响应时间为5秒,所以就有如下性能要求:(1)当要求歌曲播放时,程序响应时间最长不能超过5秒(2)当要求歌曲暂停时,程序响应时间最长不能超过5秒(3)当要求歌曲停止时,程序响应时间最长不能超过5秒(4)当要求歌曲上/下一首时,程序响应时间最长不能超过5秒(5)当要求进行清单列表时,程序响应时间最长不能超过5秒2.3 运行环境需求操作系统:Android手机基于Linux操作系统支持环境:Android 1.5 - 4.2.2版本开发环境:Eclipse 3.5 ADT 21三.程序详细设计3.1 主界面的设计●主界面包含本地列表获取、我的收藏、在线音乐及正在播放等各个功能的切换。
首先为我们出现的是音乐列表的获取。
●Android系统提供了MediaScanner,MediaProvider,MediaStore等接口,并且提供了一套数据库表格,通过Content Provider的方式提供给用户。
当手机开机或者有SD卡插拔等事件发生时,系统将会自动扫描SD卡和手机内存上的媒体文件,如audio,video,图片等,将相应的信息放到定义好的数据库表格中。
在这个程序中,我们不需要关心如何去扫描手机中的文件,只要了解如何查询和使用这些信息就可以了。
MediaStore中定义了一系列的数据表格,通过ContentResolver提供的查询接口,我们可以得到各种需要的信息;其主要方法如下:●创建ArrayList<>存储音乐列表;●用Cursor query(Uri uri, String[] projection, Stringselection, String[] selectionArgs, String sortOrder);来获取手机上的音乐;●用MediaStore.Audio.Media.XXX(XXX可以是ALBUM,SIZE,DURATION等信息)来获取音乐相关信息;生成音乐列表。
关键代码:public class MusicList {public static ArrayList<Music> getMusicData(Context context) {ArrayList<Music> musicList = new ArrayList<Music>();ContentResolver cr = context.getContentResolver();if (cr != null) {// 获取所有歌曲Cursor cursor = cr.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null,null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER);if (null == cursor) {return null;}if (cursor.moveToFirst()) {do {Music m = new Music();String title = cursor.getString(cursor .getColumnInd ex(MediaStore.Audio.Media.TITLE));String singer = cursor.getString(cursor.getColumnInd ex(MediaStore.Audio.Media.ARTIST));if ("<unknown>".equals(singer)) {singer = "未知艺术家";}String album = cursor.getString(cursor.getColumnInd ex(MediaStore.Audio.Media.ALBUM));long size = cursor.getLong(cursor.getColumnInd ex(MediaStore.Audio.Media.SIZE));long time = cursor.getLong(cursor.getColumnInd ex(MediaStore.Audio.Media.DURATION));String url = cursor.getString(cursor.getColumnInd ex(MediaStore.Audio.Media.DAT A));String name = cursor.getString(cursor.getColumnInd ex(MediaStore.Audio.Media.DISPLAY_NAME));String sbr = name.substring(name.length() - 3, name.length());if (sbr.equals("mp3")) {m.setTitle(title);m.setSinger(singer);m.setAlbum(album);m.setSize(size);m.setTime(time);m.setUrl(url);m.setName(name);musicList.ad d(m);}} while (cursor.moveToNext());}if (cursor != null) {cursor.close();}}return musicList;}}主界面的模拟器效果图3.2 播放界面设计播放界面是播放器的核心所在,它需要实现播放器的其本功能(播放、暂停、上一曲、下一曲、声音控制、播放方式等)。
首先,我们需要实现其播放/暂停功能。
private void play() {if (mp != null) {mp.start();}flag = 1;} //播放歌曲private void pause() {if (mp != null) {mp.pause();}flag = 1;}//暂停歌曲上/下一曲功能的实现:private void lastOne() {ShowNotifcation();if (_ids.length == 1) {position = position;} else if (position == 0) {position = _ids.length - 1;} else if (position > 0){position--;} //上一曲private void nextOne() {ShowNotifcation();if (_ids.length == 1|| PlayMusicActivity.loop_flag == PlayMusicActivity.LOOP_ONE) {position = position;}else if (PlayMusicActivity.loop_flag == PlayMusicActivity.LOOP_ALL) {if (PlayMusicActivity.random_flag == true) {// 获得随机位置int i = getRandomPostion(true);if (i == -1) {stop();return;} else {position = i;}} else {if (position == _ids.length - 1) {position = 0;} else if (position < _ids.length - 1) {position++;}}} else if (PlayMusicActivity.loop_flag == PlayMusicActivity.LOOP_NONE) {if (PlayMusicActivity.random_flag == true) {//int i = getRandomPostion(false);if (i == -1) {stop();return;} else {position = i;}} else {if (position == _ids.length - 1) {stop();return;} else if (position < _ids.length - 1) {position++;}}} //下一首接着就是声音的控制,声音的控制是通过一根进度条来实现,其主要代码如下:private OnSeekBarChangeListener seekBarChangeListener = new OnSeekBarChangeListener() {@Overridepublic void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) {if (seekBar.getId() == R.id.sb_player_voice) {// 设置音量am.setStreamV olume(AudioManager.STREAM_MUSIC,progress, 0);}}@Overridepublic void onStartTrackingTouch(SeekBar arg0) {}@Overridepublic void onStopTrackingTouch(SeekBar arg0) {}最后,要实现播放方式,主要有两种方式,随即和顺序。