Android学习之路4——音乐播放器后台播放
一、实验题目
- 简单音乐播放器
二、实现内容
- 实现一个简单的播放器,要求功能有:
- 播放、暂停、停止、退出功能,按停止键会重置封面转角,进度条和播放按钮;按退出键将停止播放并退出程序。
- 后台播放功能,按手机的返回键和home键都不会停止播放,而是转入后台进行播放。
- 进度条显示播放进度、拖动进度条改变进度功能。
- 播放时图片旋转,显示当前播放时间功能,圆形图片的实现使用的是一个开源控件CircleImageView
- 加分项
- 用户可以点击选歌按钮自己选择歌曲进行播放,要求换歌后不仅能正常实现上述的全部功能,还要求选歌成功后不自动播放,重置播放按钮,重置进度条,重置歌曲封面转动角度,最重要的一点:需要解析mp3文件,并更新封面图片。
三、实验结果:
-
进入后的界面:
-
点击播放后:
-
点击file图标选择文件:
-
选择歌曲后:
-
拖动进度条播放:
-
点击退出图标退出后再进入界面也能正确显示。
四、实验步骤及主要代码:
-
Step1:布局
-
整体用的是线性布局,比较适合。
-
音乐专辑图片用到圆形图片空间CircleImageView
<de.hdodenhof.circleimageview.CircleImageView xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/image" android:layout_width="wrap_content" android:layout_height="0dp" android:src="@drawable/img" app:civ_border_color="#FF000000" android:layout_margin="20dp" android:layout_weight="10" android:layout_gravity="center"/>
-
进度条用的是SeekBar:
<SeekBar android:id="@+id/seek_bar" android:layout_width="0dp" android:layout_height="wrap_content" app:layout_constraintLeft_toRightOf="@id/start_time" app:layout_constraintRight_toLeftOf="@id/end_time" android:layout_marginHorizontal="2dp" />
-
其它的就是布局的一些基本功了。
-
-
Step2:创建一个服务Service
-
File->New->Service->Service,通过这种方法创建AS会自动配置好,比如创建名叫MusicService的服务,在AndroidManifest.xml会生成以下代码:
<service android:name=".MusicService" android:enabled="true" android:exported="true"></service>
-
在MusicService新创一个MyBinder继承Binder用于在主活动和服务之间联系:
private IBinder myBinder = new MyBinder(); public class MyBinder extends Binder{ public MusicService getService(){ return MusicService.this; } } @Override public IBinder onBind(Intent intent) { return myBinder; }
-
点击返回键活动会销毁,但如果没有指定销毁服务,服务还是不会销毁的,所以变量MediaPlayer要在服务MusicService类里面创建,并且要设为static,由此至终只有一个MediaPlayer实例,个人感觉MusicService可以设成单例模式,但查了关于音乐播放器的其它例子,没见到有用单例模式的,所以最后还是没采用了。把MediaPlayer的相关操作封装在MusicService里面:
//MusicService.java public static MediaPlayer mediaPlayer = null; private static String mediaPath; public MusicService(){ //Log.d("MusicService","Gouzhao"); if(mediaPlayer == null){ mediaPlayer= new MediaPlayer(); initMediaPlayer(); } } //TODO :播放或暂停 public boolean playOrPause(){ Log.d("MusicService","playOrPause")
-