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

下载链接:http://download.csdn.net/detail/zlqqhs/5079025
MediaPlayerActivity类:
- <span
style="font-size:14px;">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();
- }
- }
- </span>
mediaplayer_layout.xml布局文件:
- <span
style="font-size:14px;"><?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></span>
media_menu.xml文件:
- <span
style="font-size:14px;"><?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></span>
strings.xml文件:
- <span
style="font-size:14px;"><?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></span>
Android--MediaPlayer(实现列表选歌,上一首,下一首,清空播放列表,搜索本地音乐文件)的更多相关文章
- Android MediaPlayer播放项目res/raw和res/assets下的音频文件
1..播放res/raw //方法一:根据音频文件的ID来创建MediaPlayer MediaPlayer mp = new MediaPlayer(this,R.raw.test); mp.sta ...
- MediaPlayer音乐播放器、上一首、下一首、播放、停止、自动下一首、进度条
本文介绍MediaPlayer的使用.MediaPlayer可以播放音频和视频,另外也可以通过VideoView来播放视频,虽然VideoView比MediaPlayer简单易用,但定制性不如用Med ...
- 我在 Gitee 上发现了一个简洁又好用的网络音乐播放器!
这几天无聊的时候我想听听歌,但我想要找一个简单快速的网络音乐播放器来用用.这时我在 Gitee 上看见一个看上去不错的开源项目 -- Hi音乐. 项目链接:https://gitee.com/hi-j ...
- Unity上一页下一页切换功能实现源码(仅供参考)
在做项目时我们有时需要实现切换上一页下一页图片,切换上一首下一首歌曲等等类似的功能.这里写了个简单的实现源码(仅供参考),要是有更好的方法欢迎提出来,共同进步~ 以切换上一页下一页图片为例: usin ...
- 项目源码--Android本地音乐播放器
下载源码 技术要点: 1.本地音乐播放与管理 2.支持在线下载 3.非库音频流的解码 4. UI控件的综合使用 5. HTTP通信模块 6. Mysql数据库的综合使用 7. 后台服务技术 8. 源码 ...
- Android MediaPlayer和VideoView的使用
MediaPlayer MediaPlayer类是Androd多媒体框架中的一个重要组件,通过该类,我们可以以最小的步骤来获取,解码和播放音视频.它支持三种不同的媒体来源: 本地资源 内部 ...
- 我的Android进阶之旅】GitHub 上排名前 100 的 Android 开源库进行简单的介绍
GitHub Android Libraries Top 100 简介 本文转载于:https://github.com/Freelander/Android_Data/blob/master/And ...
- Android 在滚动列表中实现视频的播放(ListView & RecyclerView)
这片文章基于开源项目: VideoPlayerManager. 所有的代码和示例都在那里.本文将跳过许多东西.因此如果你要真正理解它是如何工作的,最好下载源码,并结合源代码一起阅读本文.但是即便是没有 ...
- fir.im Weekly - 2016 年 Android 最佳实践列表
2016 年已经过去一半,你在年初制定的成长计划都实现了吗? 学海无涯,技术成长不是一簇而就的事情.本期 fir.im Weekly 推荐 王下邀月熊_Chevalier的 我的编程之路--知识管理与 ...
随机推荐
- Linux应用编程之lseek详解
Linux应用编程之lseek详解 1.lseek函数介绍 (1).文件指针:当我们要对一个文件进行读写时,一定要先打开这个文件,所以我们读写的所有文件都是动态文件.动态文件在内存中的形态就是文件流的 ...
- CSS知识点小结
在网页排版布局中比如文章列表标题排版,无论多少文字均不希望换行显示,需要强制在一行显示完内容.这就可以nobr标签来实现. 一.nobr语法 <nobr>内容</nobr> 不 ...
- SQL Server Driver for PHP之sqlsrv相关函数
SQL Server Driver for PHP 包含以下函数: 函数 说明 sqlsrv_begin_transaction 开始事务. sqlsrv_cancel 取消语句:并放弃相应语句的所有 ...
- top 命令中的VIRT,RES,SHR ,MEM区别
VIRT 表示进程的虚拟(地址)空间大小,其包含进程实际使用的大小(申请的堆栈), 使用mmap映射的大小,包括外设RAM, 还有映射到本进程的文件(例如动态库),还有进程间的共享内存.所以VIRT ...
- Linkage Disequilibrium|D‘|r2
I.10 Other Measures of Linkage Disequilibrium 因为D的取值强烈地依赖于人为制定的等位基因频率(PA及PB),所以它不利于LD程度的比较.标准化的不平衡系数 ...
- 爬虫笔记(十四)——BeautifulSoup库
Beautifulsoup库: 该库是python语言写的,主要功能是将html.xml格式的数据对象解析成"标签树",并进行遍历和维护,即可以从网页抓取数据. 借鉴的html是妹 ...
- Opencv笔记(十六)——认识轮廓
什么是轮廓? 轮廓可以简单认为成连续的点(连着边界)连在一起的曲线,具有相同的颜色或者灰度.轮廓在形状分析和物体的检测和识别中很有用.谈起轮廓不免想到边缘,它们确实很像.简单的说,轮廓是连续的,边缘并 ...
- idea maven Running C:\Users\Administrator\AppData\Local\Temp\archetype1tmp
Running C:\Users\Administrator\AppData\Local\Temp\archetype1tmp 在IDEA中通过maven项目管理工具创建javaweb项目的时候一直卡 ...
- 吴裕雄--天生自然python学习笔记:python 用pygame模块检测键盘事件和鼠标事件
用户可通过键盘输入来操控游戏中角色的运动,取得键盘事件的方法有以下两种 : 常用的按键与键盘常数对应表 : 按下右箭头键,蓝色小球会 向 右移动:按住右箭头键不放 , 球体会快速 向 右移 动, 若到 ...
- Create Collection Type with Class Type Constraints
Create Collection Type with Class Type Constraints: new TypeToken<ArrayList<ClassType>>( ...