Android:Example:MusicInfo
안드로이드의 음악정보를 획득할 수 있는 샘플 클래스.
MusicInfo.java
package ---;
import java.io.FileNotFoundException;
import java.io.IOException;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.ParcelFileDescriptor;
/**
* 단일 음악 정보.
*
* @author cwlee
* @since 2013-08-23
*/
public class MusicInfo {
public long id;
public String artist;
public String title;
public String album;
public static final BitmapFactory.Options kBitmapOptionsCache = new BitmapFactory.Options();
public static final Uri sArtworkUri = Uri.parse("content://media/external/audio/albumart");
/** 앨범의 재킷(표지)을 획득할 수 있다. */
public Bitmap getJacket(Context c, int width, int height) {
width -= 1;
ContentResolver cr = c.getContentResolver();
Uri uri = ContentUris.withAppendedId(sArtworkUri, id);
if (uri != null) {
ParcelFileDescriptor fd = null;
try {
fd = cr.openFileDescriptor(uri, "r");
int sampleSize = 1;
kBitmapOptionsCache.inJustDecodeBounds = true;
BitmapFactory.decodeFileDescriptor(fd.getFileDescriptor(), null, kBitmapOptionsCache);
int nextWidth = kBitmapOptionsCache.outWidth >> 1;
int nextHeight = kBitmapOptionsCache.outHeight >> 1;
while (nextWidth > width && nextHeight > height) {
sampleSize <<= 1;
nextWidth >>= 1;
nextHeight >>= 1;
}
kBitmapOptionsCache.inSampleSize = sampleSize;
kBitmapOptionsCache.inJustDecodeBounds = false;
Bitmap b = BitmapFactory.decodeFileDescriptor(fd.getFileDescriptor(), null, kBitmapOptionsCache);
if (b != null) {
if (kBitmapOptionsCache.outWidth != width || kBitmapOptionsCache.outHeight != height) {
Bitmap tmp = Bitmap.createScaledBitmap(b, width, height, true);
if (tmp != b)
b.recycle();
b = tmp;
}
}
return b;
} catch (FileNotFoundException e) {
} finally {
try {
if (fd != null)
fd.close();
} catch (IOException e) {
}
}
}
return null;
}
}
MusicManager.java
package ---;
import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import android.content.Context;
import android.database.Cursor;
import android.provider.MediaStore;
/**
* 단말기에 포함된 음악정보 리스트를 위한 관리자 클래스.
*
* @author cwlee
* @since 2013-08-23
*/
public class MusicManager {
/** Music file filter. */
private static final String kFilterExtension = ".mp3";
public static class MusicFilter implements FilenameFilter {
@Override
public boolean accept(File dir, String filename) {
return filename.endsWith(kFilterExtension);
}
}
/** Projection. */
private static final String[] kProjectionArray = new String[] {
/* ID. */
MediaStore.Audio.Media._ID,
/* ARTIST. */
MediaStore.Audio.Media.ARTIST,
/* TITLE. */
MediaStore.Audio.Media.TITLE,
/* ALBUM. */
MediaStore.Audio.Media.ALBUM };
/** 생성자를 지원하지 않는다. */
protected MusicManager() {
throw new UnsupportedOperationException();
}
/** 가지고 있는 음악파일 정보 리스트를 획득한다. */
public static ArrayList<MusicInfo> getMusicList(Context c) {
Cursor cursor = c.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, kProjectionArray,
null, null, null);
if (cursor.moveToFirst() == true) {
ArrayList<MusicInfo> list = new ArrayList<MusicInfo>();
final int kIdColumn = cursor.getColumnIndex(MediaStore.Audio.Media._ID);
final int kTitleColumn = cursor.getColumnIndex(MediaStore.Audio.Media.TITLE);
final int kArtistColumn = cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST);
final int kAlbumColumn = cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM);
long id = 0;
String title = null;
String artist = null;
String album = null;
do {
id = cursor.getLong(kIdColumn);
title = cursor.getString(kTitleColumn);
artist = cursor.getString(kArtistColumn);
album = cursor.getString(kAlbumColumn);
MusicInfo music = new MusicInfo();
music.id = id;
music.title = title;
music.artist = artist;
music.album = album;
list.add(music);
} while (cursor.moveToNext() == true);
return list;
}
return null;
}
}