音乐播放的简单实现——Service,SeekBar

转载请注明出处(万分感谢!): 

https://blog.csdn.net/weixin_40790006/article/details/79993530


接口:

package com.example.f405.musictest;

/**
 * Created by F405 on 2018/4/18.
 */

public interface IMusicService {

    public void callStartMusic();
    public void callPauseMusic();
    public void callStopMusic();
    public void callDragSeekBar(int progress);


}

服务:

package com.example.f405.musictest.service;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Binder;
import android.os.Bundle;
import android.os.IBinder;
import android.os.Message;
import android.support.annotation.IntDef;
import android.support.annotation.Nullable;
import android.util.Log;
import android.widget.Toast;

import com.example.f405.musictest.IMusicService;
import com.example.f405.musictest.MainActivity;
import com.example.f405.musictest.R;

import java.util.Timer;
import java.util.TimerTask;

/**
 * Created by F405 on 2018/4/18.
 */

public class MusicService extends Service {

    private MediaPlayer player;
    private static final String TAG = "MusicService";
    private int duration;
    private Timer timer;
    private PositionTask task;


    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return new MyMusicBinder();
    }
    // TODO 返回的Binder
    private class MyMusicBinder extends Binder implements IMusicService{

     public void callStartMusic() {
        startMusic();
     }

     public void callPauseMusic() {
         pauseMusic();
     }

     public void callStopMusic() {
         stopMusic();
     }

        @Override
        public void callDragSeekBar(int progress) {
            dragSeekBar(progress);
        }

    }

    @Override
    public void onCreate() {
        super.onCreate();
        //  初始化音乐控件
        initMusic();
        musicComplete();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();

        timer.cancel();
        task.cancel();

    }

    // TODO 播放资源的路径,配置初始化
    private void initMusic() {
        player = MediaPlayer.create(this, R.raw.yang);
    }

    // 音乐的方法
    public void startMusic(){

        if ( !player.isPlaying()){
            player.start();
            // 更新SeekBar
             updateSeekBar();
        }
    }
    // TODO 更新SeekBar
    private void updateSeekBar() {
        duration = player.getDuration();
        timer = new Timer();
        task = new PositionTask();
        timer.schedule(task,100,1000);
    }


    public void pauseMusic(){
        if (player.isPlaying()){
            player.pause();
        }
    }

    public void stopMusic(){
        if (player.isPlaying()){
            player.stop();
        }
    }
    // TODO TimerTack,实时获取歌曲的进度
    private class PositionTask extends TimerTask{

        @Override
        public void run() {
            // 实时获取数据
            int currentPosition = player.getCurrentPosition();
            // handler子线程向UI线程传输数据
            Message msg = MainActivity.handler.obtainMessage();
            msg.what = 233;
            // 数据
            Bundle bundle = new Bundle();
            bundle.putInt("duration",duration);
            bundle.putInt("currentPosition",currentPosition);
            msg.setData(bundle);

            MainActivity.handler.sendMessage(msg);
        }
    }
    // TODO 拖动SeekBar
    public  void dragSeekBar(int seekBarProgress){
        player.seekTo(seekBarProgress);
    }
    // TODO 歌曲播放完成的监听
    public void musicComplete(){
        player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                player.seekTo(0);
                player.start();
            }
        });
    }
}

代码:

package com.example.f405.musictest;

import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.SeekBar;

import com.example.f405.musictest.service.MusicService;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    private Button btn_start;
    private Button btn_pause;
    private Button btn_stop;
    private static SeekBar seekBar;
    private Intent intent;
    private IMusicService iService;
    private static int currentPosition;
    private static int duration;

    // 服务连接
    ServiceConnection connec = new ServiceConnection() {


        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            iService = (IMusicService) service;
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };

    // handler
    public static Handler handler = new Handler(){

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);

            switch (msg.what){
                case 233:
                    Bundle bundle = msg.getData();
                    duration = bundle.getInt("duration");
                    currentPosition = bundle.getInt("currentPosition");

                    seekBar.setMax(duration);
                    seekBar.setProgress(currentPosition);
                    break;
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();
        // 绑定服务
        bindService(intent,connec,BIND_AUTO_CREATE);

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 取消绑定
        unbindService(connec);
    }


    private void initView() {

        btn_start = (Button) findViewById(R.id.btn_start);
        btn_pause = (Button) findViewById(R.id.btn_pause);
        btn_stop = (Button) findViewById(R.id.btn_stop);
        seekBar = (SeekBar) findViewById(R.id.seekBar);

        btn_start.setOnClickListener(this);
        btn_pause.setOnClickListener(this);
        btn_stop.setOnClickListener(this);

        // 开启服务
        intent = new Intent(this,MusicService.class);
        startService(intent);

        // seekBar监听事件
        seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                // 进度条停止拖动时
                int progress = seekBar.getProgress();
                iService.callDragSeekBar(progress);
            }
        });

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){

            case R.id.btn_start:
                iService.callStartMusic();
                break;

            case R.id.btn_pause:
                iService.callPauseMusic();
                break;

            case R.id.btn_stop:
                iService.callStopMusic();
                break;
        }
    }
}


你可能感兴趣的:(Android基础)