音乐播放器

import androidx.appcompat.app.AppCompatActivity;

import android.database.Cursor;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Handler;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

private final String TAG = "##";
private Button local, last, play, stop, next;
private ListView listView;
private TextView name;
private SeekBar seekBar;
private MyThread thread;
private Handler handler = new Handler();
private ArrayAdapter<String> adapter;
private List<String> datas;
private List<String> musicPath;
private MediaPlayer mediaPlayer;
private int position;
private int playTime = 0;

private final String CANT_PLAY = "未准备完成";
private final String CAN_PLAY = "准备完成";
private final String PLAYING = "播放中";
private final String PAUSE = "暂停";

private String isCanStart = CANT_PLAY;//播放状态0:未准备完成 1准备完成 2播放中 3暂停

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


//初始化控件的方法
private void initCtrl() {
    local = findViewById(R.id.local);
    last = findViewById(R.id.last);
    play = findViewById(R.id.play);
    stop = findViewById(R.id.stop);
    next = findViewById(R.id.next);
    name = findViewById(R.id.name);
    listView = findViewById(R.id.listView);
    seekBar = findViewById(R.id.seekBar);

    mediaPlayer = new MediaPlayer();
    datas = new ArrayList<>();
    musicPath = new ArrayList<>();
    adapter = new ArrayAdapter<>(this, android.R.layout.select_dialog_item, datas);

    listView.setAdapter(adapter);

    Log.i(TAG, "init: ");

    //单机监听
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            if (isCanStart.equals(CANT_PLAY)) {
                Toast.makeText(MainActivity.this, "先加载音乐", Toast.LENGTH_SHORT).show();
                return;
            }
            Log.i(TAG, "onItemClick: listView");
            thread = new MyThread();
            initMediaPlayer(musicPath.get(i), datas.get(i), i, 1);
        }
    });

    //进度条监听
    seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            playTime = seekBar.getProgress();
            mediaPlayer.seekTo(playTime);
        }
    });

    local.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            localMusic();
        }
    });

}


public void click(View view) {
    if (isCanStart.equals(CANT_PLAY)) {
        Toast.makeText(this, "先加载音乐", Toast.LENGTH_SHORT).show();
        return;
    }
    switch (view.getId()) {
        case R.id.last:
            lastMusic();
            break;
        case R.id.play:
            playMusic();
            break;
        case R.id.stop:
            stopMusic();
            break;
        case R.id.next:
            nextMusic();
            break;
    }
}

//加载本机音乐的方法
private void localMusic() {
    Log.i(TAG, "localMusic: ");
    datas.clear();
    musicPath.clear();
    Cursor cursor = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, null);
    if (cursor == null || cursor.getCount() <= 0) {
        datas.add("没有音乐");
    } else {
        while (cursor.moveToNext()) {
            String title = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));
            String data = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));
            datas.add(title);
            musicPath.add(data);
        }
        initMediaPlayer(musicPath.get(0), datas.get(0), 0, 1);
    }
    adapter.notifyDataSetChanged();
}

//初始化音乐的方法
private void initMediaPlayer(String musicPath, final String musicName, final int code, final int stop) {
    Log.i(TAG, "initMediaPlayer: ");
    mediaPlayer.reset();
    File file = new File(musicPath);
    try {
        Log.i(TAG, "file.getPath(): " + file.getPath());
        mediaPlayer.setDataSource(file.getPath());
        mediaPlayer.prepareAsync();
        mediaPlayer.seekTo(playTime);
        mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mediaPlayer) {
                name.setText(musicName);
                isCanStart = CAN_PLAY;
                seekBar.setMax(mediaPlayer.getDuration());
                if (code != 0 && stop != 0) {
                    playMusic();
                }
            }
        });
    } catch (IOException e) {
        e.printStackTrace();
    }
}


//播放音乐的方法
private void playMusic() {
    thread = new MyThread();
    if (isCanStart.equals(PAUSE) || isCanStart.equals(CAN_PLAY)) {
        play.setText("pause");
        mediaPlayer.start();
        isCanStart = PLAYING;
        thread.start();
    } else if (isCanStart.equals(PLAYING)) {
        play.setText("play");
        mediaPlayer.pause();
        isCanStart = PAUSE;
    }
    Log.i(TAG, "playMusic: " + isCanStart);
}

private void stopMusic() {
    mediaPlayer.stop();
    play.setText("PLAY");
    isCanStart = CAN_PLAY;
    initMediaPlayer(musicPath.get(position), datas.get(position), position, 0);
    playTime = 0;
    seekBar.setProgress(playTime);
}

private void nextMusic() {
    playTime = 0;
    thread = new MyThread();
    if (position + 1 > datas.size() - 1) {
        position = 0;
    } else {
        position += 1;
    }
    initMediaPlayer(musicPath.get(position), datas.get(position), position, 1);
}

private void lastMusic() {
    playTime = 0;
    thread = new MyThread();
    if (position - 1 < 0) {
        position = musicPath.size() - 1;
    } else {
        position -= 1;
    }
    initMediaPlayer(musicPath.get(position), datas.get(position), position, 1);
}


class MyThread extends Thread {

    @Override
    public void run() {
        super.run();
        while (mediaPlayer.isPlaying()) {
            playTime = mediaPlayer.getCurrentPosition();
            if (playTime >= mediaPlayer.getDuration())
                break;
            handler.post(new Runnable() {
                @Override
                public void run() {
                    seekBar.setProgress(playTime);
                }
            });
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值