以前写过一篇简单的音乐播放器,但是这个播放器没有实现播放模式的切换,在项目中要实现两个播放模式,循环播放和随机播放,经过这两天的努力搞定了,界面比较粗糙。可以先看一下前面的简单音乐播放器,详细的就不说了,直接把代码放上去,详细的看前面的博文。

布局文件

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/background"android:orientation="vertical" ><LinearLayout android:id="@+id/linearlayout"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_alignParentTop="true"><Button android:id="@+id/list1"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="放松音乐"android:textColor="#ffffff"android:textSize="30sp"/><Button android:id="@+id/list2"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="冥想"android:textColor="#ffffff"android:textSize="30sp"/></LinearLayout><TextViewandroid:id="@+id/updatevedio"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@id/linearlayout"android:textSize="30sp"android:textColor="#ffffff"android:text="音乐列表"/>  <ListViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@id/updatevedio"android:id="@+id/lv"></ListView> <TextView android:id="@+id/name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:layout_alignParentLeft="true"android:maxEms="8" android:singleLine="true"android:ellipsize="marquee"android:paddingBottom="20dp"android:textSize="20sp"android:textColor="#ffffff"/> <LinearLayout android:id="@+id/linearLayout"android:layout_alignParentBottom="true"android:layout_centerInParent="true"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="horizontal"><Button android:id="@+id/model"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@drawable/xunhuan"/><Button android:id="@+id/back"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@drawable/shangyishou"/><Button android:id="@+id/pause"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@drawable/zanting"/><Button android:id="@+id/next"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@drawable/xiayishou"/></LinearLayout><SeekBar android:id="@+id/seekBar"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_above="@id/linearLayout"/></RelativeLayout>

添加了两个按钮,分别为两个播放列表。

实现的activity

package cn.edu.cqu.project_test_activity;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;import com.zghaikun.sleep_client.R;import android.app.Activity;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;public class MP3ListActivity extends Activity implements OnClickListener{private static final String LOG = "MP3ListActivity";private ListView lv; private SeekBar seekBar;private Button modelButton;private Button backButton;private Button pauseButton;private Button nextButton;private TextView nameText;private ArrayList<HashMap<String, String>> musicList;private ArrayList<String> musicpathlist;private String path = Environment.getExternalStorageDirectory().getPath();private String musicpath;private String musicname;private MediaPlayer mediaPlayer;public int songNum; // 当前播放的歌曲在List中的下标 private boolean isStartTrackingTouch; private Handler handler = new Handler();  private int Sequence = 1;//顺序播放private int Shuffle = 2;//随机播放private Button fristButton;private Button secondButton;String music = "/Music";String mp3 = "/mp3";int i = 0;int flag = 0;@Overrideprotected void onCreate(Bundle savedInstanceState) {this.requestWindowFeature(Window.FEATURE_NO_TITLE);super.onCreate(savedInstanceState);setContentView(R.layout.mp3_list);  lv = (ListView) findViewById(R.id.lv);  seekBar = (SeekBar) findViewById(R.id.seekBar);modelButton = (Button) findViewById(R.id.model);backButton = (Button) findViewById(R.id.back);pauseButton = (Button) findViewById(R.id.pause);nextButton = (Button) findViewById(R.id.next);nameText = (TextView) findViewById(R.id.name);fristButton = (Button) findViewById(R.id.list1);secondButton = (Button) findViewById(R.id.list2);musicList = new ArrayList<HashMap<String, String>>(); musicpathlist=new ArrayList<String>();mediaPlayer = new MediaPlayer();//获得视频列表,默认显示放松音乐mp3List(music);fristButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {//清空列表和保存的地址信息musicpathlist.clear();musicList.clear();//获得视频列表mp3List(music);}});secondButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {//清空列表和保存的地址信息musicpathlist.clear();musicList.clear();//冥想列表mp3List(mp3);}});pauseButton.setOnClickListener(this);backButton.setOnClickListener(this);modelButton.setOnClickListener(this);nextButton.setOnClickListener(this);//进度条监听器   seekBar.setOnSeekBarChangeListener(new MySeekBarListener()); nextButton.setOnTouchListener(new OnTouchListener() {@Overridepublic boolean onTouch(View arg0, MotionEvent arg1) {// TODO Auto-generated method stubif(arg1.getAction() == MotionEvent.ACTION_DOWN){  arg0.setBackgroundResource(R.drawable.xiayishou_anxia);  }  else if(arg1.getAction() == MotionEvent.ACTION_UP){  arg0.setBackgroundResource(R.drawable.xiayishou);  } return false;}});backButton.setOnTouchListener(new OnTouchListener() {@Overridepublic boolean onTouch(View view, MotionEvent event) {// TODO Auto-generated method stubif(event.getAction() == MotionEvent.ACTION_DOWN){  view.setBackgroundResource(R.drawable.shangyishou_anxia);  }  else if(event.getAction() == MotionEvent.ACTION_UP){  view.setBackgroundResource(R.drawable.shangyishou);  } return false;}});
//        pauseButton.setOnTouchListener(new OnTouchListener() {
//
//          @Override
//          public boolean onTouch(View arg0, MotionEvent arg1) {
//              // TODO Auto-generated method stub
//              int i = 0;
//              i++;
//              if(i % 2 == 0){
//
//              }
//              return false;
//          }
//      });}   //获得视频列表private void mp3List(String music){ if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {  // File path = Environment.getExternalStorageDirectory();// 获得SD卡路径      System.out.println("path-------》" + path);//File[] files = path.listFiles();// 读取   String musicPath = path + music; getFileName(musicPath);  //视频列表Log.i(LOG, musicPath);}  SimpleAdapter adapter = new SimpleAdapter(this, musicList, R.layout.sd_list, new String[] { "name" }, new int[] { R.id.mp4 });  lv.setAdapter(adapter);for (int i = 0; i < musicList.size(); i++) {  Log.i(LOG, "list.  name:  " + musicList.get(i));  }lv.setOnItemClickListener(new ListView.OnItemClickListener(){@Overridepublic void onItemClick(AdapterView<?> arg0, View view, int position,long id) {
//             //顺序播放
//             if(flag == 0){
//                 songNum = position;
//             }
//             //随机播放
//             else if(flag == 1){
//                 songNum = (int)(Math.random()*musicList.size());;
//          }songNum = position;initMediaPlayer(songNum);}           }); }//仅搜索当前目录下的文件 private void getFileName(String url) {   File files = new File(url);File[] file = files.listFiles();//先判断目录是否为空,否则会报空指针if (files != null) {  for (File f : file) {  String fileName = f.getName();  if (fileName.endsWith(".mp3")||fileName.endsWith(".wav")) {   HashMap<String, String> map = new HashMap<String, String>();  String s = fileName.substring(0,fileName.lastIndexOf(".")).toString();  //获取文件的地址musicpath = f.getPath();Log.i(LOG, "文件名mp3或wav::   " + s);   map.put("name", fileName);// map.put("mp3", f.getName());  musicpathlist.add(musicpath);musicList.add(map);  }  }  }  }//进度条监控private final class MySeekBarListener implements OnSeekBarChangeListener {  //移动触发   public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {  }  //起始触发   public void onStartTrackingTouch(SeekBar seekBar) {  isStartTrackingTouch = true;  }  //结束触发   public void onStopTrackingTouch(SeekBar seekBar) {  mediaPlayer.seekTo(seekBar.getProgress());  isStartTrackingTouch = false;  }  } //如果是顺序播放private void initMediaPlayer(int songNum){musicname = musicpathlist.get(songNum);   Log.i(LOG, musicname);if (musicname != null) {try {mediaPlayer.reset(); //重置多媒体  //指定音频文件地址mediaPlayer.setDataSource(musicname);//这是一个地址String path = musicpathlist.get(songNum);String Text[] = path.split("/");Log.i(LOG, Text[5]);//设置当前播放文件nameText.setText(Text[Text.length - 1]);Log.i(LOG, "播放");//准备播放mediaPlayer.prepare();start();
//          if (!mediaPlayer.isPlaying()) {
//              mediaPlayer.start();
//              System.out.println("开始播放");
//          }} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}@Overridepublic void onClick(View v) {// TODO Auto-generated method stubswitch (v.getId()) {case R.id.pause:pauseButton.setBackgroundResource(R.drawable.jixu);Toast.makeText(getApplicationContext(), "暂停", Toast.LENGTH_SHORT).show();pause();break;case R.id.next:next();break;case R.id.back:back();break;case R.id.model:i++;if(i % 2 == 1){Toast.makeText(getApplicationContext(), "随机播放", Toast.LENGTH_SHORT).show();//产生一个随机数
//              songNum = (int)(Math.random()*musicList.size());
//              System.out.println("song---" + songNum);
//              initMediaPlayer(songNum); //随机播放falgflag = 1;modelButton.setBackgroundResource(R.drawable.suiji);}else{Toast.makeText(getApplicationContext(), "循环播放", Toast.LENGTH_SHORT).show();//循环播放flag = 0;modelButton.setBackgroundResource(R.drawable.xunhuan);}break;default:break;}}public void start() {   try {   mediaPlayer.start();//开始播放   //设置进度条长度   seekBar.setMax(mediaPlayer.getDuration()); //发送一个Runnable, handler收到之后就会执行run()方法   handler.post(new Runnable() {  public void run() {  // 更新进度条状态   if (!isStartTrackingTouch) //获取当前播放音乐的位置seekBar.setProgress(mediaPlayer.getCurrentPosition());  // 1秒之后再次发送   handler.postDelayed(this, 1000);  }  });//setOnCompletionListener 当当前多媒体对象播放完成时发生的事件   mediaPlayer.setOnCompletionListener(new OnCompletionListener() {   public void onCompletion(MediaPlayer arg0) {   next();//如果当前歌曲播放完毕,自动播放下一首.   }   });   } catch (Exception e) {   Log.v("MusicService", e.getMessage());   }   }   public void next() { Toast.makeText(getApplicationContext(), "下一首", Toast.LENGTH_SHORT).show();if(flag == 0){songNum = songNum == musicList.size() - 1 ? 0 : songNum + 1; }else if(flag == 1){songNum = (int)(Math.random()*musicList.size());}initMediaPlayer(songNum);  }   public void back() {   Toast.makeText(getApplicationContext(), "上一首", Toast.LENGTH_SHORT).show();if(flag == 0){//songNum = songNum == 0 ? musicList.size() - 1 : songNum - 1; songNum = songNum - 1 < 0 ? musicList.size() - 1 : songNum - 1; }else if(flag == 1){songNum = (int)(Math.random()*musicList.size());}initMediaPlayer(songNum);  }   public void pause() {   if (mediaPlayer.isPlaying())  {Toast.makeText(getApplicationContext(), "继续", Toast.LENGTH_SHORT).show();pauseButton.setBackgroundResource(R.drawable.zanting);mediaPlayer.pause();   }else  mediaPlayer.start();   }   public void stop() {   if (mediaPlayer.isPlaying()) {   mediaPlayer.stop();   }   } @Overrideprotected void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();if (mediaPlayer != null) {mediaPlayer.stop();//mediaPlayer.release();}}
}

定义了一个flag,切换model按钮设置flag的值, 当flag的值为0时为循环播放,flag的值为1时为随机播放,并使用songNum = (int)(Math.random()*musicList.size());产生随机数进行随机播放。

android 简单的音乐播放器实现播放模式的切换相关推荐

  1. Android学习之路4——音乐播放器后台播放

    Android学习之路4--音乐播放器后台播放 一.实验题目 简单音乐播放器 二.实现内容 实现一个简单的播放器,要求功能有: 播放.暂停.停止.退出功能,按停止键会重置封面转角,进度条和播放按钮:按 ...

  2. Android实现控制第三方音乐播放器暂停/播放

    实现控制第三方音乐播放器思路: 1.参考方法:可能实现第三方音乐播放器暂停/播放/下一曲/上一曲 思路:android模拟发送键值,就像蓝牙耳机等远程设备切换歌曲操作,但是行不通.原因是现在Andro ...

  3. jsp网页嵌入PHP网页,JSP_(jsp/html)网页上嵌入播放器(常用播放器代码整理),这个其实很简单,只要在HTML上 - phpStudy...

    (jsp/html)网页上嵌入播放器(常用播放器代码整理) 这个其实很简单,只要在HTML上添加以上代码就OK了,前提是你的电脑上已经安装了播放器,如RealPlay. 还有更多的的播放器和设置可供选 ...

  4. openGL ES进阶教程(五)制作一个简单的VR播放器,播放全景视频

    之前写过全景(VR)图片,和用openGL ES+MediaPlayer 渲染播放视频+滤镜效果 这一篇就在之前的基础上实现一个最简单的VR播放器,播放全景视频. 概述: 全景视频是一种用3D摄像机进 ...

  5. 【Android FFMPEG 开发】OpenSLES 播放音频 ( 创建引擎 | 输出混音设置 | 配置输入输出 | 创建播放器 | 获取播放/队列接口 | 回调函数 | 开始播放 | 激活回调 )

    文章目录 I . FFMPEG 播放视频流程 II . OpenSLES 播放音频流程 III . OpenSLES 播放参考 Google 官方示例 IV . OpenSL ES 播放代码 ( 详细 ...

  6. Android中调用系统已安装的播放器来播放网络流媒体视频

    2019独角兽企业重金招聘Python工程师标准>>> 实现思路比较简单几行代码就可以搞定,在界面放一个Button或者带有播放图标的imageview,点击事件中调用本地播放器来播 ...

  7. 鸿蒙系统怎样去掉下拉音乐播放器,windows10系统下怎样取消音乐播放器默认播放器...

    一位用户反馈自己的windows10系统电脑中,默认音乐播放器是百度音乐,因为自己并不喜欢用百度音乐来播放歌曲,就想将其取消掉.这该如何操作呢?接下来,就随小编看看windows10系统下取消音乐播放 ...

  8. Python—实现本地音乐播放器(添加/播放/暂停/下一首/上一首/音量/打开超链接)

    Python-实现本地音乐播放器(添加/播放/暂停/下一首/上一首/音量/打开超链接) 1.样例 2.分析 1.播放器界面 2.功能 2.1播放器界面 button:添加/播放/暂停/下一首/上一首 ...

  9. 网络摄像头无插件直播H265编码视频播放器EasyPlayer网页播放器不能播放怎么处理?

    EasyPlayer播放器系列项目提供了非常简单易用的SDK及API接口,用户通过API调用就可以非常快速地开发出属于自己的应用程序,进行第二次开发.新版的EasyPlayer因为支持H265网页播放 ...

  10. 视频在html不能播放器,网页无插件直播H265编码视频播放器EasyPlayer网页播放器不能播放怎么处理?...

    原标题:网页无插件直播H265编码视频播放器EasyPlayer网页播放器不能播放怎么处理? EasyPlayer播放器系列项目提供了非常简单易用的SDK及API接口,用户通过API调用就可以非常快速 ...

最新文章

  1. 面试官:群聊消息的已读未读功能,你来设计一个?
  2. 腾讯、阿里到底有多缺这类程序员?
  3. Spring5源码 - Spring IOC 注解复习
  4. 数字语音信号处理学习笔记——语音信号的同态处理(4)
  5. 国内数十位NLP大佬合作,综述预训练模型的过去、现在与未来
  6. mysql模板标签数据库设计_MySQL数据库规范化设计
  7. FFmpeg - 音频解码过程
  8. 电气自动化c语言实践操作论文,项目实践论文,关于独立学院电气工程其自动化专业基于CDIO的实践模式相关参考文献资料-免费论文范文...
  9. Android 支付宝 移动支付接口 快速配置
  10. 【Unity3d】【项目学习心得】从资源服务器下载资源(二)
  11. windows批量ping脚本
  12. 字段计算器python教程_字段计算器综合(python-02)
  13. Unity 讯飞实时语音转写(一)—— 使用WebSocket连接讯飞语音服务器
  14. 取消全部呼叫转移代码_不想接电话,又不好意思挂断?输入一串代码,让你手机秒变空号!...
  15. win的反义词_小学英语反义词汇总大全,这样背单词事半功倍!
  16. 零线断了为什么会带电, 使验电笔氖管发光
  17. [原创]java实现word转pdf
  18. 使用百度网盘下载ed2k文件
  19. final修饰的变量就是常量?
  20. Sentinel Dubbo 适配器看限流与熔断(实战思考篇)

热门文章

  1. ubuntu下安装Qt的过程以及遇到的问题和解决方案
  2. php与mysql店事物处理_PHP与MYSQL事务处理
  3. TS对象类型 -- 接口(interface)
  4. Resource Path Location Type Target runtime Apache Tomcat v6.0 is not defined已解决
  5. windows部署Apollo
  6. fastjson 返回json字符串,JSON.parse 报错
  7. 元素的层次结构和HTML文档结构
  8. BZOJ 1059 - 二分图匹配
  9. 【翻译自mos文章】job 不能自己主动运行的解决方法
  10. Hbase0.98的环境搭建