音乐播放器实现简单的音乐播放,进度条的拖动和能够后台播放。
由于需要实现后台播放,所以必须创建服务,在服务中实现音乐的播放,暂停,和进度条拖动改变音乐播放进度的方法。
MusicService
public class MusicServer extends Service {
MediaPlayer player;
private Timer timer;
@Override
public IBinder onBind(Intent intent) {
return new MusicController();
}
@Override
public void onCreate() {
super.onCreate();
//在服务创建时新建mediaplayer对象
player = new MediaPlayer();
}
@Override
public void onDestroy() {
// 服务被关闭的时候
super.onDestroy();
//停止播放
player.stop();
//释放资源,此时player对象已经废掉了,要想再次播放必须新建mediaplayer对象
player.release();
player = null;
if(timer != null){
timer.cancel();
timer = null;
}
}
//中间人类,实现服务与activity的通信
class MusicController extends Binder implements MusicInterface{
@Override
public void play() {
MusicServer.this.play();
}
@Override
public void pause() {
MusicServer.this.pause();
}
@Override
public void continuePlay() {
MusicServer.this.continuePlay();
}
@Override
public void seekTo(int progress) {
MusicServer.this.seekTo(progress);
}
}
public void play(){
//重置
player.reset();
try {
//加载多媒体文件, player.setDataSource("data/data/com.example.musicplay/cache/xiulianaiqing.mp3");
//准备播放
player.prepare();
//开始播放
player.start();
//不断监听播放进度,通知主线程刷新UI
addTimer();
} catch (Exception e) {
e.printStackTrace();
}
}
public void continuePlay(){
player.start();
}
public void pause(){
player.pause();
}
public void seekTo(int progress){
player.seekTo(progress);
}
public void addTimer(){
if(timer == null){
timer = new Timer();
}
timer.schedule(new TimerTask() {
@Override
public void run() {
//获取歌曲的总时长
int duration = player.getDuration();
//获取歌曲当前播放进度
int CurrentPosition = player.getCurrentPosition();
Message msg = MainActivity.handler.obtainMessage();
//把进度封装至消息对象中
Bundle bundle = new Bundle();
bundle.putInt("duration", duration);
bundle.putInt("CurrentPosition", CurrentPosition);
msg.setData(bundle);
MainActivity.handler.sendMessage(msg);
}//开始计时任务后的5毫秒第一次执行run方法,以后每1000毫秒执行一次
}, 5,1000);
}
}
activity
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sb = (SeekBar) findViewById(R.id.sb);
//设置进度条拖动监听事件
sb.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
//根据拖动的进度改变音乐播放的进度,停止时调用
int progress = seekBar.getProgress();
mi.seekTo(progress);
}
//开始拖的时候调用
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
//拖动过程中不断调用
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
}
});
//启动音乐服务
intent = new Intent(this,MusicServer.class);
startService(intent);
conn = new MyserviceConn();
//绑定服务,获取中间人对象,通过借口调用服务中的方法
bindService(intent, conn, BIND_AUTO_CREATE);
}
class MyserviceConn implements ServiceConnection{
//获得音乐服务的中间人对象,强制转换成接口对象
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mi = (MusicInterface) service;
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
}
public void play(View v){
mi.play();
}
public void continuePlay(View v){
mi.continuePlay();
}
public void pause(View v){
mi.pause();
}
public void exit(){
unbindService(conn);
stopService(intent);
}
}
MusicInterface
public interface MusicInterface {
void play();
void pause();
void continuePlay();
void seekTo(int progress);
}
xml
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="开始播放"
android:onClick="play"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="暂停播放"
android:onClick="pause"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="继续播放"
android:onClick="continuePlay"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="退出"
android:onClick="exit"/>
<SeekBar
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/sb"/>
版权声明:本文为u012761617原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。