mp3播放器 遍历本地音乐显示在listview上,点击每一项item并传送音乐地址

     最近做了个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 自带的遍历音乐文件的方法,获取信息比较全面,我就放在下篇博客。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值