音乐播放,进度条,上一首下一首,暂停/播放

recycle_item布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/mText_View"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>

</LinearLayout>

Recycle_Adapter:

package com.example.mucsicsplay;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.util.List;

/**
* Created by 梁Sir on 2017/11/16.
*/

public class Recycle_Adapter extends RecyclerView.Adapter<Recycle_Adapter.Handle_View> implements View.OnClickListener {
private Context mContext;
private List<Medialfo>mMediaInfoList;
private RecyclerView recyclerView;

public Recycle_Adapter(Context context, List<Medialfo> mediaInfoList) {
mContext = context;
mMediaInfoList = mediaInfoList;
}

@Override
public Handle_View onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(mContext).inflate(R.layout.recycle_item,null);
Handle_View handle_view = new Handle_View(view);
recyclerView = (RecyclerView) parent;
view.setOnClickListener(this);
return handle_view;
}
@Override
public void onClick(View v) {
int childAdapterPosition = recyclerView.getChildAdapterPosition(v);
mOnItemClicklistener.OnItem(childAdapterPosition);
}


@Override
public void onBindViewHolder(Handle_View holder, int position) {
holder.mTextView.setText(mMediaInfoList.get(position).getUri());


}

@Override
public int getItemCount() {
return mMediaInfoList ==null ? 0 :mMediaInfoList.size();
}


public class Handle_View extends RecyclerView.ViewHolder {
private TextView mTextView;
public Handle_View(View itemView) {
super(itemView);
mTextView = itemView.findViewById(R.id.mText_View);
}
}
public interface OnItemClicklistener{
void OnItem(int position);

}
private OnItemClicklistener mOnItemClicklistener;

public void setOnItemClicklistener(OnItemClicklistener onItemClicklistener) {
mOnItemClicklistener = onItemClicklistener;
}
}

工程代码:

package com.example.mucsicsplay.activity;

import android.database.Cursor;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;

import com.example.mucsicsplay.Medialfo;
import com.example.mucsicsplay.R;
import com.example.mucsicsplay.Recycle_Adapter;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class MainActivity extends AppCompatActivity implements View.OnClickListener, Recycle_Adapter.OnItemClicklistener, SeekBar.OnSeekBarChangeListener {

private List<Medialfo> list;

private MediaPlayer mMediaPlayer;

//记录当前播放歌曲的位置
private int mCurrentPosition;
private RecyclerView mRecycle_view;
private Recycle_Adapter mRecycle_adapter;
private Button mPrevious;
private Button mplay_pause;
private Button mNext;
private TextView current_time_tv;
private TextView total_time_tv;
private SeekBar seek_bar;

private Handler mHandler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
//获取当前进度,并展示给进度条
// int progress = msg.arg1;//获取进度
//展示进度条和当前时间
if (msg.what==1){
int progress = mMediaPlayer.getCurrentPosition();
seek_bar.setProgress(progress);
current_time_tv.setText(parseTime(progress));
//继续定时发送数据
updataProgress();

}


return true;
}



private String parseTime(int progress) {
java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("mm:ss");//时间格式
String newTime = sdf.format(new Date(progress));
return newTime;
}
});



@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
getData();
mRecycle_adapter = new Recycle_Adapter(this, list);
mRecycle_view.setLayoutManager(new StaggeredGridLayoutManager(1, StaggeredGridLayoutManager.VERTICAL));
mRecycle_adapter.setOnItemClicklistener(this);
mRecycle_view.setAdapter(mRecycle_adapter);
}

private void initView() {

mRecycle_view = (RecyclerView) findViewById(R.id.mRecycle_view);

mPrevious = (Button) findViewById(R.id.mPrevious);
mPrevious.setOnClickListener(this);
mplay_pause = (Button) findViewById(R.id.mplay_pause); mplay_pause.setOnClickListener(this);
mNext = (Button) findViewById(R.id.mNext);
mNext.setOnClickListener(this);
current_time_tv = (TextView) findViewById(R.id.current_time_tv);
current_time_tv.setOnClickListener(this);
total_time_tv = (TextView) findViewById(R.id.total_time_tv);
total_time_tv.setOnClickListener(this);
seek_bar = (SeekBar) findViewById(R.id.seek_bar);
seek_bar.setOnSeekBarChangeListener(this); } public List<Medialfo> getData() { //获取系统媒体库中的音乐信息 list = new ArrayList<>(); //用内容解析者访问系统提供的数据库 Cursor cursor = getContentResolver() .query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI , null , null , null , MediaStore.Audio.Media.DEFAULT_SORT_ORDER ); //读取游标获取下一个信息 int idIndex = cursor.getColumnIndex(MediaStore.Audio.Media._ID); int titleIndex = cursor.getColumnIndex(MediaStore.Audio.Media.TITLE); int writerIndex = cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST); int uriIndex = cursor.getColumnIndex(MediaStore.Audio.Media.DATA); while (cursor.moveToNext()) { long _id = cursor.getLong(idIndex); String title = cursor.getString(titleIndex); String writer = cursor.getString(writerIndex); String uri = cursor.getString(uriIndex); Medialfo medialfo = new Medialfo(_id, uri, title, writer); list.add(medialfo); } for (Medialfo medialfo : list) { Log.d("hh", "" + medialfo.toString()); } return list; }//// @Override// public void onItemClick(AdapterView<?> parent, View view, int position, long id) {// mCurrentPosition = position;// changeMusic(mCurrentPosition);// } private void changeMusic(int position) { if (position < 0) { mCurrentPosition = position = list.size() - 1; } else if (position > list.size() - 1) { mCurrentPosition = position = 0; } if (mMediaPlayer == null) { mMediaPlayer = new MediaPlayer(); } try { //切歌之前先重置释放之前的资源 mMediaPlayer.reset(); //设置播放源 // 设置播放源 mMediaPlayer.setDataSource(list.get(position).getUri()); // 开始播放前的准备工作,加载多媒体资源,获取相关信息 mMediaPlayer.prepare(); //开始播放 mMediaPlayer.start(); } catch (IOException e) { e.printStackTrace(); Toast.makeText(this, "播放错误", Toast.LENGTH_SHORT).show(); } seek_bar.setProgress(0); seek_bar.setMax(mMediaPlayer.getDuration()); total_time_tv.setText(parseTime(mMediaPlayer.getDuration())); updataProgress(); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.mPrevious: changeMusic(--mCurrentPosition); break; case R.id.mplay_pause: if (mMediaPlayer == null) { changeMusic(0); } else if (mMediaPlayer.isPlaying()) { mMediaPlayer.pause(); } else { mMediaPlayer.start(); } break; case R.id.mNext: changeMusic(++mCurrentPosition); break; } } @Override public void OnItem(int position) { mCurrentPosition = position; changeMusic(mCurrentPosition); } private void updataProgress() { // 使用Handler每间隔1s发送一次空消息,通知进度条更新// Message msg = Message.obtain();// 获取一个现成的消息// // 使用MediaPlayer获取当前播放时间除以总时间的进度// int progress = mMediaPlayer.getCurrentPosition();// msg.arg1 = progress;// mHandler.sendMessageDelayed(msg,INTERNAL_TIME); mHandler.sendEmptyMessageDelayed(1,1000); } //解析时间 private String parseTime(int duration) { SimpleDateFormat sdf = new SimpleDateFormat("mm:ss");//时间格式 String newTime = sdf.format(new Date(duration)); return newTime; } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { } @Override public void onStartTrackingTouch(SeekBar seekBar) { } // 当手停止拖拽进度条时执行该方法 // 获取拖拽进度 // 将进度对应设置给MediaPlayer @Override public void onStopTrackingTouch(SeekBar seekBar) { int progress = seekBar.getProgress(); mMediaPlayer.seekTo(progress); }}
seek_bar.setOnSeekBarChangeListener(this);
}

public List<Medialfo> getData() {
//获取系统媒体库中的音乐信息
list = new ArrayList<>();
//用内容解析者访问系统提供的数据库
Cursor cursor = getContentResolver()
.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
, null
, null
, null
, MediaStore.Audio.Media.DEFAULT_SORT_ORDER
);
//读取游标获取下一个信息
int idIndex = cursor.getColumnIndex(MediaStore.Audio.Media._ID);
int titleIndex = cursor.getColumnIndex(MediaStore.Audio.Media.TITLE);
int writerIndex = cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST);
int uriIndex = cursor.getColumnIndex(MediaStore.Audio.Media.DATA);
while (cursor.moveToNext()) {
long _id = cursor.getLong(idIndex);
String title = cursor.getString(titleIndex);
String writer = cursor.getString(writerIndex);
String uri = cursor.getString(uriIndex);

Medialfo medialfo = new Medialfo(_id, uri, title, writer);
list.add(medialfo);
}
for (Medialfo medialfo : list) {
Log.d("hh", "" + medialfo.toString());


}

return list;

}
//
// @Override
// public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// mCurrentPosition = position;
// changeMusic(mCurrentPosition);
// }

private void changeMusic(int position) {
if (position < 0) {
mCurrentPosition = position = list.size() - 1;
} else if (position > list.size() - 1) {
mCurrentPosition = position = 0;
}
if (mMediaPlayer == null) {
mMediaPlayer = new MediaPlayer();
}

try {
//切歌之前先重置释放之前的资源
mMediaPlayer.reset();
//设置播放源
// 设置播放源
mMediaPlayer.setDataSource(list.get(position).getUri());
// 开始播放前的准备工作,加载多媒体资源,获取相关信息
mMediaPlayer.prepare();
//开始播放
mMediaPlayer.start();

} catch (IOException e) {
e.printStackTrace();
Toast.makeText(this, "播放错误", Toast.LENGTH_SHORT).show();
}
seek_bar.setProgress(0);
seek_bar.setMax(mMediaPlayer.getDuration());
total_time_tv.setText(parseTime(mMediaPlayer.getDuration()));
updataProgress();


}



@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.mPrevious:
changeMusic(--mCurrentPosition);

break;
case R.id.mplay_pause:
if (mMediaPlayer == null) {
changeMusic(0);
} else if (mMediaPlayer.isPlaying()) {
mMediaPlayer.pause();

} else {

mMediaPlayer.start();
}
break;
case R.id.mNext:

changeMusic(++mCurrentPosition);
break;
}
}

@Override
public void OnItem(int position) {
mCurrentPosition = position;
changeMusic(mCurrentPosition); } private void updataProgress() { // 使用Handler每间隔1s发送一次空消息,通知进度条更新// Message msg = Message.obtain();// 获取一个现成的消息// // 使用MediaPlayer获取当前播放时间除以总时间的进度// int progress = mMediaPlayer.getCurrentPosition();// msg.arg1 = progress;// mHandler.sendMessageDelayed(msg,INTERNAL_TIME); mHandler.sendEmptyMessageDelayed(1,1000); } //解析时间 private String parseTime(int duration) { SimpleDateFormat sdf = new SimpleDateFormat("mm:ss");//时间格式 String newTime = sdf.format(new Date(duration)); return newTime; } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { } @Override public void onStartTrackingTouch(SeekBar seekBar) { } // 当手停止拖拽进度条时执行该方法 // 获取拖拽进度 // 将进度对应设置给MediaPlayer @Override public void onStopTrackingTouch(SeekBar seekBar) { int progress = seekBar.getProgress(); mMediaPlayer.seekTo(progress); }}
seek_bar.setOnSeekBarChangeListener(this);    }    public List<Medialfo> getData() {        //获取系统媒体库中的音乐信息        list = new ArrayList<>();        //用内容解析者访问系统提供的数据库        Cursor cursor = getContentResolver()                .query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI                        , null                        , null                        , null                        , MediaStore.Audio.Media.DEFAULT_SORT_ORDER                );        //读取游标获取下一个信息        int idIndex = cursor.getColumnIndex(MediaStore.Audio.Media._ID);        int titleIndex = cursor.getColumnIndex(MediaStore.Audio.Media.TITLE);        int writerIndex = cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST);        int uriIndex = cursor.getColumnIndex(MediaStore.Audio.Media.DATA);        while (cursor.moveToNext()) {            long _id = cursor.getLong(idIndex);            String title = cursor.getString(titleIndex);            String writer = cursor.getString(writerIndex);            String uri = cursor.getString(uriIndex);            Medialfo medialfo = new Medialfo(_id, uri, title, writer);            list.add(medialfo);        }        for (Medialfo medialfo : list) {            Log.d("hh", "" + medialfo.toString());        }        return list;    }////    @Override//    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {//        mCurrentPosition = position;//        changeMusic(mCurrentPosition);//    }    private void changeMusic(int position) {        if (position < 0) {            mCurrentPosition = position = list.size() - 1;        } else if (position > list.size() - 1) {            mCurrentPosition = position = 0;        }        if (mMediaPlayer == null) {            mMediaPlayer = new MediaPlayer();        }        try {            //切歌之前先重置释放之前的资源            mMediaPlayer.reset();            //设置播放源            // 设置播放源            mMediaPlayer.setDataSource(list.get(position).getUri());            // 开始播放前的准备工作,加载多媒体资源,获取相关信息            mMediaPlayer.prepare();            //开始播放            mMediaPlayer.start();        } catch (IOException e) {            e.printStackTrace();            Toast.makeText(this, "播放错误", Toast.LENGTH_SHORT).show();        }        seek_bar.setProgress(0);        seek_bar.setMax(mMediaPlayer.getDuration());        total_time_tv.setText(parseTime(mMediaPlayer.getDuration()));        updataProgress();    }    @Override    public void onClick(View v) {        switch (v.getId()) {            case R.id.mPrevious:                changeMusic(--mCurrentPosition);                break;            case R.id.mplay_pause:                if (mMediaPlayer == null) {                    changeMusic(0);                } else if (mMediaPlayer.isPlaying()) {                    mMediaPlayer.pause();                } else {                    mMediaPlayer.start();                }                break;            case R.id.mNext:                changeMusic(++mCurrentPosition);                break;        }    }    @Override    public void OnItem(int position) {        mCurrentPosition = position;        changeMusic(mCurrentPosition);    }    private void updataProgress() {        // 使用Handler每间隔1s发送一次空消息,通知进度条更新//            Message msg = Message.obtain();// 获取一个现成的消息//            // 使用MediaPlayer获取当前播放时间除以总时间的进度//            int progress = mMediaPlayer.getCurrentPosition();//            msg.arg1 = progress;//            mHandler.sendMessageDelayed(msg,INTERNAL_TIME);        mHandler.sendEmptyMessageDelayed(1,1000);    }    //解析时间    private String parseTime(int duration) {        SimpleDateFormat sdf = new SimpleDateFormat("mm:ss");//时间格式        String newTime = sdf.format(new Date(duration));        return newTime;    }    @Override    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {    }    @Override    public void onStartTrackingTouch(SeekBar seekBar) {    }    // 当手停止拖拽进度条时执行该方法    // 获取拖拽进度    // 将进度对应设置给MediaPlayer    @Override    public void onStopTrackingTouch(SeekBar seekBar) {     int progress = seekBar.getProgress();        mMediaPlayer.seekTo(progress);    }}seek_bar.setOnSeekBarChangeListener(this);    }    public List<Medialfo> getData() {        //获取系统媒体库中的音乐信息        list = new ArrayList<>();        //用内容解析者访问系统提供的数据库        Cursor cursor = getContentResolver()                .query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI                        , null                        , null                        , null                        , MediaStore.Audio.Media.DEFAULT_SORT_ORDER                );        //读取游标获取下一个信息        int idIndex = cursor.getColumnIndex(MediaStore.Audio.Media._ID);        int titleIndex = cursor.getColumnIndex(MediaStore.Audio.Media.TITLE);        int writerIndex = cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST);        int uriIndex = cursor.getColumnIndex(MediaStore.Audio.Media.DATA);        while (cursor.moveToNext()) {            long _id = cursor.getLong(idIndex);            String title = cursor.getString(titleIndex);            String writer = cursor.getString(writerIndex);            String uri = cursor.getString(uriIndex);            Medialfo medialfo = new Medialfo(_id, uri, title, writer);            list.add(medialfo);        }        for (Medialfo medialfo : list) {            Log.d("hh", "" + medialfo.toString());        }        return list;    }////    @Override//    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {//        mCurrentPosition = position;//        changeMusic(mCurrentPosition);//    }    private void changeMusic(int position) {        if (position < 0) {            mCurrentPosition = position = list.size() - 1;        } else if (position > list.size() - 1) {            mCurrentPosition = position = 0;        }        if (mMediaPlayer == null) {            mMediaPlayer = new MediaPlayer();        }        try {            //切歌之前先重置释放之前的资源            mMediaPlayer.reset();            //设置播放源            // 设置播放源            mMediaPlayer.setDataSource(list.get(position).getUri());            // 开始播放前的准备工作,加载多媒体资源,获取相关信息            mMediaPlayer.prepare();            //开始播放            mMediaPlayer.start();        } catch (IOException e) {            e.printStackTrace();            Toast.makeText(this, "播放错误", Toast.LENGTH_SHORT).show();        }        seek_bar.setProgress(0);        seek_bar.setMax(mMediaPlayer.getDuration());        total_time_tv.setText(parseTime(mMediaPlayer.getDuration()));        updataProgress();    }    @Override    public void onClick(View v) {        switch (v.getId()) {            case R.id.mPrevious:                changeMusic(--mCurrentPosition);                break;            case R.id.mplay_pause:                if (mMediaPlayer == null) {                    changeMusic(0);                } else if (mMediaPlayer.isPlaying()) {                    mMediaPlayer.pause();                } else {                    mMediaPlayer.start();                }                break;            case R.id.mNext:                changeMusic(++mCurrentPosition);                break;        }    }    @Override    public void OnItem(int position) {        mCurrentPosition = position;        changeMusic(mCurrentPosition);    }    private void updataProgress() {        // 使用Handler每间隔1s发送一次空消息,通知进度条更新//            Message msg = Message.obtain();// 获取一个现成的消息//            // 使用MediaPlayer获取当前播放时间除以总时间的进度//            int progress = mMediaPlayer.getCurrentPosition();//            msg.arg1 = progress;//            mHandler.sendMessageDelayed(msg,INTERNAL_TIME);        mHandler.sendEmptyMessageDelayed(1,1000);    }    //解析时间    private String parseTime(int duration) {        SimpleDateFormat sdf = new SimpleDateFormat("mm:ss");//时间格式        String newTime = sdf.format(new Date(duration));        return newTime;    }    @Override    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {    }    @Override    public void onStartTrackingTouch(SeekBar seekBar) {    }    // 当手停止拖拽进度条时执行该方法    // 获取拖拽进度    // 将进度对应设置给MediaPlayer    @Override    public void onStopTrackingTouch(SeekBar seekBar) {     int progress = seekBar.getProgress();        mMediaPlayer.seekTo(progress);    }}      

布局:


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
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"
android:orientation="vertical"
tools:context="com.example.mucsicsplay.activity.MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
<Button
android:layout_weight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/mPrevious"
android:text="上一首"
/>
<Button
android:layout_weight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="播放/暂停"
android:id="@+id/mplay_pause"
/>
<Button
android:layout_weight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="下一首"
android:id="@+id/mNext"
/>

</LinearLayout>
<RelativeLayout
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="wrap_content"
android:layout_toLeftOf="@id/total_time_tv"
android:layout_toRightOf="@id/current_time_tv"/>
</RelativeLayout>
<android.support.v7.widget.RecyclerView
android:id="@+id/mRecycle_view"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
</LinearLayout>










原文地址:https://www.cnblogs.com/98k98k/p/7851366.html