最近做了个Mp3播放器,可以实现基本的核心功能如播放,暂停,上一曲,下一曲,播放音乐时发送通知,因为本人技术不是很好做的东西只能算得上Dome级的,还有很多不足之处,还望大家指出,促使自己不断长进。。。。。首先,我们要把手机sdcard里的音乐要遍历查找出来,显示在界面上,就需要用到listview,自定义适配器。本人就选了个自己喜欢的音乐播放器来模仿,效果如下:
package com.example.duomimusicplayer;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
public class PlayerListActivity extends Activity implements OnItemClickListener {
private ListView mListView;
private ArrayList filelist = new ArrayList();
private TextView mCountTextView;
private ImageButton mBackImageButton;
private File itemfile;
private File rootfile;
private FileListViewAdapter adapters = new FileListViewAdapter(this);
private ArrayList<MusicFileBean> mMusicBeanList = new ArrayList<MusicFileBean>();// 装音乐列表的数组
private ArrayList<File> mFileList = new ArrayList<File>();
private File musicfile = Environment.getExternalStorageDirectory();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.playerlist_layout);
mBackImageButton = (ImageButton) findViewById(R.id.list_back_imager);
mCountTextView = (TextView) findViewById(R.id.playlist_count);
mListView = (ListView) findViewById(R.id.playlist_listview);
mListView.setOnItemClickListener(this);
seacrhMusicFile(musicfile);
mListView.setAdapter(adapters);
adapters.setAdapterData(filelist);
mBackImageButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
startActivity(new Intent(PlayerListActivity.this,
MusicServiceActivity.class));
}
});
}
/*
*
*/
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
Intent intent = new Intent(PlayerListActivity.this,
MusicServiceActivity.class);
intent.putParcelableArrayListExtra("MUSICFILE_LIST", mMusicBeanList);// 传地址
intent.putExtra("CURRENT_POSTION", position);
startActivity(intent);
// finish();
}
/**
* 遍历搜索音乐文件
*/
public void seacrhMusicFile(File rootsFile) {
// File musicfile = Environment
// .getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC);
//
// if (musicfile != null) {
// File[] files = musicfile.listFiles();// 列出当前目录下的所有文件
// filelist = new ArrayList();
// for (File file : files) {
// filelist.add(file);
// // 构造音乐播放列表,遍历所有音乐后把所有音乐放在一个集合里
// MusicFileBean music = new MusicFileBean();
// music.setMusicName(file.getName());
// music.setMusicPath(file.getPath());
//
// String musicName = music.getMusicName();// 如xx.mp3
// String musicNamefg = musicName.substring(0,
// musicName.length() - 4);// 对mp3格式文件名进行分割,从0位开始,到“.”分隔开
// music.setMusicName(musicNamefg);
// mMusicBeanList.add(music);
// }
// adapters.setAdapterData(filelist);
//
// } else {
// Toast.makeText(this, "音乐文件为空!", Toast.LENGTH_SHORT).show();
//
// }
// mListView.setAdapter(adapters);
// File[] files = musicfile.listFiles();// 列出当前目录下的所有文件
// filelist = new ArrayList();
// for (File file : files) {
// filelist.add(file);
File[] files = rootsFile.listFiles();// 列出当前目录下的所有文件
if (files.length > 0) {
for (File file : files) {
if (file.isDirectory()) {
seacrhMusicFile(file);//递归调用
} else {
String name = file.getName();
if (name.endsWith(".m4a")||name.endsWith(".mp3")) {
filelist.add(file);
//下面这几行代码是为了后面传递音乐路径而整理的音乐集合,如果只需要把本地音乐显示在listview列表上的话,就不需要下面的代码
// 构造音乐播放列表,遍历所有音乐后把所有音乐放在一个集合里
MusicFileBean music = new MusicFileBean();
music.setMusicName(file.getName());
music.setMusicPath(file.getPath());
String musicName = music.getMusicName();// 如xx.mp3
String musicNamefg = musicName.substring(0,
musicName.length() - 4);// 对mp3格式文件名进行分割,从0位开始,到“.”分隔开
music.setMusicName(musicNamefg);
mMusicBeanList.add(music);
}
}
}
}
}
/*
* 自定义FileListViewAdapter适配器
*/
public class FileListViewAdapter extends BaseAdapter {
private Context mContext;
private List mList = new ArrayList();
public FileListViewAdapter(Context context) {
mContext = context;
}
public void setAdapterData(ArrayList<File> list) {
this.mList = list;
notifyDataSetChanged();
}
public int getCount() {// 返回容器中的元素个数(返回listview的长度)
return mList.size();
}
@Override
public Object getItem(int position) {// 返回容器中指定位子的数据项
return mList.get(position);
}
@Override
public long getItemId(int position) {// 返回容器中指定位置的ID
mCountTextView.setText("(" + (position + 1) + "/" + mList.size()
+ ")");
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = null;
ViewHolder viewHolder;
if (convertView == null) {
v = LayoutInflater.from(mContext).inflate(
R.layout.playlist_item, null);
viewHolder = new ViewHolder();
viewHolder.iconImage = (ImageView) v
.findViewById(R.id.playlist_icon);
viewHolder.contexttxt = (TextView) v
.findViewById(R.id.playlist_textview);
v.setTag(viewHolder);
} else {
v = convertView;
viewHolder = (ViewHolder) v.getTag();
}
File file = (File) getItem(position);
viewHolder.contexttxt.setText(file.getName());
return v;
}
public class ViewHolder {
ImageView iconImage;
TextView contexttxt;
}
}
}
<?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:background="#1a1a1a"
android:orientation="vertical" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#1a1a1a"
android:paddingLeft="10dp" >
<ImageButton
android:id="@+id/list_back_imager"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#1a1a1a"
android:paddingLeft="10dp"
android:src="@drawable/icon_back_white"
/>
<TextView
android:id="@+id/list_textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="本地音乐"
android:textColor="#ffffff"
android:textSize="20sp" />
<TextView
android:id="@+id/playlist_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/list_textview"
android:gravity="center"
android:textColor="#ffffff"
android:textSize="20sp" />
</RelativeLayout>
<ListView
android:id="@+id/playlist_listview"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</ListView>
</LinearLayout>
对sdcard里的所有文件进行遍历,以mp3或m4a结束的文件名就是音乐文件,这个方法比较简单,但是获取的音乐信息不全面,如音乐文件大小,音乐播放时长等等,后面有朋友推荐了一种android 自带的遍历音乐文件的方法,获取信息比较全面,我就放在下篇博客。