package cn.qylk.database; import java.io.File; import java.util.ArrayList; import android.content.ContentResolver; import android.content.ContentValues; import android.database.Cursor; import android.net.Uri; import android.provider.MediaStore; import cn.qylk.app.APP; import cn.qylk.app.ListTypeInfo; import cn.qylk.app.TrackInfo; /** * @author qylk2012 all rights resolved * */ public class MediaDatabase { private static ContentResolver resolver = APP.getInstance() .getContentResolver(); /** * 获取所有album列表 * * @return */ public static Cursor AlbumCursor() { return resolver.query(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, new String[] { MediaStore.Audio.Albums.ALBUM, MediaStore.Audio.Albums.NUMBER_OF_SONGS, MediaStore.Audio.Albums.ARTIST, MediaStore.Audio.Artists._ID }, null, null, null); } /** * 获取所有artist列表 * * @return */ public static Cursor ArtistCursor() { return resolver.query(MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI, new String[] { MediaStore.Audio.Artists.ARTIST, MediaStore.Audio.Artists.NUMBER_OF_TRACKS, MediaStore.Audio.Artists.ARTIST, MediaStore.Audio.Artists._ID }, null, null, null); } public static Cursor GetCursor(ListTypeInfo type) { String selection = null; String sortorder = null; String[] args = null; switch (type.list) { case ALLSONGS: sortorder = "title ASC"; break; case ARTIST: selection = "artist_id=?"; args = new String[] { String.valueOf(type.para) }; sortorder = "artist ASC"; break; case ALBUM: selection = "album_id=?"; args = new String[] { String.valueOf(type.para) }; sortorder = "album ASC"; break; case PERSONAL: selection = MediaStore.Audio.Media._ID + " in (" + PersonalListIDS(type.para) + ")"; sortorder = "title ASC"; break; case SEARCH: selection = "title LIKE '%" + type.keyword + "%' OR artist LIKE '%" + type.keyword + "%'"; break; case HISTORY: sortorder = "date_modified DESC LIMIT 10";// 取历史记录10条 break; case LOVE: selection = "bookmark=1"; sortorder = "title ASC"; break; case RECENTADD: selection = "date_added >" + (getLastestUpdateTime() - 12 * 60 * 60);// 半天之内添加的 sortorder = "date_added DESC"; break; default: break; } return resolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, new String[] { MediaStore.Audio.Media._ID, MediaStore.Audio.Media.DURATION, MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.DATA, MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.ALBUM }, selection, args, sortorder); } // /** // * @deprecated use {@link MediaDatabase#GetCursor } instead 实现模糊查询,返回_id // * @param 歌曲标题或艺术家 // * @return 查无结果 返回null; // */ // public static Cursor searchMusic(String what) { // if (what.equals("")) // return null; // Cursor cursor = resolver.query( // MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, new String[] { // MediaStore.Audio.Media._ID, // MediaStore.Audio.Media.DURATION, // MediaStore.Audio.Media.ARTIST, // MediaStore.Audio.Media.DATA, // MediaStore.Audio.Media.TITLE, // MediaStore.Audio.Media.ALBUM }, "title like '%" + what // + "%' or artist like '%" + what + "%'", null, null); // if (cursor.getCount() == 0) // return null; // return cursor; // } /** * 获取歌曲id列表 * * @param type * @return */ public static ArrayList<Integer> getIDS(ListTypeInfo type) { Cursor c = GetCursor(type); ArrayList<Integer> ids = new ArrayList<Integer>(c.getCount()); while (c.moveToNext()) ids.add(c.getInt(0)); c.close(); return ids; } /** * 取得最新添加时间 * * @return */ private static long getLastestUpdateTime() { Cursor cursor = resolver.query( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, new String[] { MediaStore.Audio.Media.DATE_ADDED }, null, null, "date_added DESC LIMIT 1"); cursor.moveToFirst(); long time = cursor.getLong(0); cursor.close(); return time; } /** * 获取一组指定id的歌曲路径 */ public static File[] GetPaths(Integer[] ids) { StringBuilder sb = new StringBuilder(); for (Integer id : ids) sb.append(id).append(','); sb.deleteCharAt(sb.length() - 1); String idds = sb.toString(); Cursor cursor = resolver.query( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, new String[] { MediaStore.Audio.Media.DATA }, MediaStore.Audio.Media._ID + " in (" + idds + ")", null, null); File[] files = new File[ids.length]; int i = 0; while (cursor.moveToNext()) files[i++] = new File(cursor.getString(0)); cursor.close(); return files; } public static File[] GetPaths(int id, boolean ArtistOrAlbum) { Cursor cursor = resolver.query( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, new String[] { MediaStore.Audio.Media.DATA }, (ArtistOrAlbum ? MediaStore.Audio.Media.ARTIST_ID : MediaStore.Audio.Media.ALBUM_ID) + "=?", new String[] { String.valueOf(id) }, null); File[] files = new File[cursor.getCount()]; int i = 0; while (cursor.moveToNext()) files[i++] = new File(cursor.getString(0)); cursor.close(); return files; } /** * 获取所有私有列表名称 * * @return */ public static Cursor GetPersonalListUsingCursor() { return resolver.query(MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI, new String[] { MediaStore.Audio.Playlists._ID, MediaStore.Audio.Playlists.NAME }, null, null, null); } /** * 获取所有私有列表名称 */ public static CharSequence[] GetPersonalListUsingList() { Cursor c = GetPersonalListUsingCursor(); int sum = c.getCount(); CharSequence[] list = new CharSequence[sum + 1]; int i = 0; while (c.moveToNext()) { list[i++] = c.getString(1); } c.close(); return list; } /** * 获取指定id的歌曲信息 * * @param id * @return * @param info * 用于查询下一首歌的标题时,参数info应设为null */ public static TrackInfo getTrackInfo(int id, TrackInfo info) { Cursor c = resolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, new String[] { MediaStore.Audio.Media._ID, MediaStore.Audio.Media.DURATION, MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.DATA, MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.ALBUM, MediaStore.Audio.Media.MIME_TYPE, MediaStore.Audio.Media.SIZE, MediaStore.Audio.Media.YEAR }, "_id=?", new String[] { String.valueOf(id) }, null); c.moveToFirst(); if (info == null)// 用于查询下一首歌的标题时,参数info应设为null info = new TrackInfo(); info.id = c.getInt(0); info.duration = c.getInt(1); info.artist = c.getString(2); info.path = c.getString(3); info.title = c.getString(4); info.album = c.getString(5); info.mimetype = c.getString(6); info.size = c.getInt(7); info.year = c.getString(8); c.close(); return info; } /** * 批量新增个人列表成员 * * @param playlist_id * @param audio_id */ public static void InsertMoreToPersonalList(int playlistId, Integer[] audioId) { Uri uri = MediaStore.Audio.Playlists.Members.getContentUri("external", playlistId); Cursor cursor = resolver.query(uri, new String[] { "count(*)" }, null, null, null); cursor.moveToLast(); int base = cursor.getInt(0); cursor.close(); for (int i = 0; i < audioId.length; i++) { ContentValues contentValues = new ContentValues(); contentValues.put(MediaStore.Audio.Playlists.Members.PLAY_ORDER, Integer.valueOf(base + i + 1)); contentValues.put(MediaStore.Audio.Playlists.Members.AUDIO_ID, audioId[i]); resolver.insert(uri, contentValues); } } /** * 新增个人列表成员 * * @param playlist_id * @param audio_id */ public static void InsertOneToPersonalList(int playlistId, int audioId) { Uri uri = MediaStore.Audio.Playlists.Members.getContentUri("external", playlistId); Cursor cursor = resolver.query(uri, new String[] { "count(*)" }, null, null, null); cursor.moveToLast(); int base = cursor.getInt(0); cursor.close(); ContentValues contentValues = new ContentValues(); contentValues.put(MediaStore.Audio.Playlists.Members.PLAY_ORDER, Integer.valueOf(base + 1)); contentValues.put(MediaStore.Audio.Playlists.Members.AUDIO_ID, audioId); resolver.insert(uri, contentValues); } /** * 是否已经收藏 * * @param id * @return */ public static boolean IsLoved(int id) { Cursor cursor = resolver.query( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, new String[] { MediaStore.Audio.Media.BOOKMARK }, MediaStore.Audio.Media._ID + "=?", new String[] { Integer.toString(id) }, null); cursor.moveToFirst(); boolean is = cursor.getInt(0) == 1; cursor.close(); return is; } /** * 指定名称的个人列表是否已存在 * * @param name * @return 返回-1表示不存在;否则返回其列表ID */ public static int IsPersonalListExist(String name) { Cursor cursor = resolver.query( MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI, new String[] { MediaStore.Audio.Playlists._ID }, MediaStore.Audio.Playlists.NAME + "=?", new String[] { name }, null); return cursor.moveToFirst() ? cursor.getInt(0) : -1; } /** * 新建私有列表 * * @param name * @return 列表ID */ public static int NewPersonalListIDS(String name) { int resultcode = IsPersonalListExist(name); if (resultcode == -1) { ContentValues contentValues = new ContentValues(); contentValues.put(MediaStore.Audio.Playlists.NAME, name); resolver.insert(MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI, contentValues); } else return resultcode; return IsPersonalListExist(name); } /** * 获取指定id列表内容的id组,,用于进一步查询这些id对应的其他内容 * * @param PersonalList * _id 结果形如(2,5,9....)的字符串 * @return */ private static String PersonalListIDS(int playlistId) { Cursor cursor = resolver.query(MediaStore.Audio.Playlists.Members .getContentUri("external", playlistId), new String[] { MediaStore.Audio.Playlists.Members.AUDIO_ID }, null, null, MediaStore.Audio.Playlists.Members.PLAY_ORDER + " DESC"); StringBuilder sb = new StringBuilder(); while (cursor.moveToNext()) { sb.append(cursor.getInt(0)).append(','); } if (sb.length() != 0) sb.deleteCharAt(sb.length() - 1); else sb.append('0'); cursor.close(); return sb.toString(); } public static void recordLove(int id, boolean islove) { ContentValues cv = new ContentValues(); cv.put(MediaStore.Audio.Media.BOOKMARK, islove ? 1 : 0); resolver.update(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, cv, MediaStore.Audio.Media._ID + "=?", new String[] { Integer.toString(id) }); } /** * 删除数据库艺术家 * * @param musicid */ public static void removeArtistOrAlbum(int id, boolean ArtistOrAlbum) { resolver.delete(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, (ArtistOrAlbum ? MediaStore.Audio.Media.ARTIST_ID : MediaStore.Audio.Media.ALBUM_ID) + "=?", new String[] { String.valueOf(id) }); } /** * 删除数据库歌曲记录 * * @param musicid */ public static void removeAudio(int id) { resolver.delete(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, "_id=?", new String[] { Integer.toString(id) }); } /** * 移除条目 * * @param name */ public static void RemoveOneFromPersonalList(int playlistId, int audioId) { resolver.delete(MediaStore.Audio.Playlists.Members.getContentUri( "external", playlistId), MediaStore.Audio.Playlists.Members.AUDIO_ID + "=?", new String[] { String.valueOf(audioId) }); } /** * 移除个人列表 * * @param musicid */ public static void removePersonalList(String name) { resolver.delete(MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI, "name=?", new String[] { name }); } /** * 移除个人列表 * * @param musicid */ public static void RemovePersonalList(int playlistId) { resolver.delete(MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI, "_id=?", new String[] { String.valueOf(playlistId) }); } /** * 重命名个人列表 * * @param name */ public static void RenamePersonalList(int playlistId, String newname) { ContentValues contentValues = new ContentValues(); contentValues.put(MediaStore.Audio.Playlists.NAME, newname); resolver.update(MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI, contentValues, MediaStore.Audio.Playlists._ID + "=?", new String[] { String.valueOf(playlistId) }); } /** * 设置铃声 * * @param audioid * @param type * <BR> * 0:RINGTONE<br> * 1:ALARM */ public static void setAlarm(int audioid, int type) { ContentValues cv = new ContentValues(); cv.put(type == 0 ? MediaStore.Audio.Media.IS_RINGTONE : MediaStore.Audio.Media.IS_ALARM, true); resolver.update(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, cv, "_id=?", new String[] { String.valueOf(audioid) }); } /** * 检查数据库是否建立 * * @return */ public static boolean TestDB() { Cursor cursor = resolver.query( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, new String[] { MediaStore.Audio.Media._ID }, null, null, null); if (cursor != null) { boolean ok = cursor.moveToNext(); cursor.close(); return ok; } else return false; } /** * 记录播放时间 * * @param id */ public static void TimeRecode(int id) { ContentValues cv = new ContentValues(); cv.put(MediaStore.Audio.Media.DATE_MODIFIED, System.currentTimeMillis() / 1000); resolver.update(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, cv, MediaStore.Audio.Media._ID + "=?", new String[] { Integer.toString(id) }); } /** * 歌曲收藏 * * @param id */ public static void UpdateLoveAudio(int id, Boolean islove) { ContentValues cv = new ContentValues(); cv.put(MediaStore.Audio.Media.BOOKMARK, islove); resolver.update(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, cv, MediaStore.Audio.Media._ID + "=?", new String[] { Integer.toString(id) }); } /** * 更新指定id的条目信息 */ public static void updateTrackInfo(TrackInfo info) { ContentValues contentValues = new ContentValues(); contentValues.put(MediaStore.Audio.Media.TITLE, info.title); contentValues.put(MediaStore.Audio.Media.ARTIST, info.artist); contentValues.put(MediaStore.Audio.Media.ALBUM, info.album); resolver.update(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, contentValues, "_id=?", new String[] { Integer.toString(info.id) }); } /** * 视频列表 * * @return */ public static Cursor VideoCursor() { return resolver.query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, new String[] { MediaStore.Video.Media.TITLE, MediaStore.Video.Media.MIME_TYPE, MediaStore.Video.Media.DURATION, MediaStore.Video.Media.DATA }, null, null, null); } }