android 简单的音乐播放器实现播放模式的切换

来源:互联网 发布:hadoop编程实例 编辑:程序博客网 时间:2024/06/14 05:40

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

布局文件

<?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>                      <TextView        android: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="音乐列表"/>              <ListView        android: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;    @Override    protected 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(){           @Override            public 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());产生随机数进行随机播放。

0 0
原创粉丝点击