簡單的音樂播放器(上一曲,下一曲,暫停/播放,自動播放下一曲)


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" />


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM