Android--MediaPlayer(实现列表选歌,上一首,下一首,清空播放列表,搜索本地音乐文件)
16lz
2021-12-04
下载链接: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>
更多相关文章
- Android(安卓)拖拽
- Android(安卓)拖拽
- android 判断真机或者模拟器
- Android(安卓)拖拽
- Android中获取当前位置信息
- Android监听器实现(二)Broadcast方式对通话状态(来电,拨号,挂机)的
- Android电话监听器
- Android获得当前系统时间、星期几、周几
- 75.android 简单的获取当前可用运行内存,总运行内存。