读取SD卡文件夹下的MP3文件和播放MP3文件
首先获取SD卡path路径下的所有的MP3文件,并将文件名和文件大小存入List数组(此代码定义在FileUtils类中):
/**
* 读取目录中的Mp3文件的名字和大小
*/
public List<Mp3Info> getMp3Files(String path) {
SDCardRoot = Environment.getExternalStorageDirectory()
.getAbsolutePath(); //获取SD卡的路径名
List<Mp3Info> mp3Infos = new ArrayList<Mp3Info>();
File file = new File(SDCardRoot + File.separator + path);
File[] files = file.listFiles();
for (int i = 0; i < files.length; i++) {
if (files[i].getName().endsWith(".mp3")) {
Mp3Info mp3Info = new Mp3Info();
mp3Info.setMp3Name(files[i].getName());
mp3Info.setMp3Size(files[i].length() + "");
mp3Infos.add(mp3Info); //此mp3Info对象中包含mp3文件名和文件大小
}
}
return mp3Infos;
}
当前Activity继承自ListActivity,在此Activity的onResume方法中调用getMp3Files()方法,获取路径下的Mp3文件
@Override
protected void onResume() {
FileUtils fileUtils = new FileUtils();
mp3Infos = fileUtils.getMp3Files("mp3/");
List<HashMap<String,String>> list = new ArrayList<HashMap<String,String>>();
for(Iterator iterator = mp3Infos.iterator();iterator.hasNext();){
Mp3Info mp3Info = (Mp3Info) iterator.next();
HashMap<String,String> map = new HashMap<String,String>();
map.put("mp3_name", mp3Info.getMp3Name());
map.put("size_id", mp3Info.getMp3Size());
list.add(map);
}
SimpleAdapter simpleAdapter = new SimpleAdapter(this,list,R.layout.mp3info_item,new String[]{"mp3_name","size_id"},new int[] {R.id.mp3_name,R.id.size_id}); //mp3info_item.xml文件中仅有两个TextView,id为mp3_name和size_id
setListAdapter(simpleAdapter);
super.onResume();
}
当点击当前Activity中的某一行时,播放当前行的Mp3文件:
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
if(mp3Infos != null){
Mp3Info mp3Info = mp3Infos.get(position);
Intent intent = new Intent();
intent.putExtra("mp3Info", mp3Info);
intent.setClass(this,PlayerActivity.class);
startActivity(intent);
}
super.onListItemClick(l, v, position, id);
}
PlayerActivity.class类中通过Service来播放选中的Mp3文件,定义如下:
public class PlayerActivity extends Activity {
private ImageButton beginButton = null;
private ImageButton pauseButton = null;
private ImageButton stopButton = null;
private Mp3Info mp3Info = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.player);
super.onCreate(savedInstanceState);
Intent intent = getIntent();
mp3Info = (Mp3Info) intent.getSerializableExtra("mp3Info");
beginButton = (ImageButton) findViewById(R.id.begin);
pauseButton = (ImageButton) findViewById(R.id.pause);
stopButton = (ImageButton) findViewById(R.id.stop);
ButtonClickListener listener = new ButtonClickListener();
beginButton.setOnClickListener(listener);
pauseButton.setOnClickListener(listener);
stopButton.setOnClickListener(listener);
}
class ButtonClickListener implements OnClickListener {
@Override
public void onClick(View v) {
if (v.getId() == R.id.begin) { // 播放按键
//创建一个intent对象,通知Service开始播放MP3
Intent intent = new Intent();
intent.setClass(PlayerActivity.this, PlayerService.class);
intent.putExtra("mp3Info", mp3Info);
intent.putExtra("MSG", AppConstant.PlayerMsg.PLAY_MSG);
//启动Service
startService(intent);
} else if (v.getId() == R.id.pause) {
//通知Service暂停播放MP3
Intent intent = new Intent();
intent.setClass(PlayerActivity.this, PlayerService.class);
intent.putExtra("MSG", AppConstant.PlayerMsg.PAUSE_MSG);
startService(intent);
} else if (v.getId() == R.id.stop) {
//通知Service停止MP3文件
Intent intent = new Intent();
intent.setClass(PlayerActivity.this, PlayerService.class);
intent.putExtra("MSG", AppConstant.PlayerMsg.STOP_MSG);
startService(intent);
}
}
}
}
PlayerService定义如下:
public class PlayerService extends Service {
private boolean isPlaying = false;
private boolean isPause = false;
private boolean isReleased = false;
private MediaPlayer mediaPlayer = null;
private Mp3Info mp3Info = null;
private ArrayList<Queue> queues = null;
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
// 每次从Activity向Service发送intent对象时,触发该事件
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
mp3Info = (Mp3Info) intent.getSerializableExtra("mp3Info");
int MSG = intent.getIntExtra("MSG", 0);
if (mp3Info != null) {
if (MSG == AppConstant.PlayerMsg.PLAY_MSG) {
play(mp3Info);
}
}
else{
if(MSG == AppConstant.PlayerMsg.PAUSE_MSG){
pause();
}
else if(MSG == AppConstant.PlayerMsg.STOP_MSG){
stop();
}
}
return super.onStartCommand(intent, flags, startId);
}
private void play(Mp3Info mp3Info){
if(!isPlaying){
String path = getMp3Path(mp3Info);
mediaPlayer = MediaPlayer.create(this, Uri.parse("file://" + path));
mediaPlayer.setLooping(true); //设置歌曲循环播放
mediaPlayer.start();
isPlaying = true;
isReleased = false;
}
}
private void pause(){
if(mediaPlayer != null){
if(isPlaying){
mediaPlayer.pause();
} else{
mediaPlayer.start();
}
isPlaying = isPlaying ? false : true;
}
}
private void stop(){
if(mediaPlayer!=null){
if(isPlaying){
if(!isReleased){
mediaPlayer.stop();
mediaPlayer.release();
isReleased = true;
isPlaying = false;
}
}
}
}
private String getMp3Path(Mp3Info mp3Info){
String SDCardRoot = Environment.getExternalStorageDirectory().getAbsolutePath();
String path = SDCardRoot + File.separator + "mp3" + File.separator + mp3Info.getMp3Name();
return path;
}
读取SD卡文件夹下的MP3文件和播放MP3文件的更多相关文章
- 飞鱼相册笔记(1)----外置SD卡文件夹名称不区分大小写
飞鱼相册笔记(1)----外置SD卡文件夹名称不区分大小写 在飞鱼相册发布的第一个测试版中,很多用户表示无法查看外置SD卡中的照片.乍一听觉得加个外置SD卡的根目录,然后在扫描所有图片的时候把这个根目 ...
- Android得到SD卡文件夹大小以及删除文件夹操作
float cacheSize = dirSize(new File(Environment.getExternalStorageDirectory() + AppConstants.APP_CACH ...
- 遍历文件夹及其子文件夹下的.pdf文件,并解压文件夹下所有的压缩包
List<PDFPATH> pdfpath = new List<PDFPATH>(); List<string> ziplist = new List<st ...
- Java 遍历指定文件夹及子文件夹下的文件
Java 遍历指定文件夹及子文件夹下的文件 /** * 遍历指定文件夹及子文件夹下的文件 * * @author testcs_dn * @date 2014年12月12日下午2:33:49 * @p ...
- JAVA中删除文件夹下及其子文件夹下的某类文件
##定时删除拜访图片 ##cron表达式 秒 分 时 天 月 ? ##每月1日整点执行 CRON1=0 0 0 1 * ? scheduled.enable1=false ##图片路径 filePat ...
- 通过ftp同步服务器文件:遍历文件夹所有文件(含子文件夹、进度条);简单http同步服务器文件实例
该代码主要实现,指定ftp服务地址,遍历下载该地址下所有文件(含子文件夹下文件),并提供进度条显示:另外附带有通过http地址方式获取服务器文件的简单实例 废话不多说,直接上代码: 1.FTPHelp ...
- 安卓下对SD卡文件的读写
为SD下的操作文件,封装了一些类: package ujs.javawritedata; import java.io.File; import java.io.FileInputStream; im ...
- asp.net(C#)读取文件夹和子文件夹下所有文件,绑定到GRIDVIEW并排序 .
Asp部分: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="MyFiles ...
- FILE文件删除操作(删除指定文件夹下所有文件和文件夹包括子文件夹下所有文件和文件夹),就是删除所有
2018-11-05 19:42:08开始写 选择 删除 1.FileUtils.java类 import java.io.File;//导入包 import java.util.List;//导入 ...
随机推荐
- eclipse版本发展历史
Eclipse百科 https://zh.wikipedia.org/wiki/Eclipse # 中文维基百科 http://baike.baidu.com/subview/23576 ...
- ECMAScript6 初步认识
JavaScript由3部分组成,分别是:Dom,BOM和ECMAScript !核心(ECMAScript):由ECMA-262定义,提供核心语言功能:ECMAScript是属于国际标准化语言,所有 ...
- jQuery代码节选(筛选)
筛选...8.not()<p class="p1">1</p><p class="p2">2</p><p ...
- NGINX实现反向代理
一.安装NGINX 略,请自行百度,GOOGEL 二.配置文件1.由上面的步骤,我们看到配置文件放置在/etc/nginx/目录下:主要配置文件:/etc/nginx/nginx.conf 扩展配置文 ...
- weblogic 12c web部署注意的问题
废话不多说下面讲介绍他的具体部署web应用,应该注意哪些问题. 准备工作: Java JDK 安装及环境配置 http://jingyan.baidu.com/article/ff41162596a7 ...
- SQL Server 2016 CTP2.2 安装手记
SQL Server 2016 CTP2.2 安装手记 下载一个iso文件,解压出来(大约2.8G左右),在该路径下双击Setup.exe即可开始安装. 安装之前请先安装.NET 3.5 SP1,在服 ...
- Apache Mina实战
Mina介绍 Mina可以用于快速的开发基于网络通信的应用,特别是在开发手机端的游戏应用时,使用的较为普遍.本文简单介绍了一个用Mina搭建的一个简易讨论组,通过该应用可以对Mina的基本用法用途有个 ...
- 开始用Word 2013来写博客
第一步:如果从未发布过博客文章的话,需要在菜单里面选这里添加博客账号 第二步:选择正确的设置 第三步:写完博客之后,按这里就可以发布了! 如果以后需要写新的博客的话,还可以直接点这里: ...
- Azure PowerShell (4) 使用PowerShell管理多个订阅
<Windows Azure Platform 系列文章目录> 笔者手上有两个Azure账户. - Azure Global (windowsazure.com)账户.有两个订阅. - 世 ...
- Step by step 如何创建一个新森林
原创地址:http://www.cnblogs.com/jfzhu/p/4006118.html 转载请注明出处 创建一个新森林就是在一台计算机上安装AD DS,并将这台计算机提升为域控制器. 演示环 ...