Skip to content

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;
    }
}

See also