zoukankan      html  css  js  c++  java
  • 音乐播放,进度条,上一首下一首,暂停/播放

    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>








    
    
    
    
  • 相关阅读:
    Recon-Erlang线上系统诊断工具
    erlang pool模块。
    深度学习Bible学习笔记:第二、三章 线性代数 概率与信息论
    LeetCode(5):最长回文子串
    LeetCode(4):两个排序数组的中位数
    LeetCode(3):无重复字符的最长子串
    LeetCode(2):Add Two Numbers 两数相加
    LeetCode(1):两数之和
    深度学习Bible学习笔记:第一章 前言
    2018年3月18日论文阅读
  • 原文地址:https://www.cnblogs.com/98k98k/p/7851366.html
Copyright © 2011-2022 走看看