下载链接: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" >    <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>


更多相关文章

  1. Android(安卓)拖拽
  2. Android(安卓)拖拽
  3. android 判断真机或者模拟器
  4. Android(安卓)拖拽
  5. Android中获取当前位置信息
  6. Android监听器实现(二)Broadcast方式对通话状态(来电,拨号,挂机)的
  7. Android电话监听器
  8. Android获得当前系统时间、星期几、周几
  9. 75.android 简单的获取当前可用运行内存,总运行内存。

随机推荐

  1. 【Android适配器系列】BaseAdapter学习笔
  2. 三星给中国电信定制的支持Android(安卓)2
  3. Android中的动态加载机制
  4. Android(安卓)P zygote 原理分析之app_pr
  5. 什么时候会启动多个进程
  6. 如何检查 Android(安卓)应用的内存使用情
  7. android: Error:元素内容必须由格式正确
  8. Android(安卓)Developers:指定在线程中运
  9. Android群发短信草稿保存与发送机制
  10. 安卓实战开发之CardView的selector及Grid