一個簡單的音樂播放器(實現上一曲下一曲,和自動播放)
阿新 • • 發佈:2019-02-07
參考兩位部落格完成:
https://blog.csdn.net/i_do_can/article/details/50913656,點選開啟連結
註釋比較詳細,直接上程式碼了
Mainactivity.java
package com.example.lancer.lancermusicplayer; import android.media.MediaPlayer; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.SeekBar; import android.widget.TextView; import com.example.lancer.lancermusicplayer.bean.Info; import com.example.lancer.lancermusicplayer.util.musicUtil; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import butterknife.ButterKnife; import butterknife.InjectView; public class MainActivity extends AppCompatActivity implements View.OnClickListener, SeekBar.OnSeekBarChangeListener, MediaPlayer.OnCompletionListener { @InjectView(R.id.musicListView) ListView musicListView; //lsitview展示資料的 @InjectView(R.id.seekBar) SeekBar mSeekBar; //seekbar 進度條顯示 @InjectView(R.id.current_time_tv) //播放時的時間 TextView mCurrentTimeTv; @InjectView(R.id.total_time_tv) TextView mTotalTimeTv; //歌曲總時間 @InjectView(R.id.previous) ImageView up; //上一曲按鈕 @InjectView(R.id.play_pause) ImageView play; //播放暫停按鈕 @InjectView(R.id.next) ImageView next; //下一曲按鈕 @InjectView(R.id.now) TextView now; //當前播放歌曲名稱 private musicUtil util; //音樂工具類,用於獲取手機上的音樂 private ArrayList<Info> musicList; //裝了音樂資訊的listView private MusicAdapter adapter; private int currentposition; //當前音樂播放位置 private MediaPlayer mediaPlayer; 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); ButterKnife.inject(this);//初始化資料 mediaPlayer = new MediaPlayer(); up.setOnClickListener(this); play.setOnClickListener(this); next.setOnClickListener(this); mSeekBar.setOnSeekBarChangeListener(this); mediaPlayer.setOnCompletionListener(this);//監聽音樂播放完畢事件,自動下一曲 initData(); } /** * 初始化資料 */ private void initData() { util = new musicUtil(); musicList = new ArrayList<>(); musicList = util.getMusicInfo(this); adapter = new MusicAdapter(); musicListView.setAdapter(adapter); musicListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { currentposition = position; //獲取當前點選條目的位置 changeMusic(currentposition); //切歌 String title = musicList.get(currentposition).getTitle(); now.setText(title); //展示當前播放的歌名 } }); } /** * 上一曲下一曲點選事件 * * @param view */ @Override public void onClick(View view) { if (view.getId() == R.id.previous) {//上一曲 changeMusic(--currentposition); String title = musicList.get(currentposition).getTitle(); now.setText(title); //展示上一曲的歌名 } else if (view.getId() == R.id.play_pause) {//暫停/播放 // 首次點選播放按鈕,預設播放第0首 if (mediaPlayer == null) { changeMusic(0); } else { if (mediaPlayer.isPlaying()) { mediaPlayer.pause(); } else { mediaPlayer.start(); } } } else if (view.getId() == R.id.next) {// 下一首 changeMusic(++currentposition); String title = musicList.get(currentposition).getTitle(); now.setText(title);//展示下一首的歌名 } } private void changeMusic(int position) { if (position < 0) { currentposition = position = musicList.size() - 1; } else if (position > musicList.size() - 1) { currentposition = position = 0; } if (mediaPlayer == null) { mediaPlayer = new MediaPlayer(); } try { // 切歌之前先重置,釋放掉之前的資源 mediaPlayer.reset(); // 設定播放源 mediaPlayer.setDataSource(musicList.get(position).getUrl()); // 開始播放前的準備工作,載入多媒體資源,獲取相關資訊 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); } /** * 時間格式化 * * @param oldTime * @return */ 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 mp) { changeMusic(++currentposition); } //音樂播放器的介面卡 public class MusicAdapter extends BaseAdapter { @Override public int getCount() { return musicList.size(); } @Override public Info getItem(int position) { return musicList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder; if (convertView == null) { convertView = View.inflate(MainActivity.this, R.layout.music_item, null); viewHolder = new ViewHolder(); viewHolder.video_imageView = convertView.findViewById(R.id.video_imageView); viewHolder.video_title = convertView.findViewById(R.id.video_title); viewHolder.video_singer = convertView.findViewById(R.id.video_singer); /* viewHolder.video_duration = convertView.findViewById(R.id.video_duration);*/ // viewHolder.video_size = convertView.findViewById(R.id.video_size); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } Info item = getItem(position); viewHolder.video_singer.setText(item.getArtist()); // viewHolder.video_size.setText((int) item.getSize()); viewHolder.video_title.setText(item.getTitle()); /* viewHolder.video_duration.setText(item.getDuration());*/ return convertView; } } static class ViewHolder { ImageView video_imageView; TextView video_title; TextView video_singer; /* TextView video_duration; TextView video_size;*/ } }
package com.example.lancer.lancermusicplayer.util; import android.content.ContentResolver; import android.content.Context; import android.database.Cursor; import android.provider.MediaStore; import com.example.lancer.lancermusicplayer.bean.Info; import java.util.ArrayList; public class musicUtil { Info info;//音樂資訊類 public ArrayList<Info> InfoList;//將音樂資訊填充到該集合中 public ArrayList<Info> getMusicInfo(Context context) { InfoList = new ArrayList<>(); ContentResolver resolver = context.getContentResolver(); Cursor cursor = resolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null , null); if (cursor != null && cursor.getCount() > 0) { Info info = null; while (cursor.moveToNext()) { info = new Info(); info.setArtist(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST))); info.setTitle((cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE)))); info.setDuration(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION))); info.setUrl(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA))); // info.setSize(cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Media.SIZE))); InfoList.add(info); } } return InfoList; } }
activity_main.java:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout 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" tools:context="com.example.lancer.lancermusicplayer.MainActivity"> <ListView android:id="@+id/musicListView" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_above="@+id/seekBar" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /> <SeekBar android:id="@+id/seekBar" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_above="@+id/current_time_tv" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /> <TextView android:id="@+id/current_time_tv" android:layout_width="100dp" android:layout_height="25dp" android:layout_above="@+id/previous" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:gravity="center" /> <TextView android:id="@+id/total_time_tv" android:layout_width="100dp" android:layout_height="25dp" android:layout_alignEnd="@+id/play_pause" android:layout_alignRight="@+id/play_pause" android:layout_below="@+id/seekBar" android:gravity="center" /> <TextView android:id="@+id/now" android:layout_width="100dp" android:layout_height="25dp" android:layout_alignParentEnd="true" android:layout_alignParentRight="true" android:layout_below="@+id/seekBar" android:layout_marginEnd="30dp" android:layout_marginRight="30dp" android:gravity="center" /> <ImageView android:id="@+id/previous" android:layout_width="50dp" android:layout_height="50dp" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:background="@drawable/previous" /> <ImageView android:id="@+id/play_pause" android:layout_width="50dp" android:layout_height="50dp" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:background="@drawable/play" /> <ImageView android:id="@+id/next" android:layout_width="50dp" android:layout_height="50dp" android:layout_alignParentBottom="true" android:layout_alignParentEnd="true" android:layout_alignParentRight="true" android:background="@drawable/next" /> </RelativeLayout>
listview條目xm
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="10dp">
<ImageView
android:id="@+id/video_imageView"
android:layout_width="60dp"
android:layout_height="60dp"
android:src="@drawable/music"
android:padding="10dp"/>
<TextView
android:id="@+id/video_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/video_singer"
android:layout_alignStart="@+id/video_singer"
android:layout_alignTop="@+id/video_size"
android:text="title " />
<TextView
android:id="@+id/video_singer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/video_duration"
android:layout_alignBottom="@+id/video_duration"
android:layout_marginLeft="20dp"
android:layout_marginStart="20dp"
android:layout_toEndOf="@+id/video_imageView"
android:layout_toRightOf="@+id/video_imageView"
android:text="singer" />
<TextView
android:id="@+id/video_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/video_duration"
android:layout_alignLeft="@+id/video_duration"
android:layout_alignStart="@+id/video_duration"
/>
<TextView
android:id="@+id/video_duration"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/video_imageView"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_marginBottom="15dp"
android:layout_marginEnd="75dp"
android:layout_marginRight="75dp"
/>
</RelativeLayout>
音樂資訊類:
package com.example.lancer.lancermusicplayer.bean;
/**
* Created by Lancer on 2018/4/2.
*/
public class Info {
private String title;
private String artist;
private String duration;
private String Url;
/* private long size;*/
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 getUrl() {
return Url;
}
public void setUrl(String url) {
Url = url;
}
public String getDuration() {
return duration;
}
public void setDuration(String duration) {
this.duration = duration;
}
/*public long getSize() {
return size;
}
public void setSize(long size) {
this.size = size;
}*/
}
在真機上跑過可以執行。