基于Android的在线音乐播放器开发.docx
- 文档编号:9627976
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:102
- 大小:388.98KB
基于Android的在线音乐播放器开发.docx
《基于Android的在线音乐播放器开发.docx》由会员分享,可在线阅读,更多相关《基于Android的在线音乐播放器开发.docx(102页珍藏版)》请在冰豆网上搜索。
基于Android的在线音乐播放器开发
从本文开始,详细讲述一个音乐播放器的实现,以及从网络解析数据获取最新推荐歌曲以及歌曲下载的功能。
功能介绍如下:
1、获取本地歌曲列表,实现歌曲播放功能。
2、利用硬件加速感应器,摇动手机实现切换歌曲的功能
3、利用jsoup解析网页数据,从网络获取歌曲列表,同时实现歌曲和歌词下载到手机本地的功能。
4、通知栏提醒,实现仿QQ音乐播放器的通知栏功能.
涉及的技术有:
1、jsoup解析网络网页,从而获取需要的数据
2、Android中访问网络,获取文件到本地的网络请求技术,以及下载文件到本地实现断点下载
3、线程池
4、图片缓存
5、service一直在后台运行
6、手机硬件加速器
7、notification通知栏设计
8、自定义广播
9、android系统文件管理
主要技术是这些,其中,利用jsoup解析网络网页,从而获取需要的数据,请参考我的博文:
android中使用JSOUP如何解析网页数据详述
下面是最终结果展示:
图一本地歌曲列表
图二网络歌曲列表
图三播放歌曲界面
图四播放界面歌词显示部分
图五通知栏展示播放和下载时的展示
在本地歌曲列表界面长按菜单键可以显示菜单:
在网络歌曲列表中,点击歌曲,可以显示下载和取消菜单项:
基本的界面就是上面的图所展示的。
大家觉得还可以的话,就给留个言~~^_^【握手】
下面就开始详细讲述实现细节。
首先提一点,播放器中获取的网络歌曲部分,请参看我的博文:
android中使用JSOUP如何解析网页数据详述
网络歌曲列表的获取就是利用jsoup从网页抓取数据进行展示的。
关于这部分的东西,在本系列博文中不再详细说明了。
关于音乐播放器部分,需要使用到service服务,总共需要两个,一个是音乐播放的service,一个是歌曲下载的service,关于service一直在后台运行的问题,请参考我的博文:
实现音乐播放器后台Service服务一直存在的解决思路
根据这篇博文的说明,很容易设计application类的实现,application类实现代码如下:
/**
*2015年8月15日16:
34:
37
*博文地址:
*/
publicclassAppextendsApplication{
publicstaticContextsContext;
publicstaticintsScreenWidth;
publicstaticintsScreenHeight;
@Override
publicvoidonCreate(){
super.onCreate();
sContext=getApplicationContext();
startService(newIntent(this,PlayService.class));
startService(newIntent(this,DownloadService.class));
WindowManagerwm=(WindowManager)getSystemService(Context.WINDOW_SERVICE);
DisplayMetricsdm=newDisplayMetrics();
wm.getDefaultDisplay().getMetrics(dm);
sScreenWidth=dm.widthPixels;
sScreenHeight=dm.heightPixels;
}
}
application类中启动了上面的两个service服务,同时获取了手机屏幕的宽和高。
手机宽和高是为了后i面设计界面使用的。
有了application之后就可以设计Activity类,首先设计BaseActivity类,把复用的代码放在基类中,子类覆盖或重写BaseActivity中的方法,代码如下:
/**
*2015年8月15日16:
34:
37
*博文地址:
*/
publicabstractclassBaseActivityextendsFragmentActivity{
protectedPlayServicemPlayService;
protectedDownloadServicemDownloadService;
privatefinalStringTAG=BaseActivity.class.getSimpleName();
privateServiceConnectionmPlayServiceConnection=newServiceConnection(){
@Override
publicvoidonServiceDisconnected(ComponentNamename){
L.l(TAG,"play--->onServiceDisconnected");
mPlayService=null;
}
@Override
publicvoidonServiceConnected(ComponentNamename,IBinderservice){
mPlayService=((PlayService.PlayBinder)service).getService();
mPlayService.setOnMusicEventListener(mMusicEventListener);
onChange(mPlayService.getPlayingPosition());
}
};
privateServiceConnectionmDownloadServiceConnection=newServiceConnection(){
@Override
publicvoidonServiceDisconnected(ComponentNamename){
L.l(TAG,"download--->onServiceDisconnected");
mDownloadService=null;
}
@Override
publicvoidonServiceConnected(ComponentNamename,IBinderservice){
mDownloadService=((DownloadService.DownloadBinder)service).getService();
}
};
/**
*音乐播放服务回调接口的实现类
*/
privatePlayService.OnMusicEventListenermMusicEventListener=
newPlayService.OnMusicEventListener(){
@Override
publicvoidonPublish(intprogress){
BaseActivity.this.onPublish(progress);
}
@Override
publicvoidonChange(intposition){
BaseActivity.this.onChange(position);
}
};
/**
*Fragment的view加载完成后回调
*
*注意:
*allowBindService()使用绑定的方式启动歌曲播放的服务
*allowUnbindService()方法解除绑定
*
*在SplashActivity.java中使用startService()方法启动过该音乐播放服务了
*那么大家需要注意的事,该服务不会因为调用allowUnbindService()方法解除绑定
*而停止。
*/
publicvoidallowBindService(){
getApplicationContext().bindService(newIntent(this,PlayService.class),
mPlayServiceConnection,
Context.BIND_AUTO_CREATE);
}
/**
*fragment的view消失后回调
*/
publicvoidallowUnbindService(){
getApplicationContext().unbindService(mPlayServiceConnection);
}
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
//绑定下载服务
bindService(newIntent(this,DownloadService.class),
mDownloadServiceConnection,
Context.BIND_AUTO_CREATE);
}
@Override
protectedvoidonDestroy(){
unbindService(mDownloadServiceConnection);
super.onDestroy();
}
publicDownloadServicegetDownloadService(){
returnmDownloadService;
}
/**
*更新进度
*抽象方法由子类实现
*实现service与主界面通信
*@paramprogress进度
*/
publicabstractvoidonPublish(intprogress);
/**
*切换歌曲
*抽象方法由子类实现
*实现service与主界面通信
*@paramposition歌曲在list中的位置
*/
publicabstractvoidonChange(intposition);
}
下面给出启动界面,启动界面非常简单,延时2秒进入主界面,代码如下:
/**
*2015年8月15日16:
34:
37
*博文地址:
*/
publicclassSplashActivityextendsActivity{
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
//notitle
requestWindowFeature(Window.FEATURE_NO_TITLE);
//全屏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.splash_layout);
//2s跳转到主界面
newHandler().postDelayed(newRunnable(){
@Override
publicvoidrun(){
startActivity(newIntent(SplashActivity.this,MainActivity.class));
finish();
}
},2000);
}
}
本系列博文,详细讲述一个音乐播放器的实现,以及从网络解析数据获取最新推荐歌曲以及歌曲下载的功能。
功能介绍如下:
1、获取本地歌曲列表,实现歌曲播放功能。
2、利用硬件加速感应器,摇动手机实现切换歌曲的功能
3、利用jsoup解析网页数据,从网络获取歌曲列表,同时实现歌曲和歌词下载到手机本地的功能。
4、通知栏提醒,实现仿QQ音乐播放器的通知栏功能.
涉及的技术有:
1、jsoup解析网络网页,从而获取需要的数据
2、Android中访问网络,获取文件到本地的网络请求技术,以及下载文件到本地实现断点下载
3、线程池
4、图片缓存
5、service一直在后台运行
6、手机硬件加速器
7、notification通知栏设计
8、自定义广播
9、android系统文件管理
主要技术是这些,其中,利用jsoup解析网络网页,从而获取需要的数据,请参考我的博文:
android中使用JSOUP如何解析网页数据详述
上一篇博文:
android-音乐播放器实现及源码下载
(一)
有了上一篇博文的准备,现在可以设计主界面,代码如下:
/**
*2015年8月15日16:
34:
37
*博文地址:
*/
publicclassMainActivityextendsBaseActivityimplementsOnClickListener{
privatestaticfinalStringTAG=MainActivity.class.getSimpleName();
privateScrollRelativeLayoutmMainContainer;
privateIndicatormIndicator;
privateTextViewmLocalTextView;
privateTextViewmSearchTextView;
privateViewPagermViewPager;
privateViewmPopshownView;
privatePopupWindowmPopupWindow;
privateArrayList
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
registerReceiver();
initFragments();
setupViews();
}
/**
*注册广播接收器
*在下载歌曲完成或删除歌曲时,更新歌曲列表
*/
privatevoidregisterReceiver(){
IntentFilterfilter=newIntentFilter(Intent.ACTION_MEDIA_SCANNER_STARTED);
filter.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED);
filter.addDataScheme("file");
registerReceiver(mScanSDCardReceiver,filter);
}
privatevoidsetupViews(){
mMainContainer=(ScrollRelativeLayout)findViewById(R.id.rl_main_container);
mIndicator=(Indicator)findViewById(R.id.main_indicator);
mLocalTextView=(TextView)findViewById(R.id.tv_main_local);
mSearchTextView=(TextView)findViewById(R.id.tv_main_remote);
mViewPager=(ViewPager)findViewById(R.id.vp_main_container);
mPopshownView=findViewById(R.id.view_pop_show);
mViewPager.setAdapter(mPagerAdapter);
mViewPager.setOnPageChangeListener(mPageChangeListener);
mLocalTextView.setOnClickListener(this);
mSearchTextView.setOnClickListener(this);
selectTab(0);
}
privateOnPageChangeListenermPageChangeListener=newOnPageChangeListener(){
@Override
publicvoidonPageSelected(intposition){
selectTab(position);
mMainContainer.showIndicator();
}
@Override
publicvoidonPageScrolled(intposition,floatpositionOffset,intpositionOffsetPixels){
mIndicator.scroll(position,positionOffset);
}
@Override
publicvoidonPageScrollStateChanged(intposition){
}
};
privateFragmentPagerAdaptermPagerAdapter=
newFragmentPagerAdapter(getSupportFragmentManager()){
@Override
publicintgetCount(){
returnmFragments.size();
}
@Override
publicFragmentgetItem(intposition){
returnmFragments.get(position);
}
};
/**
*切换导航indicator
*@paramindex
*/
privatevoidselectTab(intindex){
switch(index){
case0:
mLocalTextView.setTextColor(getResources().getColor(R.color.main));
mSearchTextView.setTextColor(getResources().getColor(R.color.main_dark));
break;
case1:
mLocalTextView.setTextColor(getResources().getColor(R.color.main_dark));
mSearchTextView.setTextColor(getResources().getColor(R.color.main));
break;
}
}
privatevoidinitFragments(){
LocalFragmentlocalFragment=newLocalFragment();
NetSearchFragmentnetSearchFragment=newNetSearchFragment();
mFragments.add(localFragment);
mFragments.add(netSearchFragment);
}
/**
*获取音乐播放服务
*@return
*/
publicPlayServicegetPlayService(){
returnmPlayService;
}
publicvoidhideIndicator(){
mMainContainer.hideIndicator();
}
publicvoidshowIndicator(){
mMainContainer.showIndicator();
}
publicvoidonPopupWindowShown(){
mPopshownView.startAnimation(AnimationUtils.loadAnimation(this,R.anim.layer_show_anim));
mPopshownView.setVisibility(View.VISIBLE);
}
publicvoidonPopupWindowDismiss(){
mPopshownView.startAnimation(AnimationUtils.loadAnimation(this,R.anim.layer_gone_anim));
mPopshownView.setVisibility(View.GONE);
}
@Override
publicvoidonPublish(intprogress){
//如果当前显示的fragment是音乐列表fragment
//则调用fragment的setProgress设置进度
if(mViewPager.getCurrentItem()==0){
((LocalFragment)mFragments.get(0)).setProgress(progress);
}
}
@Override
publicvoidonChange(intposition){
//如果当前显示的fragment是音乐列表fragment
//则调用fragment的setProgress切换歌曲
if(mViewPager.getCurrentItem()==0){
((LocalFragment)mFragments.get(0)).onPlay(position);
}
}
privatevoidonShowMenu(){
onPopupWindowShown();
if(mPopupWindow==null){
Viewview=View.inflate(this,R.layout.exit_pop_layout,null);
Viewshutdown=view.findViewById(R.id.tv_pop_shutdown);
Viewexit=view.findViewById(R.id.tv_pop_exit);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 Android 在线音乐 播放 开发
![提示](https://static.bdocx.com/images/bang_tan.gif)