版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
新乡学院计算机与信息工程学院项目实训报告项目名称班级学号姓名指导教师2015年12月29日目录
TOC\o"1-2"\h\z\u第1章概述 1第2章需求分析 22.1项目背景 22.2项目需求 2第3章相关技术 33.1Adnroid平台介绍 33.2关键技术研究 3第4章概要设计 44.1系统体系结构 44.2用户界面设 4第5章详细设计 65.1播放设置以及后台播放源码 65.2获取网络歌曲分类列表的代码实现. 13第6章结论 24PAGE1 -PAGE1-第1章概述本课题要求:设计一个基于Android的手机端音乐播放器软件。实现的功能有:a)能在Android上利用其播放本地和远程的歌曲。b)能通过一个搜索框实现本地和远程的搜索功能.c) 可以实现后台播放,并能流畅的实现多界面的跳转。需重点研究的关键问题:实现播放,后台播放,进度条显示进度等,以及网络请求数据和处理。解决思路:浏览Android开源网站,认证学习,并请教老师,学习相关知识;不过主要还是靠自己的解题思路,解决问题的能力。PAGE5第2章需求分析2.1项目背景移动互联网时代的来临,直接促进了搭载智能操作系统、具有强大扩展性的智能手机、平板电脑等移动终端产业的蓬勃发展。搭载安卓操作系统的智能手机目前已经成为市场上最炙手可热的智能产品。开放的源代码和零成本已经让安卓在全世界范围内受到青睐并迅速获得了主要手机厂商和数百万软件开发者的支持,无疑android已经是智能设别领域的老大.在这个移动互联网飞速发展的时代,带动全球的经济重心向着轻小得移动端发展.人们的衣食住行已经和手机这种设别息息相关,甚至是不可分割的状态.出于这个时代的背景,Android端的娱乐软件更是层出不穷.这些软件丰富了人们的闲暇之余.所以我打算入手一款娱乐软件,为大家揭秘神秘的android软件.该课题的主要设计任务是实现android设备上的音乐播放器功能,属于自己设计的一款软件,轻巧方便,没有广告,内存利用率高,是一款实用而且高端的手机软件。2.2项目需求“i音乐”是一款手机音乐播放器,它通过搜索本地文件,实现本地音乐文件的播放,同时又能获取网络歌曲,简单一句话:麻雀虽小五脏俱全。“i音乐”的主要目的是开发一个可以播放主流的音乐格式,本设计实现主要功能是播放MP3,WAV,OGG等格式的音乐文件,并且控制播放,暂停,停止,音量控制,选择上一曲,选择下一曲,视觉外观,列表文件和歌曲文件的管理操作等多种播放控制,界面简明,操作简单。第3章相关技术3.1Adnroid平台介绍Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发。尚未有统一中文名称,中国大陆地区较多人使用“安卓”或“安致”。Android操作系统最初由AndyRubin开发,主要支持手机。2005年8月由Google收购注资。2007年11月,Google与84家硬件制造商、软件开发商及电信营运商组建开放手机联盟共同研发改良Android系统。随后Google以Apache开源许可证的授权方式,发布了Android的源代码。第一部Android智能手机发布于2008年10月。Android逐渐扩展到平板电脑及其他领域上,如电视、数码相机、游戏机等。2011年第一季度,Android在全球的市场份额首次超过塞班系统,跃居全球第一。2012年11月数据显示,Android占据全球智能手机操作系统市场76%的份额,中国市场占有率为90%。2013年09月24日谷歌开发的操作系统Android在迎来了5岁生日,全世界采用这款系统的设备数量已经达到10亿台。3.2关键技术研究应用SQLLite数据库:SQLite提供结构化的数据存取。SQLite是一款轻型的数据库,它的设计目标是嵌入式的,目前已经在很多嵌入式产品使用了它,它占用的资源非常低。它能够支持Windows/Linux/Unix等主流的操作系统,同时能够跟很多程序语言相结合,比如php,Java等,还有ODBC接口,同样比起Mysql,PostgreSQL来讲,它的处理速度比它们都快。它无需安装和管理配置,它是一个储存在单一磁盘文件中的完整数据库,体积小,虽只有250KB但支持数据库大小至2TB。它虽然很小巧,但是支持的SQL语句毫不逊色于其它开源数据库。同时它还支持事务功能和并发处理等等。SQLite也是一套开放性的关联式资料库,其特点在于轻量性方面的设计结构,更适合在手机上使用。第4章概要设计4.1系统体系结构系统旨在实现音乐播放和控制,主要有如下几个核心功能模块如图5所示。主程序主程序 程序运行,显示各个界面内容.设置退出程序运行,显示各个界面内容.设置退出,彻底退出软件.实现网络请求数据,并显示.实现音频文件的播放功能自动搜索本地音频文件并添加到目录.图5系统功能模块图4.2用户界面设 4.2.1 i音乐图4.2.2显示主界面和菜单栏 4.2.3音乐清单PAGE25-第5章详细设计5.1播放设置以及后台播放源码具体实现代码如下:package.xxu.imusic;importjava.util.ArrayList;importjava.util.List;importbutterknife.Bind;importbutterknife.ButterKnife;importbutterknife.OnClick;import.xxu.imusic.app.MyApp;import.xxu.imusic.constant.Constants;import.xxu.imusic.fragment.PlayFragment;import.xxu.imusic.fragment.PlayListFragment;import.xxu.imusic.utils.CommonUtils;importandroid.content.BroadcastReceiver;importandroid.content.Context;importandroid.content.Intent;importandroid.content.IntentFilter;importandroid.os.Bundle;importandroid.os.Handler;importandroid.os.Message;importandroid.support.v4.app.Fragment;importandroid.support.v4.app.FragmentActivity;importandroid.support.v4.app.FragmentManager;importandroid.support.v4.app.FragmentPagerAdapter;importandroid.support.v4.view.ViewPager;importandroid.support.v4.view.ViewPager.OnPageChangeListener;importandroid.util.Log;importandroid.view.View;importandroid.view.Window;importandroid.view.View.OnClickListener;importandroid.widget.ImageView;importandroid.widget.RelativeLayout;importandroid.widget.SeekBar;importandroid.widget.Toast;importandroid.widget.SeekBar.OnSeekBarChangeListener;publicclassPlayActivityextendsFragmentActivity{ @Bind(R.id.vp_play_pages) ViewPagerviewPager; privateFragmentPagerAdapteradapter; privateList<Fragment>fragments; @Bind(R.id.header_play_activity_title) RelativeLayoutrlHeader; @Bind(R.id.iv_fragment_play_next) ImageViewivNext; @Bind(R.id.iv_fragment_play_pauseOrplay) ImageViewivPlayOrPause; @Bind(R.id.iv_fragment_play_previous) ImageViewivPrevious; @Bind(R.id.pb_fragment_play_progress) SeekBarpbProgress; MyAppapp; privatestaticfinalintCURRENT_SEEKBAR_PROGRESS=100; privateHandlerhandler; BroadcastReceiverreceiver; @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_play); ButterKnife.bind(this); initFragments(); initViewPager(); viewPager.setCurrentItem(1); initHeader(); receiver=newInnerBrocastReceiver(); IntentFilterfilter=newIntentFilter(); filter.addAction(Constants.INTENT_ACTION_IS_PLAYING); registerReceiver(receiver,filter); handler=newHandler(newInnerHandlerCallBack()); app=MyApp.getInstance(); initView(); } /** *≥ı
ºªØtitle */ privatevoidinitHeader(){ CommonUtils.setHeaderText(rlHeader,getString(R.string.local_music)); CommonUtils.setHeaderLeftIamgeView(rlHeader,R.drawable.back_arrow,newOnClickListener(){ @Override publicvoidonClick(Viewv){ finish(); } },getResources()); } /** *≥ı
ºªØFragment */ privatevoidinitFragments(){ fragments=newArrayList<Fragment>(); fragments.add(newPlayListFragment()); // Fragmentfragment=newPlayFragment();// Bundlebundle=newBundle();// bundle.putString("mainActivity","mainActivity");// fragment.setArguments(bundle); fragments.add(newPlayFragment()); } /** *≥ı
ºªØViewPager */ privatevoidinitViewPager(){ adapter=newInnerFragmentAdapter(getSupportFragmentManager(),fragments); viewPager.setAdapter(adapter); viewPager.setOnPageChangeListener(newOnPageChangeListener(){ @Override publicvoidonPageSelected(intarg0){ //TODOµº∫Ωπÿ¡™ViewPager } @Override publicvoidonPageScrolled(intarg0,floatarg1,intarg2){ } @Override publicvoidonPageScrollStateChanged(intarg0){ } }); } /** *◊‘∂®“¿‡ºÃ≥–◊‘FragmentPagerAdapter
≈‰∆˜ *@authorfeixiang * */ privateclassInnerFragmentAdapterextendsFragmentPagerAdapter{ privateList<Fragment>fragments; publicInnerFragmentAdapter(FragmentManagerfm,List<Fragment>fragments){ super(fm); this.fragments=fragments; } @Override publicFragmentgetItem(intarg0){ returnfragments.get(arg0); } @Override publicintgetCount(){ returnfragments==null?0:fragments.size(); } } /** *≥ı
ºªØ∏˜÷÷Viewøÿº˛ */ privatevoidinitView(){ pbProgress.setOnSeekBarChangeListener(newOnSeekBarChangeListener(){ @Override publicvoidonStopTrackingTouch(SeekBarseekBar){ intcurrentPosition=app.getCurrentMusicDuration()/100*pbProgress.getProgress(); app.setCurrentPosition(currentPosition); Intentintent=newIntent(); intent.setAction(Constants.INTENT_ACTION_SEEK_TO_POSITION); sendBroadcast(intent); Log.i("info","currentPosition"+currentPosition); } @Override publicvoidonStartTrackingTouch(SeekBarseekBar){ } @Override publicvoidonProgressChanged(SeekBarseekBar,intprogress, booleanfromUser){ } }); } privateclassUpdateSeekBarThreadextendsThread{ @Override publicvoidrun(){ while(true){ Message.obtain(handler,CURRENT_SEEKBAR_PROGRESS).sendToTarget(); try{ Thread.sleep(800); }catch(InterruptedExceptione){ e.printStackTrace(); } } } } privateclassInnerHandlerCallBackimplementsHandler.Callback{ @Override publicbooleanhandleMessage(Messagemsg){ switch(msg.what){ caseCURRENT_SEEKBAR_PROGRESS: inta=app.getCurrentPosition(); intb=app.getCurrentMusicDuration(); intpercent=100*a/b;// Log.i("info","≤•∑≈Ω¯∂»"+percent+"µ±«∞≤•∑≈
±≥§"+a+"◊‹
±≥§"+b); pbProgress.setProgress(percent); break; } returnfalse; } } privateclassInnerBrocastReceiverextendsBroadcastReceiver{ @Override publicvoidonReceive(Contextcontext,Intentintent){ Stringaction=intent.getAction(); if(Constants.INTENT_ACTION_IS_PLAYING.equals(action)){ if(app.isPlaying()){ ivPlayOrPause.setImageResource(R.drawable.kg_btn_noti_pause_pressed); }else{ ivPlayOrPause.setImageResource(R.drawable.kg_btn_noti_play_pressed); } newUpdateSeekBarThread().start(); } } } @OnClick({R.id.iv_fragment_play_next,R.id.iv_fragment_play_pauseOrplay,R.id.iv_fragment_play_previous}) publicvoidoptions(Viewv){ Intentintent=newIntent(); switch(v.getId()){ caseR.id.iv_fragment_play_previous: intent.setAction(Constants.INTENT_ACTION_PREVIOUS); Toast.makeText(getApplicationContext(),"previous",Toast.LENGTH_SHORT).show(); break; caseR.id.iv_fragment_play_pauseOrplay: intent.setAction(Constants.INTENT_ACTION_PLAY_OR_PAUSE); Toast.makeText(getApplicationContext(),"pauseOrplay",Toast.LENGTH_SHORT).show(); break; caseR.id.iv_fragment_play_next: intent.setAction(Constants.INTENT_ACTION_NEXT); Toast.makeText(getApplicationContext(),"next",Toast.LENGTH_SHORT).show(); break; } sendBroadcast(intent); } @Override protectedvoidonDestroy(){ unregisterReceiver(receiver); super.onDestroy(); }}5.2获取网络歌曲分类列表的代码实现.具体的代码实现:package.xxu.imusic;importjava.util.ArrayList;importjava.util.List;importandroid.app.Activity;importandroid.app.AlertDialog;importandroid.app.AlertDialog.Builder;importandroid.content.Intent;importandroid.os.Bundle;importandroid.os.Handler;importandroid.os.Message;importandroid.text.TextUtils;importandroid.util.Log;importandroid.view.LayoutInflater;importandroid.view.View;importandroid.view.Window;importandroid.view.View.OnClickListener;importandroid.widget.AdapterView;importandroid.widget.AdapterView.OnItemClickListener;importandroid.widget.Button;importandroid.widget.EditText;importandroid.widget.GridView;importandroid.widget.RelativeLayout;importandroid.widget.TabHost;importandroid.widget.TabHost.TabSpec;importandroid.widget.TextView;importandroid.widget.Toast;importbutterknife.Bind;importbutterknife.ButterKnife;importbutterknife.OnClick;import.xxu.imusic.adapter.NetNewAlbumAdapter;import.xxu.imusic.constant.Constants;import.xxu.imusic.entity.NewNetAlbum;import.xxu.imusic.utils.CommonUtils;import.xxu.imusic.utils.HttpUtils;import.xxu.imusic.utils.JsonUtils;importcom.handmark.pulltorefresh.library.PullToRefreshBase;importcom.handmark.pulltorefresh.library.PullToRefreshBase.Mode;importcom.handmark.pulltorefresh.library.PullToRefreshBase.OnRefreshListener;importcom.handmark.pulltorefresh.library.PullToRefreshGridView;publicclassNetAlbumActivityextendsActivityimplementsConstants{ @Bind(R.id.et_net_music_search) EditTextetSearch; @Bind(R.id.btn_net_music_search) ButtonbtnSearch; @Bind(R.id.lv_net_album_HY) PullToRefreshGridViewgridViewHY; @Bind(R.id.lv_net_album_OM) PullToRefreshGridViewgridViewOM; @Bind(R.id.lv_net_album_RH) PullToRefreshGridViewgridViewRH; privateTabHosttbHost; privateHandlerhandler; @Bind(R.id.rl_net_music_header) RelativeLayoutrlHeader; /** *
≈‰∆˜ */ privateNetNewAlbumAdapteradapterHY; privateNetNewAlbumAdapteradapterOM; privateNetNewAlbumAdapteradapterRH; /** *
˝æ›‘¥ */ privateList<NewNetAlbum>dataHY; privateList<NewNetAlbum>dataOM; privateList<NewNetAlbum>dataRH; /** *Õ¯¬Á
˝æ›“≥¬Î */ privateintpageHY=1; privateintpageOM=1; privateintpageRH=1; privateStringuriHY; privateStringuriOM; privateStringuriRH; privatefinalintWHAT_SUCCESS=110; privatefinalintDATA_TYPE_HY=0; privatefinalintDATA_TYPE_OM=1; privatefinalintDATA_TYPE_RH=2; @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_net_music); ButterKnife.bind(this); handler=newHandler(newInnerCallback()); initHeader(); initTabHost(); initGridViewHY(); initGridViewOM(); initGridViewRH(); uriHY=URI_NEW_HY_ALBUMS+"page="+pageHY; newGetNewMusicThread(uriHY,DATA_TYPE_HY).start(); uriOM=URI_NEW_OM_ALBUMS+"page="+pageOM; newGetNewMusicThread(uriOM,DATA_TYPE_OM).start(); uriRH=URI_NEW_RH_ALBUMS+"page="+pageRH; newGetNewMusicThread(uriRH,DATA_TYPE_RH).start(); } /** *≥ı
ºªØtitle */ privatevoidinitHeader(){ CommonUtils.setHeaderText(rlHeader,"Õ¯¬Á◊®º≠"); CommonUtils.setHeaderLeftIamgeView(rlHeader,R.drawable.back_arrow,newOnClickListener(){ @Override publicvoidonClick(Viewv){ finish(); } },getResources()); } /** *≥ı
ºªØGridViewHY */ privatevoidinitGridViewHY(){ dataHY=newArrayList<NewNetAlbum>(); adapterHY=newNetNewAlbumAdapter(NetAlbumActivity.this,dataHY); gridViewHY.setMode(Mode.PULL_FROM_END); gridViewHY.setOnRefreshListener(newOnRefreshListener<GridView>(){ @Override publicvoidonRefresh(PullToRefreshBase<GridView>refreshView){ pageHY++; uriHY=URI_NEW_HY_ALBUMS+"&page="+pageHY; newGetNewMusicThread(uriHY,DATA_TYPE_HY).start(); } }); gridViewHY.setOnItemClickListener(newOnItemClickListener(){ @Override publicvoidonItemClick(AdapterView<?>parent,Viewview, intposition,longid){ Builderbuilder=newAlertDialog.Builder(NetAlbumActivity.this); Viewv=LayoutInflater.from(NetAlbumActivity.this).inflate(R.layout.dialog_view_layout,null); builder.setTitle("–°Ã·
æ").setView(v).setNegativeButton("∑µªÿ",null); builder.create().show(); } }); gridViewHY.setAdapter(adapterHY); } /** *≥ı
ºªØGridViewOM */ privatevoidinitGridViewOM(){ dataOM=newArrayList<NewNetAlbum>(); adapterOM=newNetNewAlbumAdapter(NetAlbumActivity.this,dataOM); gridViewOM.setMode(Mode.PULL_FROM_END); gridViewOM.setOnRefreshListener(newOnRefreshListener<GridView>(){ @Override publicvoidonRefresh(PullToRefreshBase<GridView>refreshView){ pageOM++; uriOM=URI_NEW_OM_ALBUMS+"&page="+pageOM; newGetNewMusicThread(uriOM,DATA_TYPE_OM).start(); } }); gridViewOM.setOnItemClickListener(newOnItemClickListener(){ @Override publicvoidonItemClick(AdapterView<?>parent,Viewview, intposition,longid){ Builderbuilder=newAlertDialog.Builder(NetAlbumActivity.this); Viewv=LayoutInflater.from(NetAlbumActivity.this).inflate(R.layout.dialog_view_layout,null); builder.setTitle("–°Ã·
æ").setView(v).setNegativeButton("∑µªÿ",null); builder.create().show(); } }); gridViewOM.setAdapter(adapterOM); } /** *≥ı
ºªØGridViewRH */ privatevoidinitGridViewRH(){ dataRH=newArrayList<NewNetAlbum>(); adapterRH=newNetNewAlbumAdapter(NetAlbumActivity.this,dataRH); gridViewRH.setMode(Mode.PULL_FROM_END); gridViewRH.setOnRefreshListener(newOnRefreshListener<GridView>(){ @Override publicvoidonRefresh(PullToRefreshBase<GridView>refreshView){ pageRH++; uriRH=URI_NEW_RH_ALBUMS+"&page="+pageRH; newGetNewMusicThread(uriRH,DATA_TYPE_RH).start(); } }); gridViewRH.setOnItemClickListener(newOnItemClickListener(){ @Override publicvoidonItemClick(AdapterView<?>parent,Viewview, intposition,longid){ Builderbuilder=newAlertDialog.Builder(NetAlbumActivity.this); Viewv=LayoutInflater.from(NetAlbumActivity.this).inflate(R.layout.dialog_view_layout,null); builder.setTitle("–°Ã·
æ").setView(v).setNegativeButton("∑µªÿ",null); builder.create().show(); } }); gridViewRH.setAdapter(adapterRH); } /** *≥ı
ºªØTabHost */ privatevoidinitTabHost(){ tbHost=(TabHost)findViewById(R.id.tabhost); tbHost.setup(); TabSpectab1=tbHost.newTabSpec("First"); tab1.setIndicator(createView("ª™”Ô")); tab1.setContent(R.id.rl_new_music_HY); tbHost.addTab(tab1); TabSpectab2=tbHost.newTabSpec("Second"); tab2.setIndicator(createView("≈∑√¿")); tab2.setContent(R.id.rl_new_music_OM); tbHost.addTab(tab2); TabSpectab3=tbHost.newTabSpec("Third"); tab3.setIndicator(createView("»’∫´")); tab3.setContent(R.id.rl_new_music_RH); tbHost.addTab(tab3); } /** *ªÒ»°TabHostµƒ±Í«©≤ºæ÷View *@paramtabName *@return */ privateViewcreateView(StringtabName){ Viewview=LayoutInflater.from(NetAlbumActivity.this).inflate(R.layout.tabhost_tab_layout,null); TextViewtv=(TextView)view.findViewById(R.id.tv_tabhost_tab); tv.setText(tabName); returnview; } /** *µ„ª˜À—À˜ * *@paramv */ @OnClick(R.id.btn_net_music_search) publicvoidsearch(Viewv){ Stringparam=etSearch.getText().toString(); if(!TextUtils.isEmpty(param)){ Intentintent=newIntent(NetAlbumActivity.this,SearchNetMusicResultActivity.class); intent.putExtra("search",param); startActivity(intent); } } /** *◊‘∂®“¿‡
µœ÷Handler.CallbackΩ”ø⁄ *@authorfeixiang * */ privateclassInnerCallbackimplementsHandler.Callback{ @SuppressWarnings("unchecked") @Override publicbooleanhandleMessage(Messagemsg){ if(msg.what==WHAT_SUCCESS){ List<NewNetAlbum>data=(List<NewNe
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 专用油品运输业务协议(2024年度)版B版
- 2025年高效节水打机井建设与维护合同2篇
- 24节气:大寒 相关英语练习
- 16《金色的草地》说课稿-2024-2025学年三年级上册语文统编版
- 2025年度智慧交通PPP项目合作协议3篇
- 个人过桥融资合同2024年适用样本版
- 氢能燃料电池研发合作合同
- 2025版宠物领养中心公益项目合作协议3篇
- 2024年美发美容师个人服务合同
- 个人邮箱注册服务协议20243篇
- 自动化立体库货架验收报告
- 消防系统工程质量控制资料检查记录
- 中药封包疗法操作规范
- 浙江产业带分布情况
- 道岔主要几何尺寸表
- 柳宗元毛笔楷书字帖
- 纤力玻璃钢管道厚度,重量一览表
- 新浪网删贴申请文档 (个人)
- 低温乙烯罐内罐预冷过程温度急降原因探讨
- 世界各国电压频率一览表(精编版)
- (完整版)装饰装修工程监理细则(详解)最新(精华版)
评论
0/150
提交评论