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

简单的音乐播放器(上一曲,下一曲,暂停/播放,自动播放下一曲)相关推荐

  1. vue 音乐播放器上一首 下一首切换

    vue 音乐播放器上一首 下一首切换 根据自定义属性的值找到元素 我是使用监听来实现切换的,将v-for循环列表的index存储在vuex中,点击上一首或下一首改变index的值,在另一个组件中监听i ...

  2. 视频、音乐播放器大家都听说过,那么图片播放器呢

    原标题:应用Tkinter模块制作一个图片播放器 今天,在看视频的同时,想了一下,既然视频.音乐都有自己的播放器,那么图片呢?是否有自己的播放器呢?既然没有,为什么不做一个呢? 文章目录 原标题:应用 ...

  3. 播放器上音频断续问题的原因(realmedia)

    [转载]播放器上音频断续问题的原因(realmedia) 这个问题足足花了我三个礼拜.当前产品的播放器在解分辨率高.码率也高的REAL文件时,音频播放一半会断掉,丢掉一小段BUFFER的数据,然后再继 ...

  4. 删除播放器上的Flowplayer图标

    要删除播放器上的Flowplayer图标 ,首先,您需要购买许可证密钥. 许可证密钥对为单个域注册的任意数量的子域有效. 然后只需将播放器的位置更改为flowplayer.commercial-3.2 ...

  5. bal插口_播放器上的这个“昂贵”的插口,是噱头还是真有用

    原标题:播放器上的这个"昂贵"的插口,是噱头还是真有用 有不少随身播放器上都有BAL这个插口,只要有这个接口,一般都不会太便宜.但不少朋友却反应听不出平衡口和普通耳机插口(非平衡口 ...

  6. Beyond Compare 4访问手机或媒体播放器上的文件

    Beyond Compare 4 for Windows 可以使用媒体传输协议 (MTP) 访问 Apple iPhone.Android 手机和平板电脑.Windows Phone 设备和某些媒体播 ...

  7. bal插口_播放器上的“昂贵”插口,是噱头还是真有用

    有不少随身播放器上都有 BAL 这个插口,只要有这个接口,一般都不会太便宜.但不少朋友却反应听不出平衡口和普通耳机插口(非平衡口)的区别,认为买上当了. 难道平衡插口只是摆设?乙迷采访到音频品牌乐彼产 ...

  8. html5的video播放器上禁止下载和禁止右键下载实现。

    <video id="video" src="#" controls controlsList="nodownload" oncont ...

  9. 好看的html5播放器,7 款超具个性的 HTML5 播放器

    这篇文章我们要分享一些很有个性的HTML5音乐播放器和视频播放器,它们都具有播放器的大部分功能,并以HTML5和JavaScript实现.这些HTML5播放器有着非常漂亮的外观,很多你都无需自己重新定 ...

  10. html5播放器绿屏修复,迅雷看看绿屏播放视频怎么修复

    迅雷看看绿屏播放视频怎么修复?一些用户发现在迅雷看看播放器中不管播放什么格式的视频都会出现绿屏的问题,出现这种情况的大多都是ATI显卡的原因,现在就着手解决这件麻烦事吧. 迅雷看看绿屏播放视频怎么修复 ...

最新文章

  1. nginx+lua实现上传文件到OSS
  2. 参加kaggle比赛
  3. 嗨淘V12刷任务点赞系统源码手动派单版本
  4. WinAPI——钩子函数大全
  5. 中国武侠片的50条爆笑定律
  6. java面试 谈谈jvm内存结构
  7. win10多合一原版系统_制作WIN10多合一原版系统
  8. SumatraPDF 适配 EPUB,MOBI
  9. 户籍管理系统php,户籍管理系统.rar - 源码下载|Windows编程|数据库编程|源代码 - 源码中国...
  10. 指针 上 :什么是指针,指针类型,指针运算等等
  11. 活动现场大屏幕互动系统源码,包含3D签到投票抽奖等功能
  12. FPGA读取ADXL345
  13. app上传到安卓各大市场
  14. java joda range,Java:joda time
  15. 笔记连载 | Day15【按键检测、按键消抖】 【原理及verilog仿真】篇
  16. electron设置淘宝镜像
  17. Landsat系列数据级别详解
  18. Virbox Protector AAB 加固-兼容 Google Play 上架
  19. 用友数据库类型 mysql_用友软件用的是什么数据库?
  20. matlab画余割,MATLAB程序作业

热门文章

  1. 安琪拉教鲁班学堆排序
  2. Java解析rdf和xml文件以及处理excel
  3. 在线jquery引用地址
  4. Yoast SEO Premium插件下载,为你的网站实现卓越的SEO优化!
  5. parted分区操作
  6. Web网页、安卓、ios、平板等的网站图标制作Favicon.ico
  7. 【SD】销售收入成本的确定
  8. 读《辜新星:时刻调整方向 找到人生的蓝海》有感
  9. 聚焦家服行业热点 斑马发布会引燃互联网+家政热潮
  10. 数据仓库系列(19):数据安全