简单的音乐播放器(上一曲,下一曲,暂停/播放,自动播放下一曲)
生活随笔
收集整理的這篇文章主要介紹了
简单的音乐播放器(上一曲,下一曲,暂停/播放,自动播放下一曲)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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() {@Overridepublic boolean handleMessage(Message message) {// 展示給進度條和當前時間int progress = mediaPlayer.getCurrentPosition();mSeekBar.setProgress(progress);mCurrentTimeTv.setText(parseTime(progress));// 繼續定時發送數據
updateProgress();return true;}});@Overrideprotected 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<>();//把掃描到的音樂賦值給listlist = MusicUtils.getMusicData(this);adapter = new MyAdapter(this,list);mListView.setAdapter(adapter);mediaPlayer.setOnCompletionListener(this);mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic 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();
// }
// }
@Overridepublic 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;// 音樂進度間隔時間
@Overridepublic void onProgressChanged(SeekBar seekBar, int i, boolean b) {}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}// 當手停止拖拽進度條時執行該方法// 獲取拖拽進度// 將進度對應設置給MediaPlayer
@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {int progress = seekBar.getProgress();mediaPlayer.seekTo(progress);}@Overridepublic 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;}@Overridepublic int getCount() {return list.size();}@Overridepublic Object getItem(int i) {return list.get(i);}@Overridepublic long getItemId(int i) {return i;}@Overridepublic 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"><LinearLayoutandroid:orientation="horizontal"android:id="@+id/main_textview"android:layout_width="match_parent"android:layout_height="40dp"><Buttonandroid:id="@+id/mPreviousBtn"android:text="上一曲"android:layout_width="0dp"android:layout_weight="1"android:layout_height="match_parent" /><Buttonandroid:id="@+id/mPlayBtn"android:text="播放/暫停"android:layout_width="0dp"android:layout_weight="1"android:layout_height="match_parent" /><Buttonandroid:id="@+id/mNextBtn"android:text="下一曲"android:layout_width="0dp"android:layout_weight="1"android:layout_height="match_parent" /></LinearLayout><RelativeLayoutandroid:id="@+id/main_textview1"android:layout_below="@+id/main_textview"android:layout_width="match_parent"android:layout_height="wrap_content"><TextViewandroid:id="@+id/current_time_tv"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="當前時間"/><TextViewandroid:id="@+id/total_time_tv"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:text="全部時間"/><SeekBarandroid: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><ListViewandroid: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"><TextViewandroid: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" /><RelativeLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="20dp"><TextViewandroid:id="@+id/item_mymusic_song"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="歌曲名"android:textColor="#0d0c0c"android:textSize="20dp" /><TextViewandroid: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" /><TextViewandroid: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" />轉載于:https://www.cnblogs.com/yudada/p/7846097.html
總結
以上是生活随笔為你收集整理的简单的音乐播放器(上一曲,下一曲,暂停/播放,自动播放下一曲)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ROS基础(二):ros通讯之服务(se
- 下一篇: 对接服务,对方服务器更新SSL证书,服务