public class MainActivity extends AppCompatActivity implements View.OnClickListener, SeekBar.OnSeekBarChangeListener, MediaPlayer.OnCompletionListener { private MediaPlayer mediaPlayer;//播放音頻的 private Button mPreviousBtn; private Button mPlayBtn; private Button mNextBtn; private ListView mListView; private List<Song> list; private MyAdapter adapter; private SeekBar mSeekBar; private TextView mCurrentTimeTv; private TextView mTotalTimeTv; // 記錄當前播放歌曲的位置 private int mCurrentPosition; private Handler mHandler=new Handler(new Handler.Callback() { @Override public boolean handleMessage(Message message) { // 展示給進度條和當前時間 int progress = mediaPlayer.getCurrentPosition(); mSeekBar.setProgress(progress); mCurrentTimeTv.setText(parseTime(progress)); // 繼續定時發送數據 updateProgress(); return true; } }); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mediaPlayer = new MediaPlayer(); mPreviousBtn= (Button) findViewById(R.id.mPreviousBtn); mPlayBtn= (Button) findViewById(R.id.mPlayBtn); mNextBtn= (Button) findViewById(R.id.mNextBtn); mCurrentTimeTv= (TextView) findViewById(R.id.current_time_tv); mTotalTimeTv= (TextView) findViewById(R.id.total_time_tv); mSeekBar= (SeekBar) findViewById(R.id.seek_bar); mSeekBar.setOnSeekBarChangeListener(this); mPreviousBtn.setOnClickListener(this); mPlayBtn.setOnClickListener(this); mNextBtn.setOnClickListener(this); initView(); } /** * 初始化view */ private void initView() { mListView = (ListView) findViewById(R.id.main_listview); list = new ArrayList<>(); //把掃描到的音樂賦值給list list = MusicUtils.getMusicData(this); adapter = new MyAdapter(this,list); mListView.setAdapter(adapter); mediaPlayer.setOnCompletionListener(this); mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { //創建一個播放音頻的方法,把點擊到的地址傳過去 //list.get(i).path這個就是歌曲的地址 // String path = list.get(i).path; // Log.i("WDD",path); mCurrentPosition=i; changeMusic(mCurrentPosition); // play(list.get(i).path); // String singer = list.get(i).singer;//歌手 // String song = list.get(i).song;//歌曲名稱 // int duration = list.get(i).duration;//歌曲長度 // String time = MusicUtils.formatTime(duration); // String s=singer+"\n"+song+"\n"+time; // AlertDialog.Builder builder=new AlertDialog.Builder(MainActivity.this); // builder.setTitle("歌曲"); // builder.setMessage(s); // builder.show(); } }); } // /** // * 播放音頻的方法 // */ // private void play(String path) { // //播放之前要先把音頻文件重置 // try { // mediaPlayer.reset(); // //調用方法傳進去要播放的音頻路徑 // mediaPlayer.setDataSource(path); // //異步准備音頻資源 // mediaPlayer.prepareAsync(); // //調用mediaPlayer的監聽方法,音頻准備完畢會響應此方法 // mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { // @Override // public void onPrepared(MediaPlayer mediaPlayer) { // mediaPlayer.start();//開始音頻 // } // }); // } catch (IOException e) { // e.printStackTrace(); // } // } @Override public void onClick(View view) { if (view.getId()==R.id.mPreviousBtn){//上一曲 changeMusic(--mCurrentPosition); }else if (view.getId()==R.id.mPlayBtn){//暫停/播放 // 首次點擊播放按鈕,默認播放第0首 if (mediaPlayer==null){ changeMusic(0); }else { if (mediaPlayer.isPlaying()){ mediaPlayer.pause(); }else { mediaPlayer.start(); } } }else if (view.getId()==R.id.mNextBtn){// 下一首 changeMusic(++mCurrentPosition); } } // 基本數據類型和String在方法調用中傳遞的是值 // 其他數據類型在方法調用中傳遞的是引用 //切歌 private void changeMusic(int position){ if (position<0){ mCurrentPosition = position =list.size()-1; }else if (position>list.size()-1){ mCurrentPosition = position=0; } if (mediaPlayer==null){ mediaPlayer=new MediaPlayer(); } try { // 切歌之前先重置,釋放掉之前的資源 mediaPlayer.reset(); // 設置播放源 mediaPlayer.setDataSource(list.get(position).path); // 開始播放前的准備工作,加載多媒體資源,獲取相關信息 mediaPlayer.prepare(); // 開始播放 mediaPlayer.start(); } catch (IOException e) { e.printStackTrace(); } // 切歌時重置進度條並展示歌曲時長 mSeekBar.setProgress(0); mSeekBar.setMax(mediaPlayer.getDuration()); mTotalTimeTv.setText(parseTime(mediaPlayer.getDuration())); updateProgress(); } private void updateProgress() { // 使用Handler每間隔1s發送一次空消息,通知進度條更新 Message msg = Message.obtain();// 獲取一個現成的消息 // 使用MediaPlayer獲取當前播放時間除以總時間的進度 int progress = mediaPlayer.getCurrentPosition(); msg.arg1 = progress; mHandler.sendMessageDelayed(msg, INTERNAL_TIME); } private String parseTime(int oldTime) { SimpleDateFormat sdf = new SimpleDateFormat("mm:ss");// 時間格式 String newTime = sdf.format(new Date(oldTime)); return newTime; } private static final int INTERNAL_TIME = 1000;// 音樂進度間隔時間 @Override public void onProgressChanged(SeekBar seekBar, int i, boolean b) { } @Override public void onStartTrackingTouch(SeekBar seekBar) { } // 當手停止拖拽進度條時執行該方法 // 獲取拖拽進度 // 將進度對應設置給MediaPlayer @Override public void onStopTrackingTouch(SeekBar seekBar) { int progress = seekBar.getProgress(); mediaPlayer.seekTo(progress); } @Override public void onCompletion(MediaPlayer mediaPlayer) { changeMusic(++mCurrentPosition); } }
**
* 音樂工具類,
*/
public class MusicUtils {
/**
* 掃描系統里面的音頻文件,返回一個list集合
*/
public static List<Song> getMusicData(Context context) {
List<Song> list = new ArrayList<Song>();
// 媒體庫查詢語句(寫一個工具類MusicUtils)
Cursor cursor = context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null,
null, MediaStore.Audio.AudioColumns.IS_MUSIC);
if (cursor != null) {
while (cursor.moveToNext()) {
Song song = new Song();
song.song = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME));
song.singer = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));
song.path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));
song.duration = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION));
song.size = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.SIZE));
if (song.size > 1000 * 800) {
// 注釋部分是切割標題,分離出歌曲名和歌手 (本地媒體庫讀取的歌曲信息不規范)
if (song.song.contains("-")) {
String[] str = song.song.split("-");
song.singer = str[0];
song.song = str[1];
}
list.add(song);
}
}
// 釋放資源
cursor.close();
}
return list;
}
/**
* 定義一個方法用來格式化獲取到的時間
*/
public static String formatTime(int time) {
if (time / 1000 % 60 < 10) {
return time / 1000 / 60 + ":0" + time / 1000 % 60;
} else {
return time / 1000 / 60 + ":" + time / 1000 % 60;
}
}
}
package com.example.lenovo.yinyuekao2;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import java.util.List;
public class MyAdapter extends BaseAdapter {
private Context context;
private List<Song> list;
public MyAdapter(MainActivity mainActivity, List<Song> list) {
this.context = mainActivity;
this.list = list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int i) {
return list.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(final int i, View view, ViewGroup viewGroup) {
ViewHolder holder = null;
if (view == null) {
holder = new ViewHolder();
//引入布局
view = View.inflate(context, R.layout.item_music_listview, null);
//實例化對象
holder.song = (TextView) view.findViewById(R.id.item_mymusic_song);
holder.singer = (TextView) view.findViewById(R.id.item_mymusic_singer);
holder.duration = (TextView) view.findViewById(R.id.item_mymusic_duration);
holder.position = (TextView) view.findViewById(R.id.item_mymusic_postion);
view.setTag(holder);
} else {
holder = (ViewHolder) view.getTag();
}
//給控件賦值
holder.song.setText(list.get(i).song.toString());
holder.singer.setText(list.get(i).singer.toString());
//時間需要轉換一下
int duration = list.get(i).duration;
String time = MusicUtils.formatTime(duration);
holder.duration.setText(time);
holder.position.setText(i+1+"");
return view;
}
class ViewHolder{
TextView song;//歌曲名
TextView singer;//歌手
TextView duration;//時長
TextView position;//序號
String parh;//地址
}
}
package com.example.lenovo.yinyuekao2; /** * Created by LENOVO on 2017/11/7. */ /** * Created by user on 2016/6/24. * 放置音樂 */ public class Song { /** * 歌手 */ public String singer; /** * 歌曲名 */ public String song; /** * 歌曲的地址 */ public String path; /** * 歌曲長度 */ public int duration; /** * 歌曲的大小 */ public long size; }
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.lenovo.yinyuekao2.MainActivity">
<LinearLayout
android:orientation="horizontal"
android:id="@+id/main_textview"
android:layout_width="match_parent"
android:layout_height="40dp">
<Button
android:id="@+id/mPreviousBtn"
android:text="上一曲"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent" />
<Button
android:id="@+id/mPlayBtn"
android:text="播放/暫停"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent" />
<Button
android:id="@+id/mNextBtn"
android:text="下一曲"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent" />
</LinearLayout>
<RelativeLayout
android:id="@+id/main_textview1"
android:layout_below="@+id/main_textview"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/current_time_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="當前時間"/>
<TextView
android:id="@+id/total_time_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:text="全部時間"/>
<SeekBar
android:id="@+id/seek_bar"
style="?android:progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_toLeftOf="@id/total_time_tv"
android:layout_toRightOf="@id/current_time_tv"/>
</RelativeLayout>
<ListView
android:id="@+id/main_listview"
android:layout_below="@+id/main_textview1"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>
<?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="110dp"
android:orientation="horizontal"
android:gravity="center_vertical"
android:padding="5dp">
<TextView
android:id="@+id/item_mymusic_postion"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:text="1"
android:gravity="center"
android:textColor="#0d0c0c"
android:textSize="18sp" />
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
>
<TextView
android:id="@+id/item_mymusic_song"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="歌曲名"
android:textColor="#0d0c0c"
android:textSize="20dp" />
<TextView
android:id="@+id/item_mymusic_singer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/item_mymusic_song"
android:text="歌手"
android:textColor="#0d0c0c"
android:textSize="15sp" />
<TextView
android:id="@+id/item_mymusic_duration"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/item_mymusic_song"
android:layout_marginLeft="15dp"
android:textColor="#0d0c0c"
android:layout_toRightOf="@+id/item_mymusic_singer"
android:text="時間"
android:textSize="15sp" />
</RelativeLayout>
</LinearLayout>
記得加上權限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
