/** * Copyright (lrc_arrow) www.longdw.com */ package com.wm.remusic.uitl; import android.content.ContentResolver; import android.content.ContentUris; import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.provider.MediaStore; import android.provider.MediaStore.Audio.Albums; import android.provider.MediaStore.Audio.Media; import android.provider.MediaStore.Files.FileColumns; import com.github.promeg.pinyinhelper.Pinyin; import com.wm.remusic.R; import com.wm.remusic.info.AlbumInfo; import com.wm.remusic.info.ArtistInfo; import com.wm.remusic.info.FolderInfo; import com.wm.remusic.info.MusicInfo; import java.io.File; import java.util.ArrayList; import java.util.List; /** * 查询各主页信息,获取封面图片等 */ public class MusicUtils implements IConstants { public static final int FILTER_SIZE = 1 * 1024 * 1024;// 1MB public static final int FILTER_DURATION = 1 * 60 * 1000;// 1分钟 private static String[] proj_music = new String[]{ Media._ID, Media.TITLE, Media.DATA, Media.ALBUM_ID, Media.ALBUM, Media.ARTIST, Media.ARTIST_ID, Media.DURATION, Media.SIZE}; private static String[] proj_album = new String[]{Albums._ID, Albums.ALBUM_ART, Albums.ALBUM, Albums.NUMBER_OF_SONGS, Albums.ARTIST}; private static String[] proj_artist = new String[]{ MediaStore.Audio.Artists.ARTIST, MediaStore.Audio.Artists.NUMBER_OF_TRACKS, MediaStore.Audio.Artists._ID}; private static String[] proj_folder = new String[]{FileColumns.DATA}; /** * 获取包含音频文件的文件夹信息 * * @param context * @return */ public static List<FolderInfo> queryFolder(Context context) { Uri uri = MediaStore.Files.getContentUri("external"); ContentResolver cr = context.getContentResolver(); StringBuilder mSelection = new StringBuilder(FileColumns.MEDIA_TYPE + " = " + FileColumns.MEDIA_TYPE_AUDIO + " and " + "(" + FileColumns.DATA + " like'%.mp3' or " + Media.DATA + " like'%.wma')"); // 查询语句:检索出.mp3为后缀名,时长大于1分钟,文件大小大于1MB的媒体文件 mSelection.append(" and " + Media.SIZE + " > " + FILTER_SIZE); mSelection.append(" and " + Media.DURATION + " > " + FILTER_DURATION); mSelection.append(") group by ( " + FileColumns.PARENT); List<FolderInfo> list = getFolderList(cr.query(uri, proj_folder, mSelection.toString(), null, null)); return list; } /** * 获取歌手信息 * * @param context * @return */ public static List<ArtistInfo> queryArtist(Context context) { Uri uri = MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI; ContentResolver cr = context.getContentResolver(); StringBuilder where = new StringBuilder(MediaStore.Audio.Artists._ID + " in (select distinct " + Media.ARTIST_ID + " from audio_meta where (1=1 )"); where.append(" and " + Media.SIZE + " > " + FILTER_SIZE); where.append(" and " + Media.DURATION + " > " + FILTER_DURATION); where.append(")"); List<ArtistInfo> list = getArtistList(cr.query(uri, proj_artist, where.toString(), null, PreferencesUtility.getInstance(context).getArtistSortOrder())); return list; } /** * 获取专辑信息 * * @param context * @return */ public static List<AlbumInfo> queryAlbums(Context context) { ContentResolver cr = context.getContentResolver(); StringBuilder where = new StringBuilder(Albums._ID + " in (select distinct " + Media.ALBUM_ID + " from audio_meta where (1=1)"); where.append(" and " + Media.SIZE + " > " + FILTER_SIZE); where.append(" and " + Media.DURATION + " > " + FILTER_DURATION); where.append(" )"); // Media.ALBUM_KEY 按专辑名称排序 List<AlbumInfo> list = getAlbumList(cr.query(Albums.EXTERNAL_CONTENT_URI, proj_album, where.toString(), null, PreferencesUtility.getInstance(context).getAlbumSortOrder())); return list; } /** * @param context * @param from 不同的界面进来要做不同的查询 * @return */ public static List<MusicInfo> queryMusic(Context context, int from) { return queryMusic(context, null, from); } public static ArrayList<MusicInfo> queryMusic(Context context, String id, int from) { Uri uri = Media.EXTERNAL_CONTENT_URI; ContentResolver cr = context.getContentResolver(); StringBuilder select = new StringBuilder(" 1=1 and title != ''"); // 查询语句:检索出.mp3为后缀名,时长大于1分钟,文件大小大于1MB的媒体文件 select.append(" and " + Media.SIZE + " > " + FILTER_SIZE); select.append(" and " + Media.DURATION + " > " + FILTER_DURATION); String selectionStatement = "is_music=1 AND title != ''"; final String songSortOrder = PreferencesUtility.getInstance(context).getSongSortOrder(); switch (from) { case START_FROM_LOCAL: ArrayList<MusicInfo> list3 = getMusicListCursor(cr.query(uri, proj_music, select.toString(), null, songSortOrder)); return list3; case START_FROM_ARTIST: select.append(" and " + Media.ARTIST_ID + " = " + id); return getMusicListCursor(cr.query(uri, proj_music, select.toString(), null, PreferencesUtility.getInstance(context).getArtistSongSortOrder())); case START_FROM_ALBUM: select.append(" and " + Media.ALBUM_ID + " = " + id); return getMusicListCursor(cr.query(uri, proj_music, select.toString(), null, PreferencesUtility.getInstance(context).getAlbumSongSortOrder())); case START_FROM_FOLDER: ArrayList<MusicInfo> list1 = new ArrayList<>(); ArrayList<MusicInfo> list = getMusicListCursor(cr.query(Media.EXTERNAL_CONTENT_URI, proj_music, select.toString(), null, null)); for (MusicInfo music : list) { if (music.data.substring(0, music.data.lastIndexOf(File.separator)).equals(id)) { list1.add(music); } } return list1; default: return null; } } public static ArrayList<MusicInfo> getMusicLists(Context context, long[] id) { final StringBuilder selection = new StringBuilder(); selection.append(MediaStore.Audio.Media._ID + " IN ("); for (int i = 0; i < id.length; i++) { selection.append(id[i]); if (i < id.length - 1) { selection.append(","); } } selection.append(")"); //sqlite 不支持decode // final StringBuilder order = new StringBuilder(); // order.append("DECODE(" +MediaStore.Audio.Media._ID +","); // for (int i = 0; i < id.length; i++) { // order.append(id[i]); // order.append(","); // order.append(i); // if (i < id.length - 1) { // order.append(","); // } // } // order.append(")"); Cursor cursor = (context.getContentResolver().query(Media.EXTERNAL_CONTENT_URI, proj_music, selection.toString(), null, null)); if (cursor == null) { return null; } ArrayList<MusicInfo> musicList = new ArrayList<>(); musicList.ensureCapacity(id.length); for (int i = 0; i < id.length; i++) { musicList.add(null); } while (cursor.moveToNext()) { MusicInfo music = new MusicInfo(); music.songId = cursor.getInt(cursor .getColumnIndex(Media._ID)); music.albumId = cursor.getInt(cursor .getColumnIndex(Media.ALBUM_ID)); music.albumName = cursor.getString(cursor .getColumnIndex(Albums.ALBUM)); music.albumData = getAlbumArtUri(music.albumId) + ""; music.musicName = cursor.getString(cursor .getColumnIndex(Media.TITLE)); music.artist = cursor.getString(cursor .getColumnIndex(Media.ARTIST)); music.artistId = cursor.getLong(cursor.getColumnIndex(Media.ARTIST_ID)); music.islocal = true; for (int i = 0; i < id.length; i++) { if (id[i] == music.songId) { musicList.set(i, music); } } } cursor.close(); return musicList; } public static ArrayList<MusicInfo> getMusicListCursor(Cursor cursor) { if (cursor == null) { return null; } ArrayList<MusicInfo> musicList = new ArrayList<>(); while (cursor.moveToNext()) { MusicInfo music = new MusicInfo(); music.songId = cursor.getInt(cursor .getColumnIndex(Media._ID)); music.albumId = cursor.getInt(cursor .getColumnIndex(Media.ALBUM_ID)); music.albumName = cursor.getString(cursor .getColumnIndex(Albums.ALBUM)); music.albumData = getAlbumArtUri(music.albumId) + ""; music.duration = cursor.getInt(cursor .getColumnIndex(Media.DURATION)); music.musicName = cursor.getString(cursor .getColumnIndex(Media.TITLE)); music.artist = cursor.getString(cursor .getColumnIndex(Media.ARTIST)); music.artistId = cursor.getLong(cursor.getColumnIndex(Media.ARTIST_ID)); String filePath = cursor.getString(cursor .getColumnIndex(Media.DATA)); music.data = filePath; music.folder = filePath.substring(0, filePath.lastIndexOf(File.separator)); music.size = cursor.getInt(cursor .getColumnIndex(Media.SIZE)); music.islocal = true; music.sort = Pinyin.toPinyin(music.musicName.charAt(0)).substring(0, 1).toUpperCase(); musicList.add(music); } cursor.close(); return musicList; } public static List<AlbumInfo> getAlbumList(Cursor cursor) { List<AlbumInfo> list = new ArrayList<>(); while (cursor.moveToNext()) { AlbumInfo info = new AlbumInfo(); info.album_name = cursor.getString(cursor .getColumnIndex(Albums.ALBUM)); info.album_id = cursor.getInt(cursor.getColumnIndex(Albums._ID)); info.number_of_songs = cursor.getInt(cursor .getColumnIndex(Albums.NUMBER_OF_SONGS)); info.album_art = getAlbumArtUri(info.album_id) + ""; info.album_artist = cursor.getString(cursor.getColumnIndex(Albums.ARTIST)); info.album_sort = Pinyin.toPinyin(info.album_name.charAt(0)).substring(0, 1).toUpperCase(); list.add(info); } cursor.close(); return list; } public static List<ArtistInfo> getArtistList(Cursor cursor) { List<ArtistInfo> list = new ArrayList<>(); while (cursor.moveToNext()) { ArtistInfo info = new ArtistInfo(); info.artist_name = cursor.getString(cursor .getColumnIndex(MediaStore.Audio.Artists.ARTIST)); info.number_of_tracks = cursor.getInt(cursor .getColumnIndex(MediaStore.Audio.Artists.NUMBER_OF_TRACKS)); info.artist_id = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Artists._ID)); info.artist_sort = Pinyin.toPinyin(info.artist_name.charAt(0)).substring(0, 1).toUpperCase(); list.add(info); } cursor.close(); return list; } public static List<FolderInfo> getFolderList(Cursor cursor) { List<FolderInfo> list = new ArrayList<>(); while (cursor.moveToNext()) { FolderInfo info = new FolderInfo(); String filePath = cursor.getString(cursor .getColumnIndex(FileColumns.DATA)); info.folder_path = filePath.substring(0, filePath.lastIndexOf(File.separator)); info.folder_name = info.folder_path.substring(info.folder_path .lastIndexOf(File.separator) + 1); info.folder_sort = Pinyin.toPinyin(info.folder_name.charAt(0)).substring(0, 1).toUpperCase(); list.add(info); } cursor.close(); return list; } public static String makeTimeString(long milliSecs) { StringBuffer sb = new StringBuffer(); long m = milliSecs / (60 * 1000); sb.append(m < 10 ? "0" + m : m); sb.append(":"); long s = (milliSecs % (60 * 1000)) / 1000; sb.append(s < 10 ? "0" + s : s); return sb.toString(); } public static Uri getAlbumArtUri(long albumId) { return ContentUris.withAppendedId(Uri.parse("content://media/external/audio/albumart"), albumId); } public static Uri getAlbumUri(Context context, long musicId) { ContentResolver cr = context.getContentResolver(); Cursor cursor = cr.query(Media.EXTERNAL_CONTENT_URI, proj_music, "_id =" + String.valueOf(musicId), null, null); long id = -3; if (cursor == null) { return null; } if (cursor.moveToFirst()) { id = cursor.getInt(cursor.getColumnIndex(Media.ALBUM_ID)); } cursor.close(); return getAlbumArtUri(id); } public static String getAlbumdata(Context context, long musicid) { ContentResolver cr = context.getContentResolver(); Cursor cursor = cr.query(Media.EXTERNAL_CONTENT_URI, proj_music, "_id = " + String.valueOf(musicid), null, null); if (cursor == null) { return null; } long albumId = -1; if (cursor.moveToNext()) { albumId = cursor.getLong(cursor.getColumnIndex(Media.ALBUM_ID)); } if (albumId != -1) { cursor = cr.query(Albums.EXTERNAL_CONTENT_URI, proj_album, Albums._ID + " = " + String.valueOf(albumId), null, null); } if (cursor == null) { return null; } String data = ""; if (cursor.moveToNext()) { data = cursor.getString(cursor.getColumnIndex(Albums.ALBUM_ART)); } cursor.close(); return data; } public static ArtistInfo getArtistinfo(Context context, long id) { ContentResolver cr = context.getContentResolver(); Cursor cursor = cr.query(MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI, proj_artist, "_id =" + String.valueOf(id), null, null); if (cursor == null) { return null; } ArtistInfo artistInfo = new ArtistInfo(); while (cursor.moveToNext()) { artistInfo.artist_name = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Artists.ARTIST)); artistInfo.number_of_tracks = cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Artists.NUMBER_OF_TRACKS)); } cursor.close(); return artistInfo; } public static AlbumInfo getAlbumInfo(Context context, long albumId) { ContentResolver cr = context.getContentResolver(); Cursor cursor = cr.query(Albums.EXTERNAL_CONTENT_URI, proj_album, "_id =" + String.valueOf(albumId), null, null); if (cursor == null) { return null; } AlbumInfo albumInfo = new AlbumInfo(); while (cursor.moveToNext()) { albumInfo.album_name = cursor.getString(cursor.getColumnIndex(Albums.ALBUM)); albumInfo.album_art = cursor.getString(cursor.getColumnIndex(Albums.ALBUM_ART)); } cursor.close(); return albumInfo; } public static MusicInfo getMusicInfo(Context context, long id) { ContentResolver cr = context.getContentResolver(); Cursor cursor = cr.query(Media.EXTERNAL_CONTENT_URI, proj_music, "_id = " + String.valueOf(id), null, null); if (cursor == null) { return null; } MusicInfo music = new MusicInfo(); while (cursor.moveToNext()) { music.songId = cursor.getInt(cursor .getColumnIndex(Media._ID)); music.albumId = cursor.getInt(cursor .getColumnIndex(Media.ALBUM_ID)); music.albumName = cursor.getString(cursor .getColumnIndex(Albums.ALBUM)); music.albumData = getAlbumArtUri(music.albumId) + ""; music.duration = cursor.getInt(cursor .getColumnIndex(Media.DURATION)); music.musicName = cursor.getString(cursor .getColumnIndex(Media.TITLE)); music.size = cursor.getInt(cursor.getColumnIndex(Media.SIZE)); music.artist = cursor.getString(cursor .getColumnIndex(Media.ARTIST)); music.artistId = cursor.getLong(cursor.getColumnIndex(Media.ARTIST_ID)); String filePath = cursor.getString(cursor .getColumnIndex(Media.DATA)); music.data = filePath; String folderPath = filePath.substring(0, filePath.lastIndexOf(File.separator)); music.folder = folderPath; music.sort = Pinyin.toPinyin(music.musicName.charAt(0)).substring(0, 1).toUpperCase(); } cursor.close(); return music; } public static String makeShortTimeString(final Context context, long secs) { long hours, mins; hours = secs / 3600; secs %= 3600; mins = secs / 60; secs %= 60; final String durationFormat = context.getResources().getString(hours == 0 ? R.string.durationformatshort : R.string.durationformatlong); return String.format(durationFormat, hours, mins, secs); } }