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的 我的编程之路--知识管理与 ...
 
随机推荐
- Iptables用法规则及防火墙配置
			
[转载]http://www.cnblogs.com/yi-meng/p/3213925.html iptables规则 即防火墙规则,在内核看来,规则就是决定如何处理一个包的语句.如果一个包符合条 ...
 - _\_call\_\_
			
__call__ 一.__call__ 对象后面加括号时,触发执行. 注:构造方法的执行是由创建对象触发的,即:对象 = 类名() :而对于 __call__ 方法的执行是由对象后加括号触发的,即:对 ...
 - Python程序中的进程操作--—--开启多进程
			
Python程序中的进程操作-----开启多进程 之前我们已经了解了很多进程相关的理论知识,了解进程是什么应该不再困难了,刚刚我们已经了解了,运行中的程序就是一个进程.所有的进程都是通过它的父进程来创 ...
 - SEO优化技巧
			
一.搜索引擎工作原理 当我们在输入框中输入关键词,点击搜索或查询时,然后得到结果.深究其背后的故事,搜索引擎做了很多事情. 在搜索引擎网站,比如百度,在其后台有一个非常庞大的数据库,里面存储了海量的关 ...
 - C语言笔记 16_标准库&stdio&stdlib&string&time
			
<stdio.h> 简介 stdio .h 头文件定义了三个变量类型.一些宏和各种函数来执行输入和输出. 库变量 下面是头文件 stdio.h 中定义的变量类型: 序号 变量 & ...
 - rabbitmq安装(linux)遇到 很多坑
			
1.下载erlang官网地址 http://www.erlang.org/download 挑选合适的版本 然后 建议20.3运行命令 wget http://erlang.org/download/ ...
 - maven坐标 加速下载
			
<repositories> <repository> <id>aliyun</id> <name>aliyun</name> ...
 - Error: Invalid or corrupt jarfile SpringBootTemplate.jar
			
当在尝试将SpringBoot打包成为Jar文件, 丢到linux服务器去运行的时候, 尝试在windows自带的CMD窗口命令行中运行jar文件的时候, 遇到了这样的问题. 错误的意思是: 无效 或 ...
 - iOS之正则表达式(一)
			
这几天研究正则表达式发现正则表达式真是个好东西,可以在支付的时候轻松匹配交易数额,入门内容以及匹配如下: @interface ViewController () @property (weak, n ...
 - drf中的请求模块和渲染模块
			
请求模块:request对象 APIView request.py # 在rest_framework.request.Request实例化方法中 self._request = request 将原 ...