Android——简易音乐播放器

  • Post author:
  • Post category:其他


音乐播放器实现简单的音乐播放,进度条的拖动和能够后台播放。

由于需要实现后台播放,所以必须创建服务,在服务中实现音乐的播放,暂停,和进度条拖动改变音乐播放进度的方法。


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 版权协议,转载请附上原文出处链接和本声明。