下载链接:http://download.csdn.net/detail/zlqqhs/5079025

MediaPlayerActivity类:

package com.vince.media;import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import android.app.Activity;
import android.app.ProgressDialog;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnErrorListener;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
import android.widget.Toast;public class MediaPlayerActivity extends Activity implements OnCompletionListener,OnErrorListener,OnSeekBarChangeListener,OnItemClickListener,Runnable{protected static final int SEARCH_MUSIC_SUCCESS = 0;// 搜索成功标记private SeekBar seekBar;private ListView listView;private ImageButton btnPlay;private TextView tv_currTime,tv_totalTime,tv_showName;private List<String> list;private ProgressDialog pd; // 进度条对话框private MusicListAdapter ma;// 适配器private MediaPlayer mp;private int currIndex = 0;// 表示当前播放的音乐索引private boolean flag = true;//控制进度条线程标记// 定义当前播放器的状态״̬private static final int IDLE = 0;private static final int PAUSE = 1;private static final int START = 2;private static final int CURR_TIME_VALUE = 1;private int currState = IDLE; // 当前播放器的状态//定义线程池(同时只能有一个线程运行)ExecutorService es = Executors.newSingleThreadExecutor();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.mediaplayer_layout);list = new ArrayList<String>();mp = new MediaPlayer();mp.setOnCompletionListener(this);mp.setOnErrorListener(this);initView();}@Overrideprotected void onDestroy() {if (mp != null) {mp.stop();flag= false;//释放资源mp.release();}super.onDestroy();}/*** 初始化UI组件*/private void initView() {btnPlay = (ImageButton) findViewById(R.id.media_play);seekBar = (SeekBar) findViewById(R.id.seekBar1);seekBar.setOnSeekBarChangeListener(this);listView = (ListView) findViewById(R.id.listView1);listView.setOnItemClickListener(this);tv_currTime = (TextView) findViewById(R.id.textView1_curr_time);tv_totalTime = (TextView) findViewById(R.id.textView1_total_time);tv_showName = (TextView) findViewById(R.id.tv_showName);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {//从xml文件中装载菜单getMenuInflater().inflate(R.menu.media_menu, menu);return super.onCreateOptionsMenu(menu);}private Handler hander = new Handler() {public void handleMessage(android.os.Message msg) {switch (msg.what) {case SEARCH_MUSIC_SUCCESS://搜索音乐文件结束时ma = new MusicListAdapter();listView.setAdapter(ma);pd.dismiss();break;case CURR_TIME_VALUE://设置当前时间tv_currTime.setText(msg.obj.toString());break;default:break;}};};@Overridepublic boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()) {//搜索本地音乐菜单case R.id.item1_search:list.clear();//是否有外部存储设备if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {pd = ProgressDialog.show(this, "", "正在搜索音乐文件...", true);new Thread(new Runnable() {String[] ext = { ".mp3" };File file = Environment.getExternalStorageDirectory();public void run() {search(file, ext);hander.sendEmptyMessage(SEARCH_MUSIC_SUCCESS);}}).start();} else {Toast.makeText(this, "请插入外部存储设备..", Toast.LENGTH_LONG).show();}break;//清除播放列表菜单case R.id.item2_clear:list.clear();ma.notifyDataSetChanged();break;//退出菜单case R.id.item3_exit:flag = false;this.finish();break;}return super.onOptionsItemSelected(item);}// 搜索音乐文件private void search(File file, String[] ext) {if (file != null) {if (file.isDirectory()) {File[] listFile = file.listFiles();if (listFile != null) {for (int i = 0; i < listFile.length; i++) {search(listFile[i], ext);}}} else {String filename = file.getAbsolutePath();for (int i = 0; i < ext.length; i++) {if (filename.endsWith(ext[i])) {list.add(filename);break;}}}}}class MusicListAdapter extends BaseAdapter {public int getCount() {return list.size();}public Object getItem(int position) {return list.get(position);}public long getItemId(int position) {return position;}public View getView(int position, View convertView, ViewGroup parent) {if (convertView == null) {convertView = getLayoutInflater().inflate(R.layout.list_item,null);}TextView tv_music_name = (TextView) convertView.findViewById(R.id.textView1_music_name);tv_music_name.setText(list.get(position));return convertView;}}private void play() {switch (currState) {case IDLE:start();break;case PAUSE:mp.pause();btnPlay.setImageResource(R.drawable.ic_media_play);currState = START;break;case START:mp.start();btnPlay.setImageResource(R.drawable.ic_media_pause);currState = PAUSE;}}//上一首private void previous() {if((currIndex-1)>=0){currIndex--;start();}else{Toast.makeText(this, "当前已经是第一首歌曲了", Toast.LENGTH_SHORT).show();}}//下一自首private void next() {if(currIndex+1<list.size()){currIndex++;start();}else{Toast.makeText(this, "当前已经是最后一首歌曲了", Toast.LENGTH_SHORT).show();}}//开始播放private void start() {if (list.size() > 0 && currIndex < list.size()) {String SongPath = list.get(currIndex);mp.reset();try {mp.setDataSource(SongPath);mp.prepare();mp.start();initSeekBar();es.execute(this);tv_showName.setText(list.get(currIndex));btnPlay.setImageResource(R.drawable.ic_media_pause);currState = PAUSE;} catch (IOException e) {e.printStackTrace();}}else{Toast.makeText(this, "播放列表为空", Toast.LENGTH_SHORT).show();}}//播放按钮public void play(View v){play();}//上一首按钮public void previous(View v){previous();}//下一首按钮public void next(View v){next();}//监听器,当当前歌曲播放完时触发,播放下一首public void onCompletion(MediaPlayer mp) {if(list.size()>0){next();}else{Toast.makeText(this, "播放列表为空", Toast.LENGTH_SHORT).show();}}//当播放异常时触发public boolean onError(MediaPlayer mp, int what, int extra) {mp.reset();return false;}//初始化SeekBarprivate void initSeekBar(){seekBar.setMax(mp.getDuration());seekBar.setProgress(0);tv_totalTime.setText(toTime(mp.getDuration()));}private String toTime(int time){int minute = time / 1000 / 60;int s = time / 1000 % 60;String mm = null;String ss = null;if(minute<10)mm = "0" + minute;else mm = minute + "";if(s <10)ss = "0" + s;else ss = "" + s;return mm + ":" + ss;}public void run() {flag = true;while(flag){if(mp.getCurrentPosition()<seekBar.getMax()){seekBar.setProgress(mp.getCurrentPosition());Message msg = hander.obtainMessage(CURR_TIME_VALUE, toTime(mp.getCurrentPosition()));hander.sendMessage(msg);try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}}else{flag = false;}}}//SeekBar监听器public void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) {//是否由用户改变if(fromUser){mp.seekTo(progress);}}public void onStartTrackingTouch(SeekBar seekBar) {}public void onStopTrackingTouch(SeekBar seekBar) {}//ListView监听器public void onItemClick(AdapterView<?> parent, View view, int position,long id) {currIndex = position;start();}
}

mediaplayer_layout.xml布局文件:

<?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="match_parent"android:orientation="vertical" ><ListViewandroid:id="@+id/listView1"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1" ></ListView><TextViewandroid:id="@+id/tv_showName"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center" /><LinearLayoutandroid:id="@+id/linearLayout2"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center" ><TextViewandroid:id="@+id/textView1_curr_time"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginRight="5dp"android:text="00:00" /><SeekBarandroid:id="@+id/seekBar1"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_weight="1" /><TextViewandroid:id="@+id/textView1_total_time"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="5dp"android:text="00:00" /></LinearLayout><LinearLayoutandroid:id="@+id/linearLayout1"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center" ><ImageButtonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="previous"android:src="@drawable/ic_media_previous" /><ImageButtonandroid:id="@+id/media_play"android:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="play"android:src="@drawable/ic_media_play" /><ImageButtonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="next"android:src="@drawable/ic_media_next" /></LinearLayout></LinearLayout>

media_menu.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" ><itemandroid:id="@+id/item1_search"android:icon="@drawable/ic_menu_search"android:orderInCategory="100"android:title="@string/search"></item><itemandroid:id="@+id/item2_clear"android:icon="@drawable/ic_menu_delete"android:orderInCategory="200"android:title="@string/clear_music_list"></item><itemandroid:id="@+id/item3_exit"android:icon="@drawable/ic_menu_close_clear_cancel"android:orderInCategory="300"android:title="@string/exit"></item></menu>

strings.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<resources><string name="hello">Hello World, MediaActivity!</string><string name="app_name">Media</string><string name="search">搜索本地音乐</string><string name="clear_music_list">清除播放列表</string><string name="exit">退出</string></resources>

Android--MediaPlayer(实现列表选歌,上一首,下一首,清空播放列表,搜索本地音乐文件)相关推荐

  1. Android--MediaPlayer(实现列表选歌,上一首,下一首,清空播放列表,搜索本地音乐文件)...

    Android--MediaPlayer(实现列表选歌,上一首,下一首,清空播放列表,搜索本地音乐文件) 下载链接:http://download.csdn.net/detail/zlqqhs/507 ...

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

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

  3. Android 自动扫描歌曲,Android扫描本地音乐文件开发案例分享

    一.前言 本来觉得so easy,真是没想到,还搞了老半天,搞的我大汗淋漓,要拍桌子摔键盘了. 本想实现的功能是: 通过网易云音乐/百度音乐/QQ音乐/酷狗音乐中一个API,通过关键词/歌手/歌词来搜 ...

  4. 音乐播放,进度条,上一首下一首,暂停/播放

    recycle_item布局: <?xml version="1.0" encoding="utf-8"?><LinearLayout xml ...

  5. audio 上一首 下一首 自定义样式_总有一首网易云,藏着你忘不掉的人。

    回忆像附骨之蛆,每到深夜钻出来啃食伤口.网易云就是当代人深夜的归宿.未必多好听,而是总有几句歌词,里面藏着我们不能说的秘密,和不想忘的人.当所有词不达意.欲言又止时,又是谁存在于你的歌声里?小二这人总 ...

  6. audio 上一首 下一首 自定义样式_请问我下面的js代码点击下一首按钮的时候怎么播放下一首...

    我做了个随机播放,然后要做循坏遍历异步返回的歌曲数据时候,本来是要做的效果是点击左右按钮可以播放上一首和下一首,但是结果是点击左边按钮直接播放第一首,而点击右按钮的时候直接就播放了最后一首,谁帮忙给个 ...

  7. audio 上一首 下一首 自定义样式_被 iPhone 吹爆的最香功能,安卓也终于安排上了...

    大家好,我是今天找到又一快乐根源的酷玩君. 其实,想获取快乐的方式很简单,就是克服困难取得新的成就 新的技巧 . iOS 14中,这个双击后盖有惊喜的场面,大家都见过了吧? 通过敲击两下或三下手机背部 ...

  8. audio 上一首 下一首 自定义样式_我们的歌:盛典即将来临,勤深深还有一首歌,这场表演值得期待...

    在最新一期<我们的歌>节目里面,勤深深回归,并且唱了一首歌曲<爱情转移>粤语版<富士山下>. 虽然回归让人惊喜,但是很显然,对于喜欢勤深深的歌迷来说,一首歌曲,是不 ...

  9. audio 上一首 下一首 自定义样式_HTML5中 audio标签的样式修改

    2017年8月23日,台风"天鸽"的到来,带来了些风雨,也给平淡的上班生活带来了些乐趣. 今天做的一个小需求,就是要在网页上添加音频,html5属性 可以实现,用这个标签可以实现音 ...

最新文章

  1. hdoj-2039-三角形
  2. python入门实践1-11课视频分享
  3. Linux文本编辑跳到指定行,Linux 命令每日一练:vi命令
  4. debug 标志位说明
  5. hdu 2275 Kiki Little Kiki 1 水题
  6. python程序调试题_关于python程序调试问题,一个文件计算的问题
  7. 基于 Layui 的富文本编辑器和封面的实现方案
  8. Java 面试——数据类型计算与拆箱装箱
  9. cpu性能参数如何看?
  10. 阿里矢量图标库 - 如何修改和使用自定义字体名称
  11. 2020-03-28
  12. 【数据结构】- 几个步骤教你认识并实现一个链表之带头(哨兵位)双向循环链表(中)
  13. 滚动轴承故障特征频率计算公式
  14. srs直播 java开发,通过srs实现直播
  15. 【轉】一個在台積電工作3年的工程師寫給學弟學妹們的信
  16. 市面上有几款手机有NFC功能的,什么牌子什么型号的?
  17. 北斗组网大功告成!你的手机真的能连上北斗吗
  18. 从 NetFx3.cab 安装.net 3.5
  19. 没有耐心去等待成功的到来,只好用一生的耐心去面对失败
  20. echarts地图api series_echarts实现中国地图数据展示

热门文章

  1. 视美泰和边缘计算社区达成合作,共同促进粤港澳大湾区边缘计算生态建设!
  2. Macaw:让你像处理图片那样写Web代码
  3. 国内好的crm系统有哪些?
  4. 利用STM32CubeMX软件生成USB_HOST_HID连接鼠标和键盘扫码枪
  5. C构造函数的要点梳理~
  6. cookie、session、sessionId 详解
  7. 【log+科学计数法】HDU-1060 Leftmost Digit
  8. 从0到0.1,快速搭建一个静态网站
  9. 【软考系统架构设计师】2014年下系统架构师论文写作历年真题
  10. 3A信用等级证书的应用有哪些