首先添加权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
并在主方法中请求权限:
requestPermissions(new String[]{
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE,
},119);
开始布局
<?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:orientation="vertical"
android:layout_height="match_parent"
tools:context=".MainActivity">
<ListView
android:id="@+id/lv"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="10"></ListView>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/now_tv"
android:text="当前进度"
android:layout_width="wrap_content"
android:layout_height="wrap_content"></TextView>
<SeekBar
android:id="@+id/seekbar"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"></SeekBar>
<TextView
android:id="@+id/all_tv"
android:text="总进度"
android:layout_width="wrap_content"
android:layout_height="wrap_content"></TextView>
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/artist_art"
android:src="@mipmap/ic_launcher"
android:layout_width="wrap_content"
android:layout_height="wrap_content"></ImageView>
<LinearLayout
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:id="@+id/title_tv"
android:text="歌曲"
android:layout_width="wrap_content"
android:layout_height="wrap_content"></TextView>
<TextView
android:layout_marginTop="20dp"
android:id="@+id/artist_tv"
android:text="演唱者"
android:layout_width="wrap_content"
android:layout_height="wrap_content"></TextView>
</LinearLayout>
<ImageView
android:src="@drawable/pre"
android:layout_width="0dp"
android:layout_height="70dp"
android:layout_weight="1"></ImageView>
<ImageView
android:id="@+id/rewind_iv"
android:src="@drawable/rewind"
android:layout_width="0dp"
android:layout_height="70dp"
android:layout_weight="1"></ImageView>
<CheckBox
android:id="@+id/play_iv"
android:button="@null"
android:background="@drawable/playorpause"
android:layout_width="0dp"
android:layout_height="70dp"
android:layout_weight="1"></CheckBox>
<ImageView
android:id="@+id/forword_iv"
android:src="@drawable/forward"
android:layout_width="0dp"
android:layout_height="70dp"
android:layout_weight="1"></ImageView>
<ImageView
android:src="@drawable/last"
android:layout_width="0dp"
android:layout_height="70dp"
android:layout_weight="1"></ImageView>
<ImageView
android:id="@+id/mode_iv"
android:src="@drawable/pop"
android:layout_width="0dp"
android:layout_height="70dp"
android:layout_weight="1"></ImageView>
</LinearLayout>
</LinearLayout>
通过软件自带的图片查找
开始按钮的drawable选择xml文件
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/play" android:state_checked="false"></item>
<item android:drawable="@drawable/pause" android:state_checked="true"></item>
</selector>
把音乐文件放在手机目录下
在MainActivity类的onCreate方法中通过ContentResolver获取音乐的属性
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 size = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.SIZE));
String album_id = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM_ID));
String artist = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));
}
}
}
创建音乐属性的封装类
public class Music {
private String title,artist,size,album_art,data,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 getSize() {
return size;
}
public void setSize(String size) {
this.size = size;
}
public String getAlbum_art() {
return album_art;
}
public void setAlbum_art(String album_art) {
this.album_art = album_art;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
public String getDuration() {
return duration;
}
public void setDuration(String duration) {
this.duration = duration;
}
public Music(String title, String artist, String size, String album_art, String data, String duration) {
this.title = title;
this.artist = artist;
this.size = size;
this.album_art = album_art;
this.data = data;
this.duration = duration;
}
}
再创建一个管理类使用单例模式创建
import android.media.MediaPlayer;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class MusicManager {
List<Music> musicList = new ArrayList<>();
MediaPlayer mediaPlayer = new MediaPlayer();
int index = 0;
private MusicManager() {
}
private static MusicManager musicManager = null;
public static MusicManager getInstance(){
if (musicManager==null){
musicManager=new MusicManager();
}
return musicManager;
}
}
再通过album_id属性获取音乐的封面
if (Integer.parseInt(duration)>5000){
Uri uri = Uri.parse("content://media/external/audio/albums/"+album_id);
Cursor cursor1 = contentResolver.query(uri, null, null, null,null);
while (cursor1.moveToNext()){
String album_art = cursor1.getString(cursor1.getColumnIndexOrThrow("album_art"));
int i = Integer.parseInt(duration);
String time = i/1000/60+":"+i/1000%60;
Music music = new Music(title, artist, size, album_art, data, time);
MusicManager.getInstance().musicList.add(music);
}
}
为listView创建item布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/artist_ivv"
android:src="@mipmap/ic_launcher"
android:layout_width="wrap_content"
android:layout_height="wrap_content"></ImageView>
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="70dp">
<TextView
android:text="歌曲"
android:id="@+id/title_tvv"
android:layout_alignParentTop="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"></TextView>
<TextView
android:text="演唱者"
android:id="@+id/artist_tvv"
android:layout_alignParentBottom="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"></TextView>
<TextView
android:text="时间"
android:id="@+id/time_tvv"
android:layout_alignParentRight="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"></TextView>
</RelativeLayout>
</LinearLayout>
实例化listView后定义适配器并设置适配器
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.List;
public class MyBaseAdapter extends BaseAdapter {
Context context;
List<Music> musicList;
public MyBaseAdapter(Context context, List<Music> musicList) {
this.context = context;
this.musicList = musicList;
}
@Override
public int getCount() {
return musicList.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHoulder viewHoulder = new ViewHoulder();
if (convertView==null){
convertView= LayoutInflater.from(context).inflate(R.layout.item,null);
viewHoulder.artist_ivv=convertView.findViewById(R.id.artist_ivv);
viewHoulder.artist_tvv=convertView.findViewById(R.id.artist_tvv);
viewHoulder.title_tvv=convertView.findViewById(R.id.title_tvv);
viewHoulder.time_tvv=convertView.findViewById(R.id.time_tvv);
convertView.setTag(viewHoulder);
}else {
viewHoulder = (ViewHoulder) convertView.getTag();
}
viewHoulder.title_tvv.setText(musicList.get(position).getTitle());
viewHoulder.time_tvv.setText(musicList.get(position).getDuration());
viewHoulder.artist_tvv.setText(musicList.get(position).getArtist());
Bitmap bitmap = BitmapFactory.decodeFile(musicList.get(position).getAlbum_art());
viewHoulder.artist_ivv.setImageBitmap(bitmap);
return convertView;
}
public class ViewHoulder{
TextView time_tvv,artist_tvv,title_tvv;
ImageView artist_ivv;
}
}
最后设置其他按钮的点击事件进度条的拖拽和快进按钮歌曲的点击播放
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
MusicManager.getInstance().play(position);
title_tv.setText(MusicManager.getInstance().musicList.get(position).getTitle());
artist_tv.setText(MusicManager.getInstance().musicList.get(position).getArtist());
Toast.makeText(MainActivity.this,"开始播放",Toast.LENGTH_SHORT).show();
}
});
play_iv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MusicManager.getInstance().playorpause();
}
});
forword_iv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MusicManager.getInstance().forword();
}
});
rewind_iv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MusicManager.getInstance().rewind();
}
});
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (fromUser){
MusicManager.getInstance().seekto(progress);
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
timer=new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
handler.post(new Runnable() {
@Override
public void run() {
int now = MusicManager.getInstance().getnow();
int all = MusicManager.getInstance().getall();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("mm:ss");
now_tv.setText(simpleDateFormat.format(now));
all_tv.setText(simpleDateFormat.format(all));
}
});
}
},0,111);
mode_iv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
PopupWindow popupWindow = new PopupWindow();
popupWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
popupWindow.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);
popupWindow.setOutsideTouchable(true);
View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.pop, null);
popupWindow.setContentView(view);
popupWindow.showAsDropDown(mode_iv,50,-300);
}
});
import android.media.MediaPlayer;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class MusicManager {
List<Music> musicList = new ArrayList<>();
MediaPlayer mediaPlayer = new MediaPlayer();
int index = 0;
private MusicManager() {
}
private static MusicManager musicManager = null;
public static MusicManager getInstance(){
if (musicManager==null){
musicManager=new MusicManager();
}
return musicManager;
}
public void play(int i){
index = i;
mediaPlayer.reset();
try {
mediaPlayer.setDataSource(musicList.get(index).getData());
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mediaPlayer.start();
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
public void playorpause(){
if (mediaPlayer.isPlaying()){
mediaPlayer.pause();
}else {
mediaPlayer.start();
}
}
public void forword(){
if (mediaPlayer.isPlaying()){
int currentPosition = mediaPlayer.getCurrentPosition();
currentPosition+=5000;
mediaPlayer.seekTo(currentPosition);
}
}
public void rewind(){
if (mediaPlayer.isPlaying()){
int currentPosition = mediaPlayer.getCurrentPosition();
currentPosition-=5000;
if (currentPosition<0){
currentPosition=0;
}
mediaPlayer.seekTo(currentPosition);
}
}
public void seekto(int i){
mediaPlayer.seekTo(i);
}
public int getnow(){
if (mediaPlayer.isPlaying()){
return mediaPlayer.getCurrentPosition();
}
return 0;
}
public int getall(){
if (mediaPlayer.isPlaying()){
return mediaPlayer.getDuration();
}
return 0;
}
}
效果