我的音乐播放器 服务控制音乐的状态

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我的音乐播放器 服务控制音乐的状态相关的知识,希望对你有一定的参考价值。

package com.jk.impl;

import android.widget.SeekBar;

public interface IMusic {

    //暂停播放
    public void dopause();
    //继续播放
    public void doresume();
    //播放
    public void dostart();
    //停止播放
    public void dostop();
  //初始化SeekBar 和设置播放完成的回调方法
public void init(SeekBar seekbar,onMusicOver over);   //释放资源
public void doRset();   //将进度条更新线程移除队列
public void dorevmo(); }

 

音乐播放器中最重要的部分: 服务, 控制音乐播放器的部分是通过调用MediaPlayer,

一个音乐播放的回调方法:用来通知播放完成,进行下一步:

public interface onMusicOver {

     public void onMusicOver();
    
}

 

一个音乐播放的接口,定义音乐播放的各种状态:

 

   更新seekbar是一个耗时的操作,在init() 中使用一个线程将

 更新播放进度。

设置seekBar的监听事件来检测进度条的拖动来改变播放的时间,在

onProgressChanged()更新音乐的播放时间mediaPlayer.seekTo()

 

播放:

  MediaPlayer.reset();  //重置资源

  MediaPlayer.setDataSource(path);//加载路径

  MediaPlayer.prepare()   //准备,加载资源

  seekbar.setOnSeekBarChangeListener(xx)设置进度条的监听,

  MediaPlayer.start(); //播放

  将进度线程绑定到值顶的handler,为了方便改变播放时,剔除上一个进度线程。

  设置一个播放完成事件的监听,

    mp.setOnCompletionListener(xx){

      调用播放完成的回调方法,为了方便通知用户播放完,进行下一步操作。

      over.onMusicOver();

    };

 

  

   

 

 

package com.jk.service;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Binder;
import android.os.Handler;
import android.os.IBinder;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;

import com.jk.impl.IMusic;
import com.jk.impl.onMusicOver;

public class musicService extends Service {

    private MediaPlayer mp;
    private String path;
    private boolean f = false;

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        System.out.println("onBind");

        path = intent.getStringExtra("path");
        System.out.println(path);
        return new MyBinder();
    }

    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        super.onCreate();
        System.out.println("onCreate");
        // 播放音乐
        try {
            // 得到媒体播放器
            mp = new MediaPlayer();

            // mp.pause();
            // mp.start();

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    @Override
    public void onStart(Intent intent, int startId) {
        // TODO Auto-generated method stub
        super.onStart(intent, startId);
        System.out.println("onStart");
    }

    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        System.out.println("onDestroy");

    }

    @Override
    public boolean onUnbind(Intent intent) {
        // TODO Auto-generated method stub
        System.out.println("onUnbind");
        return super.onUnbind(intent);
    }

    // 暂停
    public void pause() {
        mp.pause();
    }

    // 继续
    public void resume() {
        mp.start();
    }

    class MyBinder extends Binder implements IMusic {
        // MyService getService(){
        // return MyService.this;
        // }
        private SeekBar seekbar;
        Handler handle = new Handler() {

        };
        Runnable runnable = new Runnable() {

            @Override
            public void run() {
                // 根新进度条
                if (mp.isPlaying()) {
                    seekbar.setProgress(mp.getCurrentPosition());

                }
                handle.postDelayed(runnable, 500);
            }
        };

        public void dopause() {
            // 调用的本地MyService的暂停
            f=false;
            pause();
        }  

        public void doresume() {
            resume();
        }
        public void dorevmo(){
            handle.removeCallbacks(runnable);
        }

        public void init(SeekBar seekbar,final onMusicOver over) {
            System.out.println("*********init******");
            this.seekbar = seekbar;
            // 重置
            mp.reset();

            // 设置播放资源
            try {
                mp.setDataSource(path);
                mp.prepare();
                seekbar.setMax(mp.getDuration());
                //设置拖动进度条改变的时候的监听方法
                seekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

                    @Override
                    public void onStopTrackingTouch(SeekBar seekBar) {
                        // TODO Auto-generated method stub

                    }

                    @Override
                    public void onStartTrackingTouch(SeekBar seekBar) {
                        // TODO Auto-generated method stub

                    }

                    @Override
                    public void onProgressChanged(SeekBar seekBar, int progress,
                            boolean fromUser) {
                        // fromUser  是否是用户操作

                        if(fromUser){
                            mp.seekTo(progress);

                        }
                    }
                });
                // 设置进度
                mp.start();
                f=true;
                handle.post(runnable);
                mp.setOnCompletionListener(new OnCompletionListener() {
                    @Override
                    public void onCompletion(MediaPlayer mp) {
                        // TODO Auto-generated method stub
                        over.onMusicOver();
                    }
                });
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }

        public void dostart() {
            try {
                mp.start();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        public void dostop() {
            // TODO Auto-generated method stub
            if (mp != null && mp.isPlaying()) {
                mp.stop();
                mp.release();
                mp = null;
            }
        }

        public void doRset() {
            mp.release();
        }
    }

}

 

以上是关于我的音乐播放器 服务控制音乐的状态的主要内容,如果未能解决你的问题,请参考以下文章

如何控制我的音乐播放器耳机?

Audio Ducking 后音乐更柔和?

本地音乐播放器——播放界面和服务的通信

音乐播放制作(html css js)

自定义audio样式做音乐播放器

微信小程序播放背景音乐