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
- android 简单的音乐播放器实现播放模式的切换
- android实现简单的音乐播放器
- Android音乐播放器的简单实现
- android MediaPlayer实现简单的音乐播放
- Android实现简单的音乐播放
- android 简单的音乐播放实现
- 简单实现Android本地音乐的播放
- 音乐播放的简单实现
- Android 超简单音乐播放器(六)播放暂停音乐,更换播放模式,上下歌曲切换(service)
- android快捷简单的实现音乐播放器
- android简单音乐播放器代码的实现
- android 音乐播放器最简单的实现
- Android如何实现简单音乐播放器的代码
- 音乐播放器的简单实现
- 实现简单的自定义音乐播放器
- 简单音乐播放器的实现
- ios-音乐播放器的简单实现
- Android--MediaPlayDemo简单的音乐播放器
- cassandra2.0 如何实现分页查询
- Android Fragment 生命周期图
- 靠能力赚钱,是一个弥天大谎
- 有趣的信息
- llinux下开发板调试gdb+gdbserver安装
- android 简单的音乐播放器实现播放模式的切换
- 交换排序--冒泡排序和快速排序
- [原]Android Fragment 入门介绍
- AWK
- 机器学习 Hidden Markov Models 1
- iOS自定义tabbar后popToRootViewContriller和poptoviewcontroller时出现两个tabbar 的解决办法
- Js的Url中传递中文参数乱码,如何获取Url中参数问题
- java实现cassandra的增删改查
- 错误修改文件内容导致ubuntu无法启动