布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MusicActivity">
<ListView
android:id="@+id/list_music"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="9">
</ListView>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
<ImageView
android:id="@+id/img_head"
android:layout_width="60dp"
android:layout_height="60dp"
android:src="@mipmap/ic_launcher" />
<LinearLayout
android:layout_width="180dp"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingLeft="10dp">
<SeekBar
android:id="@+id/seek"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/music_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="歌名" />
<TextView
android:id="@+id/singer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:text="歌手名" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp">
<ImageButton
android:background="@null"
android:id="@+id/ib_menu"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_marginRight="10dp"
android:src="@drawable/menu" />
<ImageButton
android:background="@null"
android:id="@+id/ib_left"
android:layout_width="20dp"
android:layout_height="30dp"
android:src="@drawable/left" />
<ImageButton
android:layout_marginLeft="10dp"
android:background="@null"
android:layout_marginRight="10dp"
android:id="@+id/ib_pause"
android:layout_width="30dp"
android:layout_height="30dp"
android:src="@drawable/play" />
<ImageButton
android:id="@+id/ib_right"
android:layout_width="20dp"
android:layout_height="30dp"
android:background="@null"
android:src="@drawable/right" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
子布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/img_show"
android:layout_width="80dp"
android:layout_height="80dp"
android:src="@mipmap/ic_launcher" />
<LinearLayout
android:layout_marginTop="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingLeft="20dp">
<TextView
android:id="@+id/music_show"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="歌名" />
<TextView
android:id="@+id/singer_show"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:text="歌手名" />
</LinearLayout>
<TextView
android:layout_marginTop="10dp"
android:id="@+id/time_show"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="150dp"
android:text="123456" />
</LinearLayout>
</LinearLayout>
音乐类
class Music {
private String song;
private String singer;
private String time;
private String data;
private String size;
private String pic;
public Music() {
}
@Override
public String toString() {
return "Music{" +
"song='" + song + '\'' +
", singer='" + singer + '\'' +
", time='" + time + '\'' +
", data='" + data + '\'' +
", size='" + size + '\'' +
", pic='" + pic + '\'' +
'}';
}
public String getSong() {
return song;
}
public void setSong(String song) {
this.song = song;
}
public String getSinger() {
return singer;
}
public void setSinger(String singer) {
this.singer = singer;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
public String getSize() {
return size;
}
public void setSize(String size) {
this.size = size;
}
public String getPic() {
return pic;
}
public void setPic(String pic) {
this.pic = pic;
}
public Music(String song, String singer, String time, String data, String size, String pic) {
this.song = song;
this.singer = singer;
this.time = time;
this.data = data;
this.size = size;
this.pic = pic;
}
}
音乐工具类
public class MusicUtils {
public static final int SINGLE = 0;
public static final int ORDER = 1;
public static final int RANDOM = 2;
public static List<Music> getMusics(Context context){
Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
List<Music> musics = new ArrayList<>();
ContentResolver contentResolver = context.getContentResolver();
Cursor cursor = contentResolver.query(uri, null, null, null, null);
if (cursor != null) {
while (cursor.moveToNext()) {
String title = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));
String artist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));
String duration = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION));
String data = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));
String size = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.SIZE));
String id = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID));
if (Integer.parseInt(duration) > 6000) {
Music music = new Music(title, artist, duration, data, size, id);
musics.add(music);
}
}
cursor.close();
}
return musics;
}
}
适配器
public class Myadpter extends BaseAdapter {
private List<Music> musics;
private Context context;
private LayoutInflater layoutInflater;
public Myadpter(List<Music> music, Context context) {
this.musics = music;
this.context = context;
layoutInflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return musics.size();
}
@Override
public Object getItem(int position) {
return musics.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = null;
if (convertView == null) {
convertView = layoutInflater.inflate(R.layout.item_layout, null);
viewHolder = new ViewHolder();
viewHolder.imgShow = convertView.findViewById(R.id.img_show);
viewHolder.musicShow = convertView.findViewById(R.id.music_show);
viewHolder.singerShow = convertView.findViewById(R.id.singer_show);
viewHolder.time = convertView.findViewById(R.id.time_show);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
Music music = musics.get(position);
viewHolder.musicShow.setText(music.getSong());
viewHolder.singerShow.setText(music.getSinger());
SimpleDateFormat sdf = new SimpleDateFormat("mm:ss");
long l = Long.parseLong(music.getTime());
String format = sdf.format(l);
viewHolder.time.setText(format);
return convertView;
}
class ViewHolder {
private ImageView imgShow;
private TextView musicShow;
private TextView singerShow;
private TextView time;
}
}
Activity代码
public class MusicActivity extends AppCompatActivity {
private ListView listMusic;
private ImageView imgHead;
private TextView musicName;
private TextView singer;
private ImageButton ibLeft;
private ImageButton ibPause;
private ImageButton ibRight;
private Myadpter myadpter;
private List<Music> musics = new ArrayList<>();
private static final String TAG = "MusicActivity";
private MediaPlayer mediaPlayer;
private SeekBar seek;
private Timer timer;
private int playMode = 0;
private int nowPosition = 0;
private boolean flag = false;
private ImageButton ibMenu;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_music);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 100);
}
initViews();
initDates();
}
private void initDates() {
List<Music> dates = MusicUtils.getMusics(MusicActivity.this);
musics.addAll(dates);
myadpter.notifyDataSetChanged();
}
private void initViews() {
ibMenu = (ImageButton) findViewById(R.id.ib_menu);
listMusic = (ListView) findViewById(R.id.list_music);
imgHead = (ImageView) findViewById(R.id.img_head);
musicName = (TextView) findViewById(R.id.music_name);
singer = (TextView) findViewById(R.id.singer);
ibLeft = (ImageButton) findViewById(R.id.ib_left);
ibPause = (ImageButton) findViewById(R.id.ib_pause);
ibRight = (ImageButton) findViewById(R.id.ib_right);
mediaPlayer = new MediaPlayer();
seek = (SeekBar) findViewById(R.id.seek);
myadpter = new Myadpter(musics, MusicActivity.this);
listMusic.setAdapter(myadpter);
ibMenu.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final PopupWindow popupWindow = new PopupWindow();
popupWindow.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);
popupWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
popupWindow.setOutsideTouchable(true);
View view = LayoutInflater.from(MusicActivity.this).inflate(R.layout.pop_layout, null);
TextView random = view.findViewById(R.id.pop_random);
random.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
popupWindow.dismiss();
playMode = MusicUtils.RANDOM;
}
});
TextView single = view.findViewById(R.id.pop_single);
single.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
popupWindow.dismiss();
playMode = MusicUtils.SINGLE;
}
});
TextView order = view.findViewById(R.id.pop_order);
order.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
popupWindow.dismiss();
playMode = MusicUtils.ORDER;
}
});
popupWindow.setContentView(view);
popupWindow.showAsDropDown(ibMenu, 0, -300);
}
});
ibPause.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (flag) {
mediaPlayer.start();
flag = false;
ibPause.setImageResource(R.drawable.pause);
} else {
if (mediaPlayer.isPlaying()) {
mediaPlayer.pause();
flag = true;
ibPause.setImageResource(R.drawable.play);
}
}
}
});
listMusic.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
nowPosition = position;
playMusic(position);
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
switch (playMode) {
case MusicUtils.SINGLE:
playMusic(nowPosition);
break;
case MusicUtils.ORDER:
if (++nowPosition > musics.size() - 1) {
nowPosition = 0;
}
playMusic(nowPosition);
break;
case MusicUtils.RANDOM:
int i = new Random().nextInt(musics.size());
playMusic(i);
break;
}
}
});
}
});
seek.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (fromUser) {
mediaPlayer.seekTo(progress);
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
ibLeft.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (--nowPosition < 0) {
nowPosition = 0;
}
playMusic(nowPosition);
}
});
ibRight.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (++nowPosition > musics.size() - 1) {
nowPosition = 0;
}
playMusic(nowPosition);
}
});
}
private void playMusic(int position) {
if (timer != null) {
timer.cancel();
}
try {
Music music = musics.get(position);
ibPause.setImageResource(R.drawable.pause);
mediaPlayer.reset();
seek.setMax(Integer.parseInt(music.getTime()));
mediaPlayer.setDataSource(music.getData());
mediaPlayer.prepareAsync();
musicName.setText(music.getSong());
singer.setText(music.getSinger());
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mediaPlayer.start();
}
});
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
seek.setProgress(mediaPlayer.getCurrentPosition());
}
}, 0, 1000);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == 100 && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
} else {
finish();
}
}
}
获取数据需要遍历SD卡中的音乐
public static List<Music> getMusics(Context context){
Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
List<Music> musics = new ArrayList<>();
ContentResolver contentResolver = context.getContentResolver();
Cursor cursor = contentResolver.query(uri, null, null, null, null);
if (cursor != null) {
while (cursor.moveToNext()) {
String title = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));
String artist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));
String duration = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION));
String data = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));
String size = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.SIZE));
String id = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID));
if (Integer.parseInt(duration) > 6000) {
Music music = new Music(title, artist, duration, data, size, id);
musics.add(music);
}
}
cursor.close();
}
return musics;
}
播放和进度条
listMusic.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
nowPosition = position;
playMusic(position);
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
switch (playMode) {
case MusicUtils.SINGLE:
playMusic(nowPosition);
break;
case MusicUtils.ORDER:
if (++nowPosition > musics.size() - 1) {
nowPosition = 0;
}
playMusic(nowPosition);
break;
case MusicUtils.RANDOM:
int i = new Random().nextInt(musics.size());
playMusic(i);
break;
}
}
});
}
});
seek.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (fromUser) {
mediaPlayer.seekTo(progress);
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
private void playMusic(int position) {
if (timer != null) {
timer.cancel();
}
try {
Music music = musics.get(position);
ibPause.setImageResource(R.drawable.pause);
mediaPlayer.reset();
seek.setMax(Integer.parseInt(music.getTime()));
mediaPlayer.setDataSource(music.getData());
mediaPlayer.prepareAsync();
musicName.setText(music.getSong());
singer.setText(music.getSinger());
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mediaPlayer.start();
}
});
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
seek.setProgress(mediaPlayer.getCurrentPosition());
}
}, 0, 1000);
} catch (IOException e) {
e.printStackTrace();
}
}
音乐播放模式
ibMenu.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final PopupWindow popupWindow = new PopupWindow();
popupWindow.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);
popupWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
popupWindow.setOutsideTouchable(true);
View view = LayoutInflater.from(MusicActivity.this).inflate(R.layout.pop_layout, null);
TextView random = view.findViewById(R.id.pop_random);
random.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
popupWindow.dismiss();
playMode = MusicUtils.RANDOM;
}
});
TextView single = view.findViewById(R.id.pop_single);
single.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
popupWindow.dismiss();
playMode = MusicUtils.SINGLE;
}
});
TextView order = view.findViewById(R.id.pop_order);
order.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
popupWindow.dismiss();
playMode = MusicUtils.ORDER;
}
});
popupWindow.setContentView(view);
popupWindow.showAsDropDown(ibMenu, 0, -300);
}
});