Anjoyo音乐播放器需求规格说明书_v10 -.docx_第1页
Anjoyo音乐播放器需求规格说明书_v10 -.docx_第2页
Anjoyo音乐播放器需求规格说明书_v10 -.docx_第3页
Anjoyo音乐播放器需求规格说明书_v10 -.docx_第4页
Anjoyo音乐播放器需求规格说明书_v10 -.docx_第5页
免费预览已结束,剩余36页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

安卓越科技(北京)有限公司Android教学项目安卓越科技专有信息声明:本文档中所有信息均为安卓越公司机密,未经版权限定及安卓越公司明确的书面许可,任何公司,组织和个人不得为任何目的、以任何手段或形式对本文档的任何部分或全部进行复制,存储,引入检索系统或传播。虽然安卓越公司已经尽最大努力使本文档内容正确有效,但仍然可能有某些技术方面不够准确或存在印刷错误。这些信息将会被不定期的更新,更新的内容将包含在本文档的未来版本中。ANJOYO2103-02-08作者: 莫修川安卓越Android教学项目音乐播放器项目目 录1 引言41.1 编写目的41.2 项目概述42 需求概述42.1 系统目标42.2 系统规模42.3 系统功能模块图52.4 项目结构及类解释63 业务需求73.1 兼容性73.2 页面UI设计相关73.2.1欢迎引导页面7主要功能思想7主要功能代码实现83.2.2主界面主要UI设计9XML文件的使用9主要功能代码的实现103.3 本地歌曲173.3.1本地音乐扫描183.3.2本地音乐查询并绑定193.3.3点击播放并更新通知栏203.3.4歌曲-歌词详细页面223.3.5收藏233.3.6我喜欢243.3.7设为铃声(来电铃声)253.3.8删除263.3.9多选273.4 网络歌曲283.4.1数据库283.4.2WebService293.4.3客户端访问Web服务303.4.4解析Json313.4.5分页加载数据323.4.6异步加载图片333.4.7在线操作333.4.8下载343.5 更多功能353.5.1清空我喜欢和收藏353.5.2睡眠定时383.5.3意见反馈403.5.4其它411 引言1.1 编写目的本说明书的编写目的是为了帮助安卓越学员更好的完成第三阶段的项目任务,说明书包括系统的业务需求、功能需求、运行环境、数据需求、界面需求、外部接口等以及非功能性需求及其它约束,供用户、产品/项目管理人员作为系统验收的依据;供系统设计人员、实现人员、测试人员作为设计和开发、测试的依据。1.2 项目概述项目名称: 音乐播放器项目的用户:安卓越学员 项目内容: 提供音乐播放器的建设解决方案。2 需求概述2.1 系统目标 系统的总体定位应是为安卓越学员提供项目分析及解决思路,帮助学员理清思路、巩固技能点,顺利完成本系统的综合应用。2.2 系统规模系统应包括一套基于本地音乐操作模块,网络音乐操作模块。从而实现系统从android平台到服务器端实现良好的交互能力。2.3 系统功能模块图2.4 项目结构及类解释包-类名称解释anjoyo.yl.mp3player项目窗体包ChoiseAll多选窗体CustomProgressDialog自定义DialogDoSaoMiaoActivity正在扫描媒体文件窗体FankuiActivity意见反馈窗体LocalMusicActivity进入扫描媒体文件的窗体MainActivity播放器选项卡窗体MainPlayActivity本地音乐的主播放页面MainPlayNetMusicActivity网络音乐的主播放页面PopMenuPopWindows类ShowLocalMusicActivity本地歌曲的展示页面ShowNetMusicActivity网络歌曲的展示页面TabOneActivity选项卡窗体中第一个窗体(本地音乐)TabTwoActivity选项卡窗体中第二个窗体(网络音乐)TabThreeActivity选项卡窗体中第三个窗体(更多设置)anjoyo.android.appfianl项目常量类包AppFinal常量类anjoyo.android.ADapter适配器包DuoXuanAddapter多选窗体中ListView的自定义适配器MyAdapter歌曲展窗体中ListView的适配器MyViewPagerAdapter主播放页面的ViewPager的适配器anjoyo.android.down下载功能包DownLoad下载功能帮助类anjoyo.android.downservice下载歌曲歌词的包DownService下载服务anjoyo.zhang.lyc歌词解析包LycContent实体类LycRead解析逻辑类LyricView自定义TextView画歌词anjoyo.android.model歌曲实体类包MusciModel本地歌曲信息anjoyo.android.IOFile文件操作工具类包IoFileDemo文件操作类anjoyo.android.MediaPlayDemoMedia对象操作包MyMediaMedia操作类anjoyo.android.SqliteSqlite包MySqlite管理Sqlite的类anjoyo.android.ws连接WebService的包MusicWs连接ws的帮助类3 业务需求3.1 兼容性系统支持2.2及2.2以上的AndroidOS,分辨率兼容240*320、320*480、480*800、800*1280。3.2 页面UI设计相关a) UI本系统以酷狗播放器为原型。b) 数据网络数据以Sqlserver、WebService、Tomcat模拟音乐数据。3.2.1 欢迎引导页面主要功能思想在我们登录酷狗音乐播放器是会听到一段“Hello 酷狗”的声音和登陆界面,那我们是如何实现的呢。我们做了一个定时器,在登录过程中显示这个页面,过了几秒后自动销毁这个页面。当然登录过程中调用了MediaPlayer对象播放.Mp3文件。主要功能代码实现3.2.2 主界面主要UI设计在酷狗的主界面UI设计中我们用到了FrameLayout布局和自定义的HorizontalScrollView和带标题的ListViewXML文件的使用主要功能代码的实现主要重写HorizontalScrollView的方法在主Activity的代码实现带标题的ListView 实现。主要就是把传入的List集合数据进行处理。对不同的数据生成不同的视图。这些操作我放到了自定义适配器里。代码实现数据排序方法3.3 本地歌曲 3.3.1 本地音乐扫描Android系统在SD卡插入后,MediaScanner服务会在后台自动扫描SD上的文件资源,将SD上的音乐媒体信息加入到MediaStore数据库中。程序可以直接从MediaStore中读取相应的媒体信息。通过注册监听MediaScanner广播的Intent,可以获知MediaScanner服务是否在进行后台的扫描工作:Intent.ACTION_MEDIA_SCANNER_STARTED 表示MeidaScanner开始扫描;Intent.ACTION_MEDIA_SCANNER_FINISHED 表示MediaScanner扫描结束;当程序从网络下载媒体文件到终端后,MediaScanner服务并不会自动扫描刚刚下载的文件,需要程序主动去扫描这些新添加的媒体文件信息到MediaStore数据库中。扫描代码如下:/* * 扫描歌曲的方法 */private void scansCard() IntentFilter intentFilter = new IntentFilter(Intent.ACTION_MEDIA_SCANNER_STARTED);intentFilter.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED);intentFilter.addDataScheme(file);scanReceiver = new ScanSdFilesReceiver();registerReceiver(scanReceiver, intentFilter);sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,Uri.parse(file:/ + Environment.getExternalStorageDirectory();/* * 扫描歌曲需要的ScanSdFilesReceiver类。 */private class ScanSdFilesReceiver extends BroadcastReceiver Overridepublic void onReceive(Context context, Intent intent) / TODO Auto-generated method stubString action = intent.getAction();if (Intent.ACTION_MEDIA_SCANNER_STARTED.equals(action) scaHandler.sendEmptyMessage(0);if (Intent.ACTION_MEDIA_SCANNER_FINISHED.equals(action) scaHandler.sendEmptyMessage(1);3.3.2 本地音乐查询并绑定/* * 查询信息展示出来 */private void DoShowListView() listData = new ArrayList();if(Where = 0)ContentResolver res = getContentResolver();Cursor c = res.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null,null, null, null);while(c.moveToNext()MusciModel model = new MusciModel();model.setMusic_Id(c.getString(c.getColumnIndex(BaseColumns._ID);model.setMusic_Name(c.getString(c.getColumnIndex(MediaColumns.TITLE);model.setMusic_Artist(c.getString(c.getColumnIndex(AudioColumns.ARTIST);model.setMusic_Path(c.getString(c.getColumnIndex(MediaColumns.DATA);model.setMp3Size(c.getString(c.getColumnIndex(MediaColumns.SIZE);listData.add(model);c.close();else if(Where = 1)listData = AppFinal.LoveData;else if(Where = 2)listData = AppFinal.SaveData;else if(Where = 4)listData = AppFinal.ZuijinData;adapter = new MyAdapter(this,listData,1);ShowLocalMusic_lv1.setAdapter(adapter);绑定ListView使用的自定义适配器,这里就不在贴出代码。3.3.3 点击播放并更新通知栏/* * 列表短按播放监听事件 */Overridepublic void onItemClick(AdapterView arg0, View arg1, int arg2, long arg3) if (Music_Index != arg2) /Music_Index = arg2;Music_Index = arg2;MyMedia.DoPlay(listData.get(arg2).getMusic_Path();isPlay = true;LocalMusic_ImgBtn_Play.setImageDrawable(getResources().getDrawable(R.drawable.pause_button_default);/刷新适配器,也就是调用getView方法adapter.notifyDataSetChanged(); else if (Music_Index = arg2) if (isPlay) MyMedia.DoPause();isPlay = false;LocalMusic_ImgBtn_Play.setImageDrawable(getResources().getDrawable(R.drawable.play_button_default); else MyMedia.DoContinuePlay();isPlay = true;LocalMusic_ImgBtn_Play.setImageDrawable(getResources().getDrawable(R.drawable.pause_button_default);/* * 消息通知函数 */private void myNotification() ss = (String) musicData.get(index).getMusicName();m_Notification.icon = R.drawable.linecontrol;/ 当我们点击通知时显示的内容/ m_Notification.tickerText = Button1通知内容.;/ 通知时发出默认的声音m_Notification.defaults = Notification.DEFAULT_SOUND;/ 设置通知显示的参数m_Notification.setLatestEventInfo(ListViewActivity.this, 听你来唱, ss,m_PendingIntent);/ 可以理解为执行这个通知m_NotificationManager.notify(0, m_Notification);3.3.4 歌曲-歌词详细页面 歌词解析功能主要使用复写TextView类重写onDraw函数,在子线程中通过时间戳来更新UI。3.3.5 收藏 /* * 收藏 */private void BtnTag1() MySqlite sqlite = new MySqlite(context);SQLiteDatabase db = sqlite.getWritableDatabase();Cursor cu = db.rawQuery(Select * from SaveMusic, null);int i = 0;while(cu.moveToNext()if(!cu.getString(cu.getColumnIndex(Name).equals(listData.get(id).getMusic_Name()i+;System.out.println(cu.getString(cu.getColumnIndex(Name)+);if(i = cu.getCount()/没有相同的ContentValues values = new ContentValues();values.put(Name, listData.get(id).getMusic_Name();values.put(Address, listData.get(id).getMusic_Path();long re = db.insert(SaveMusic, null, values);Toast.makeText(context, 已收藏, Toast.LENGTH_SHORT).show();else/有相同的int re = db.delete(SaveMusic, Name = ? , new String listData.get(id).getMusic_Name();Toast.makeText(context, 已取消收藏, Toast.LENGTH_SHORT).show();cu.close();AppFinal.GetSaveData(context);点击收藏按钮,将这首歌加入Sqlite数据库中,在本地歌曲中的收藏列表中可以看到所有收藏的歌曲,对于已经收藏的歌曲,再次点击会取消收藏,也可以在更多设置中清空收藏列表3.3.6 我喜欢 点击喜欢按钮,将这首歌加入Sqlite数据库中,在本地歌曲中的喜欢列表中可以看到所有标记了喜欢的歌曲,对于已经喜欢的歌曲,再次点击会取消喜欢,也可以在更多设置中清空喜欢列表(实现方式和收藏差不多,这里就不在多展示代码了)3.3.7 设为铃声(来电铃声)/* * 设置-铃声的具体方法 * param path 路径 */ public void setMyRingtone(String path) File sdfile = new File(path); ContentValues values = new ContentValues(); values.put(MediaStore.MediaColumns.DATA, sdfile.getAbsolutePath(); values.put(MediaStore.MediaColumns.TITLE, sdfile.getName(); values.put(MediaStore.MediaColumns.MIME_TYPE, audio/*); values.put(AudioColumns.IS_RINGTONE, true); values.put(AudioColumns.IS_NOTIFICATION, false); values.put(AudioColumns.IS_ALARM, false); values.put(AudioColumns.IS_MUSIC, false); Uri uri = MediaStore.Audio.Media.getContentUriForPath(sdfile.getAbsolutePath(); Uri newUri = context.getContentResolver().insert(uri, values); RingtoneManager.setActualDefaultRingtoneUri(context, RingtoneManager.TYPE_RINGTONE, newUri); Toast.makeText(context,设置来电铃声成功!, Toast.LENGTH_SHORT ).show(); 3.3.8 删除如果不勾选复选框那么仅仅是在展示列表中不展示这首歌,如果勾选了复选框,那么就表示同时删除了手机中的这首歌这个文件3.3.9 多选/* * 删除操作 */private void BtnTag4() Builder builder = new Builder(context);builder.setTitle(删除歌曲);View v = LayoutInflater.from(context).inflate(R.layout.deletemusic, null);builder.setView(v);TextView txt = (TextView) v.findViewById(R.id.DeleteTxt);final CheckBox DeleteChk = (CheckBox)v.findViewById(R.id.DeleteChk);txt.setText(你确定要删除“+listData.get(id).getMusic_Name()+”);builder.setPositiveButton(确定, new DialogInterface.OnClickListener() Overridepublic void onClick(DialogInterface dialog, int which) if(DeleteChk.isChecked()File file = new File(listData.get(id).getMusic_Path();if(file.exists()file.delete();listData.remove(id);MyAdapter.this.notifyDataSetChanged(););builder.setNegativeButton(取消,new DialogInterface.OnClickListener() Overridepublic void onClick(DialogInterface dialog, int which) );builder.show();这里勾选任意首歌曲以后点击下面的稍后播放即表示加入播放列表,点击收藏和删除的话就等同于对多首歌曲进行3.3.5和3.3.8操作。3.4 网络歌曲3.4.1 数据库库名:MusicDB 表名:Music 表结构如下: 3.4.2 WebService使用MyEclipse搭建Web服务,返回Json格式数据给客户端/* * 分页查询 客户端传递 页索引 * 一次返回10条 json格式数据 * param parseIndex * return */public String ShowInfo(int parseIndex) try Statement statement = ConnectionSql.GetCon().createStatement();String sql = select * from (select Row_Number() over (order by id)as rowid,* from music)as t1 where t1.rowid between +(parseIndex*10-(10-1)+ and +(parseIndex*10)+;ResultSet resultSet = statement.executeQuery(sql);StringBuilder sb=new StringBuilder();if (resultSet != null) String res = ;sb.append();while (resultSet.next() sb.append();sb.append(mp3Name:);sb.append(+resultSet.getString(3)+);sb.append(,);sb.append(mp3Artist:);sb.append(+resultSet.getString(4)+);sb.append(,);sb.append(mp3Image:);sb.append(+resultSet.getString(6)+);sb.append(,);sb.append(mp3FileName:);sb.append(+resultSet.getString(7)+);sb.append(,);sb.append(lrcName:);sb.append(+resultSet.getString(9)+);sb.append();sb.append(,);sb.append();System.out.println(sb);String str = new String(sb);return str; catch (Exception e) e.printStackTrace();return null;return null;3.4.3 客户端访问Web服务此项目中使用第三方jar :Ksoap2访问WebService,关键代码:/ 声明WS的命名空间,命名空间在WSDL的显示时间private static final String NAMESPACE = http:/web.music.cy.anjoyo/;/ 设置WS的路径空间private static String SERVICEURL = 1:9999/MusicWS/MusicInfoPort;/* * 和WS建立连接,调用WS里面的函数 */public String GetStudentWS(String methodName,int parameter) / 创建SoapObject对象,并指定WebService的命名空间和调用的方法名SoapObject soapOb = new SoapObject(NAMESPACE, methodName);/ 判断调用的函数是否有参数,如果有参数一次传给WS函数if (parameter != null) for (int i = 0; i parameter.length; i+) soapOb.addProperty(arg + i, parameteri);SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);envelope.bodyOut = soapOb;envelope.dotNet = false;HttpTransportSE ht = new HttpTransportSE(SERVICEURL);try / 请求WSht.call(null, envelope);if (envelope.getResponse() != null) / 获得WS函数返回值信息System.out.println(envelope.getResponse().toString();return envelope.getResponse().toString(); catch (Exception e) e.printStackTrace();System.out.println(e.getMessage();return null;3.4.4 解析Json/* * json解析数据 */public void parJson(String result) try jsonArray = new JSONArray(result);for (int i = 0; i 3.4.4项-3.4.5项循环。 3.4.6 异步加载图片在解析完毕后,需自定义适配器进行ListView绑定,在getView函数中通过AsyncTask来实现ListView每一个Item的图片异步处理。3.4.7 在线操作在线试听、上一首、下一首等操作复用的本地操作等Ui、逻辑等,在这里不再赘述。3.4.8 下载3.5 更多功能3.5.1 清空我喜欢和收藏 我的/* * 清空Dialog * param title Dialog的title * param tabelName 要清空的表名 * param toastmsgDialog的message */private void isClean(String title,final String tabelName,final String toastmsg)Builder bu = new AlertDialog.Builder(this);bu.setTitle(警告!);bu.setMessage(title);bu.setPositiveButton(确定, new DialogInterface.OnClickListener() Overridepublic void onClick(DialogInterface dialog, int which) clean(tabelName,toastmsg););bu.setNegativeButton(取消, new DialogInterface.OnClickListener() Overridepublic void onClick(DialogInterface dialog, int which) );bu.show();/* * 清空 * param tabelName 表名 * param toastmsg Toast的message内容 */private void clean(String tabelName,String toastmsg)MySqlite sqlite = new MySqlite(this);SQLiteDatabase db = sqlite.getReadableDatabase();int cu = db.delete(tabelName, null, null);AppFinal.GetLoveData(this);AppFinal.GetSaveData(this);if(cu 0)Toast.makeText(this, toastmsg, Toast.LENGTH_SHORT).show();db.close();sqlite.close();这里两者的操作也差不多,都是删除Sqlite中对面的表中的数据。3.5.2 睡眠定时这里的实现方式是启动一个线程,然后让这个线程休眠,休眠的时间就是用户对应选择的时间(如果选择的是取消,时间为零),然后休眠结束就关闭整个程序。/* * 设置睡眠定时 */private void DoSleep()Builder build = new AlertDialog.Builder(this);build.setTitle(选择自动退出的时间:);build.setItems(arrStrTime, new DialogInterface.OnClickListener() Overridepublic void onClick(DialogInterface dialog, int which) Time = 0;switch (which) case 0:Time = 5*60*1000;break;case 1:Time = 10*60*1000;break;case 2:Time = 20*60*1000;break;case 3:Time = 30*60*1000;break;case 4:Time = 45*60*1000;break;case

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论