读取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;//导入 ...
随机推荐
- .Net程序员之不学Java做安卓开发:Android Studio中的即时调试窗口
对学.Net的人来说,JAVA开发是一场噩梦. .net中的即时窗口,调试时直接在里面写代码,对程序中的各种方法/属性进行调用,很方便. Android Studio中找了好久,参考如下网址,也有类似 ...
- 6.数组和Hash表
当显示多条结果时,存储在变量中非常智能,变量类型会自动转换为一个数组. 在下面的例子中,使用GetType()可以看到$a变量已经不是我们常见的string或int类型,而是Object类型,使用-i ...
- SQL Server恢复软件SysTools SQL Recovery/SysTools SQL Server Recovery Manager
SQL Server恢复软件SysTools SQL Recovery/SysTools SQL Server Recovery Manager http://www.systoolsgroup.co ...
- 小菜学习设计模式(五)—控制反转(Ioc)
写在前面 设计模式目录: 小菜学习设计模式(一)—模板方法(Template)模式 小菜学习设计模式(二)—单例(Singleton)模式 小菜学习设计模式(三)—工厂方法(Factory Metho ...
- [.net 面向对象程序设计进阶] (1) 开篇
[.net 面向对象程序设计进阶] (1) 开篇 上一系列文章<.net 面向对象编程基础>写完后,很多小伙伴们希望我有时间再写一点进阶的文章,于是有了这个系列文章.这一系列的文章中, 对 ...
- 高灵活度,高适用性,高性能,轻量级的 ORM 实现
ORM(Object-Relational Mapping 对象关系映射),它的作用是在关系型数据库和业务实体对象之间作一个映射,目的是提供易于理解的模型化数据的方法. ORM虽然有诸多好处,但是在实 ...
- delegate、notification、KVO场景差别
delegate: 编译器会给出没有实现代理方法的警告 一对一 使用weak而不是assign,或者vc消失时置为nil 可以传递参数,还可以接收返回值 notification: 编译期无法排错 一 ...
- 《FaceBook效应》——读后总结
这本书讲述了facebook从如何创建.到风靡全球,并结合facebook的网络效应讲述为什么facebook可以做到社交龙头.读这本书的时候,也可以看看<社交网络>这部电影. faceb ...
- dede在php7上空白
最近想看一本小说,想采集回来看,结果发现除了dedecms支持php7.0,其他主流cms基本上都不支持php7.0 在本地win7上调试了一遍,没有问题,放到linux服务器上的时候,发现打开任何页 ...
- MySQL 查看表结构简单命令
一.简单描述表结构,字段类型 desc tabl_name; 显示表结构,字段类型,主键,是否为空等属性,但不显示外键. 例如:desc table_name 二.查询表中列的注释信息 select ...