Android--MediaPlayer(实现列表选歌,上一首,下一首,清空播放列表,搜索本地音乐文件)
2013-02-22 00:11
696 查看
下载链接: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(); @Override protected 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(); } @Override protected 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); } @Override public 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; } }; }; @Override public 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; } //初始化SeekBar private 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" > <ListView android:id="@+id/listView1" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" > </ListView> <TextView android:id="@+id/tv_showName" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" /> <LinearLayout android:id="@+id/linearLayout2" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" > <TextView android:id="@+id/textView1_curr_time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="5dp" android:text="00:00" /> <SeekBar android:id="@+id/seekBar1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" /> <TextView android:id="@+id/textView1_total_time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:text="00:00" /> </LinearLayout> <LinearLayout android:id="@+id/linearLayout1" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" > <ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="previous" android:src="@drawable/ic_media_previous" /> <ImageButton android:id="@+id/media_play" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="play" android:src="@drawable/ic_media_play" /> <ImageButton android: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" > <item android:id="@+id/item1_search" android:icon="@drawable/ic_menu_search" android:orderInCategory="100" android:title="@string/search"> </item> <item android:id="@+id/item2_clear" android:icon="@drawable/ic_menu_delete" android:orderInCategory="200" android:title="@string/clear_music_list"> </item> <item android: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(实现列表选歌,上一首,下一首,清空播放列表,搜索本地音乐文件)
- Android--MediaPlayer(实现列表选歌,上一首,下一首,清空播放列表,搜索本地音乐文件)
- Android mediaplayer 播放本地音乐文件
- Android开发本地及网络Mp3音乐播放器(四)实现音乐播放
- 【Android开发学习04】长时间的音乐播放实现MediaPlayer
- Android开发本地及网络Mp3音乐播放器(四)实现音乐播放
- Android开发本地及网络Mp3音乐播放器(六)实现独立音乐播放界面
- android如何长时间音乐播放实现MediaPlayer
- android开发---9.MediaPlayer实现音乐播放的demo
- Android开发本地及网络Mp3音乐播放器(六)实现独立音乐播放界面
- Android用MediaPlay方法实现本地音乐的播放,与进度条的实现
- Android MediaPlayer播放音乐并实现进度条
- Android使用本地Service实现后台播放音乐
- 简单实现Android本地音乐的播放
- Android开发本地及网络Mp3音乐播放器(十三)网络音乐搜索功能实现,歌名歌手专辑名搜索
- 使用libvlc简单的播放一首本地音乐文件
- Android实现sdcard音频文件浏览及MediaPlayer播放
- Android开发本地及网络Mp3音乐播放器(十三)网络音乐搜索功能实现,歌名歌手专辑名搜索
- Android之MediaPlayer播放音乐并实现进度条实例
- Android使用MediaPlayer播放音乐文件