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();
}
}
}
}
}