Android音乐播放器(一):搜索手机存储的音乐

Android音乐播放器(一):搜索手机存储的音乐

一、MusicInfo类——音乐实体类


首先我们需要一个实体类,用于存储搜索到的音乐的一些信息。因为后面要进行Intent的数据传递,所以这里我们的实体类需要进行序列化。
Android中实现序列化有两种方式,其一是利用Serializable接口,另一个是利用Parcelable接口。而后者是Android特有的,相比前者,利用Parcelable的效率
更高,但实现起来稍微复杂一些,而利用Serializable接口只需要implements该接口就好,系统会自动的进行序列化。这里我们使用Parcelable接口。

import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;

public class MusicInfo implements Parcelable {
	
	public final static String KEY_MUSIC= "music";
	
	public static final String KEY_ID = "_id";
	public static final String KEY_SONG_ID = "songid";
	public static final String KEY_ALBUM_ID = "albumid";
	public static final String KEY_DURATION = "duration";
	public static final String KEY_MUSIC_NAME = "musicname";
	public static final String KEY_ARTIST = "artist";
	public static final String KEY_DATA = "data";
	public static final String KEY_FOLDER = "folder";
	public static final String KEY_MUSIC_NAME_KEY = "musicnamekey";
	public static final String KEY_ARTIST_KEY = "artistkey";
	public static final String KEY_FAVORITE = "favorite";
	
	/** 数据库中的_id */
	public int _id = -1;
	public int songId = -1;
	public int albumId = -1;
	public int duration;
	public String musicName;
	public String artist;
	public String data;
	public String folder;
	public String musicNameKey;
	public String artistKey;
	/** 0表示没有收藏 1表示收藏 */
	public int favorite = 0;
	
	
	@Override
	public int describeContents() {
		return 0;
	}
	@Override
	public void writeToParcel(Parcel dest, int flags) {
		Bundle bundle = new Bundle();
		bundle.putInt(KEY_ID, _id);
		bundle.putInt(KEY_SONG_ID, songId);
		bundle.putInt(KEY_ALBUM_ID, albumId);
		bundle.putInt(KEY_DURATION, duration);
		bundle.putString(KEY_MUSIC_NAME, musicName);
		bundle.putString(KEY_ARTIST, artist);
		bundle.putString(KEY_DATA, data);
		bundle.putString(KEY_FOLDER, folder);
		bundle.putString(KEY_MUSIC_NAME_KEY, musicNameKey);
		bundle.putInt(KEY_FAVORITE, favorite);
		dest.writeBundle(bundle);
	}
	
	public static final Parcelable.Creator<MusicInfo> CREATOR = new Parcelable.Creator<MusicInfo>() {

		@Override
		public MusicInfo createFromParcel(Parcel source) {
			MusicInfo music = new MusicInfo();
			Bundle bundle = new Bundle();
			bundle = source.readBundle();
			music._id = bundle.getInt(KEY_ID);
			music.songId = bundle.getInt(KEY_SONG_ID);
			music.albumId = bundle.getInt(KEY_ALBUM_ID);
			music.duration = bundle.getInt(KEY_DURATION);
			music.musicName = bundle.getString(KEY_MUSIC_NAME);
			music.artist = bundle.getString(KEY_ARTIST);
			music.data = bundle.getString(KEY_DATA);
			music.folder = bundle.getString(KEY_FOLDER);
			music.musicNameKey = bundle.getString(KEY_MUSIC_NAME_KEY);
			music.favorite = bundle.getInt(KEY_FAVORITE);
			return music;
		}

		@Override
		public MusicInfo[] newArray(int size) {
			return new MusicInfo[size];
		}
	};


	public int getFavorite() {
		return favorite;
	}
	public void setFavorite(int favorite) {
		this.favorite = favorite;
	}
}


 
 

二 、搜索音乐的核心方法实现

package com.music.wangmusic;

import java.io.File;
import java.util.ArrayList;
import android.database.Cursor;
import android.provider.MediaStore;
import android.util.Log;

public class MusicUtils {
	
	public static final int FILTER_SIZE = 1 * 1024 * 1024;// 1MB
	public static final int FILTER_DURATION = 1 * 60 * 1000;// 1分钟
	
	public static String[] proj_music = new String[] {
		MediaStore.Audio.Media._ID, MediaStore.Audio.Media.TITLE,
		MediaStore.Audio.Media.DATA, MediaStore.Audio.Media.ALBUM_ID,
		MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.ARTIST_ID,
		MediaStore.Audio.Media.DURATION };
	
	// 音乐检索方法
	public static ArrayList<MusicInfo> getMusicList(Cursor cursor) {
		if (cursor == null) {
			return null;
		}
		ArrayList<MusicInfo> musicList = new ArrayList<MusicInfo>();
		while (cursor.moveToNext()) {
			MusicInfo music = new MusicInfo();
			music.songId = cursor.getInt(cursor
					.getColumnIndex(MediaStore.Audio.Media._ID));
			music.albumId = cursor.getInt(cursor
					.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID));
			music.duration = cursor.getInt(cursor
					.getColumnIndex(MediaStore.Audio.Media.DURATION));
			Log.i("Name",""+music.duration);//输出时长
			music.musicName = cursor.getString(cursor
					.getColumnIndex(MediaStore.Audio.Media.TITLE));
			Log.i("Name",music.musicName);//输出名称
			music.artist = cursor.getString(cursor
					.getColumnIndex(MediaStore.Audio.Media.ARTIST));

			String filePath = cursor.getString(cursor
					.getColumnIndex(MediaStore.Audio.Media.DATA));
			music.data = filePath;
			Log.i("Name",music.data);//输出路径
			String folderPath = filePath.substring(0,
					filePath.lastIndexOf(File.separator));
			music.folder = folderPath;
			music.musicNameKey = StringHelper.getPingYin(music.musicName);
			music.artistKey = StringHelper.getPingYin(music.artist);
			musicList.add(music);
		}
		cursor.close();
		return musicList;
	}
}

三、开始搜索以及输出结果


private void startSearch(){
		new Thread(new Runnable() {

			public void run() {
				Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;//-------------
				ContentResolver cr = MainActivity.this.getContentResolver();
				StringBuffer select = new StringBuffer(" 1=1 ");
				// 查询语句:检索出时长大于1分钟,文件大小大于1MB的媒体文件
				select.append(" and " + Media.SIZE + " > " + MusicUtils.FILTER_SIZE);
				select.append(" and " + Media.DURATION + " > " + MusicUtils.FILTER_DURATION);

				musicArrayList = MusicUtils.getMusicList(cr.query(uri, MusicUtils.proj_music,
						select.toString(), null,
						MediaStore.Audio.Media.ARTIST_KEY));
			}
		}).start();
	}


四、参考 


https://github.com/longdw/MyMusic

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值