【Android 本地音乐播放器 一个简单的音乐播放器——附源码】

无聊做了一个本地音乐播放器,功能有:获取本地的音乐文件,对音乐进行播放,可以上一首,下一首,列表循环播放,单曲循环播放,随机播放。

页面很简单,只有两个页面页面如图所示:

视频预览:

主要代码讲解:

权限申请

在清单文件中加入权限

 

然后发起权限申请

//请求权限
        requestPermissions(new String[]{
                android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
                android.Manifest.permission.READ_EXTERNAL_STORAGE,
        },0); 

权限申请结果

 @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        boolean grant=true;
        if (requestCode==0){
            for (Integer integer:grantResults){
                if (integer != 0) {
                    grant = false;
                    break;
                }
            }
            //权限给了,就获取音乐
            if (grant){
                getMusic();
            }
        }
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

获取本地音乐

//使用ContentResolver获取音乐
    private void getMusic(){
        ContentResolver contentResolver = getContentResolver();
        Cursor cursor = contentResolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, null);
        if (cursor!=null){
            while (cursor.moveToNext()){
                String title = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));
                String data = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));
                String duration = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION));
                String artist = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));
                if (duration==null)continue;
                if (Integer.parseInt(duration)>5000){
                    int i = Integer.parseInt(duration);
                    String time = String.format(getString(R.string.s_s), format(i / 1000 / 60), format(i / 1000 % 60));
                    Music music = new Music(title, artist, data, time,i);
                    musicList.add(music);
                }
                musicAdapter.notifyDataSetChanged();
                App.getService().setMusicList(musicList);
            }
            cursor.close();
        }
    }

设置音乐信息

 private void setMusic(Music music){
        //设置音乐名
        title.setText(music.getTitle());
        cover.setImageResource(R.drawable.music);
        //显示音乐进度条时长
        end.setText(music.getTime());
        //设置进度条总时长
        seekBar.setMax(music.getDuration()/1000);
        //进度条拖动监听
        seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                if (fromUser&&App.getService().isPlaying()) {
                    App.getService().seekTo(progress*1000);
                    start.setText(String.format(getString(R.string.s_s), format(progress / 60), format(progress % 60)));
                }
            }
            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
                // 不需要处理
            }
            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                if (!App.getService().isPlaying()){
                    start.setText(R.string._00_00);
                    seekBar.setProgress(0);
                }
            }
        });
    }

更新进度条

 //更新进度条
    private void updateSeekBar() {
        runnable = new Runnable() {
            @Override
            public void run() {
                if (App.getService() != null&&App.getService().isPlaying()) {
                    rotationAnimator.resume();
                    btn_play.setImageResource(R.drawable.ic_play_btn_pause);
                    int currentPosition = App.getService().getNow();
                    seekBar.setProgress(currentPosition/1000);
                    start.setText(String.format(getString(R.string.s_s), format(currentPosition / 1000 / 60), format(currentPosition / 1000 % 60)));
                }
                else {
                    rotationAnimator.pause();
                    btn_play.setImageResource(R.drawable.ic_play_btn_play);
                }
                handler.postDelayed(this, 1000); // 每秒更新一次进度条
            }
        };
        handler.postDelayed(runnable, 0);
    }

Music实体类

public class Music implements Serializable {
    private String title,artist,data, time;
    private int duration;
    public String getTitle() {
        return title;
    }
 
    public void setTitle(String title) {
        this.title = title;
    }
 
    public String getArtist() {
        return artist;
    }
 
    public void setArtist(String artist) {
        this.artist = artist;
    }
 
    public String getData() {
        return data;
    }
 
    public void setData(String data) {
        this.data = data;
    }
 
    public String getTime() {
        return time;
    }
 
    public void setTime(String time) {
        this.time = time;
    }
    public int getDuration() {
        return duration;
    }
    public void setDuration(int duration) {
        this.duration = duration;
    }
    public Music(String title, String artist, String data, String time, int duration) {
        this.title = title;
        this.artist = artist;
        this.data = data;
        this.time = time;
        this.duration = duration;
    }
}

音乐播放服务

public class MusicService extends Service implements MediaPlayer.OnCompletionListener{
    private final IBinder binder = new MusicBinder();
    private MediaPlayer mediaPlayer;
    private List musicList=new ArrayList<>();
    private int position;
    private int status=0;
    private Music music;
    private Random random = new Random();
    private int lowerBound = 0; // 最小值
    private int upperBound = 0; // 最大值
    public MusicService() {
    }
    @Override
    public void onCreate() {
        super.onCreate();
        if (mediaPlayer==null){
            mediaPlayer=new MediaPlayer();
            mediaPlayer.setOnCompletionListener(this);
        }
    }
    //判断是否正在播放
    public boolean isPlaying(){
        return mediaPlayer.isPlaying();
    }
    //设置音乐
    public void setMusic(Music music){
        if (music!=null){
            this.music=music;
            RxBus.getDefault().removeAllStickyEvents();
            RxBus.getDefault().postSticky(music);
            mediaPlayer.reset();
            try {
                mediaPlayer.setDataSource(music.getData());
                mediaPlayer.prepare();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    public Music getMusic(int position){
        if (position>=0&&position=0&&position musicList) {
        this.musicList = musicList;
        upperBound=musicList.size()-1;
    }
    //上一首
    public void pre(){
        if (status==1){
            randomPlay();
        }
        else {
            position=(position-1) % musicList.size();
            if (position<0){
                position=musicList.size()-1;
            }
            Music music = musicList.get(position);
            if (music!=null){
                setMusic(music);
                playOrPause();
            }
        }
    }
    //下一首
    public void next(){
        if (status==1){
            randomPlay();
        }
        else {
            position=(position+1) % (musicList.size());
            Music music = musicList.get(position);
            if (music!=null){
                setMusic(music);
                playOrPause();
            }
        }
    }
    //真·随机播放
    public void randomPlay(){
        position=random.nextInt(upperBound - lowerBound + 1) + lowerBound;
        setData(position);
        playOrPause();
    }
    //单曲循环
    public void loop(){
        setData(position);
        playOrPause();
    }
    public void setStatus(int status){
        this.status=status;
    }
    public int getStatus() {
        return status;
    }
    public Music getNowPlay(){
        return music;
    }
    //播放
    public void playOrPause(){
        if (mediaPlayer.isPlaying()){
            mediaPlayer.pause();
        }
        else {
            mediaPlayer.start();
        }
    }
    //进度改变
    public void seekTo(int i){
        mediaPlayer.seekTo(i);
    }
    //获取当前的播放进度
    public int getNow(){
        if (mediaPlayer.isPlaying()){
            return mediaPlayer.getCurrentPosition();
        }
        return 0;
    }
    @Override
    public IBinder onBind(Intent intent) {
        return binder;
    }
    @Override
    public void onCompletion(MediaPlayer mp) {
        if (status==0){
            next();
        }
        else if (status==1){
            randomPlay();
        }
        else if (status==2){
            loop();
        }
    }
    public class MusicBinder extends Binder{
        //返回Service对象
        MusicService getService(){
            return MusicService.this;
        }
    }
    public interface OnStatusChangeListener{
        void onChange(Music music);
    }
}

源码

下载地址:源码下载