간단한 mp3 예제를 작성하고 있습니다. 엄~청.. 야매로 만들고 있는데도 막히는 부분이 엄청 많네요 ㅠㅠ
현재 막히는 부분이 
1. 쓰레드로 시크바 이동 + 현재 시간 표기 (파란색 부분으로 표시)
2. 리스트에서 선택한 mp3파일의 파일명으로 sd카드에 있는 mp3파일의 앨범이미지 제목등 따오기 (빨간색 부분으로 표시)

두 가지  문제 입니다. 2번질문 즉 앨범이미지 따오는게 더 급한문제인 것 같네요 어플 강종 되서 진행이 되지않아서..
제가볼땐 sellist 아이템 클릭 할 때 이미지등 설정하는건데 arraylist 사이즈가 0이라고 떠버리니 어디 문제인지 도통 모르겠습니다.. 도와주세요 ㅠㅠ


package com.example.mp3player02;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import android.app.ListActivity;
import android.content.res.Resources;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.net.Uri;
import android.os.Bundle;
import android.os.ParcelFileDescriptor;
import android.provider.MediaStore;
import android.provider.MediaStore.Audio.AudioColumns;
import android.provider.MediaStore.MediaColumns;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TabHost;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends ListActivity implements Runnable{
public String searname;// ROOT 占쏙옙罐占�
private static final String MEDIA_PATH = new String("/sdcard/");
SeekBar sbmusic;
TextView tvtitle;
TextView tvartist;
static ImageView albumimage;
TextView tvnow;
TextView tvend;
SeekBar sbvol;
EditText edit;// 占쏙옙占쏙옙占쌌니댐옙.
ListView searchlist;
ListView sellist;
Bitmap albumart;
public List<String> search;
private List<String> songs = new ArrayList<String>();
List<String> positions = new ArrayList<String>();
ArrayList<String> musicIDList = new ArrayList<String>(5);
ArrayList<String> albumIdList = new ArrayList<String>(5);
ArrayList<String> musicTitleList = new ArrayList<String>(5);
ArrayList<String> musicDataList = new ArrayList<String>(5);
private MediaPlayer mp = new MediaPlayer();

private int currentPosition = 0; // 占쏙옙占쏙옙占�占쏙옙占쏙옙 占쏙옙치占쌉니댐옙.

/** Called when the activity is first created. */

@Override
public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);
TabHost tabhost = (TabHost) findViewById(R.id.tabhost);
tabhost.setup();
TabHost.TabSpec spec;
spec = tabhost.newTabSpec("tab1");
spec.setContent(R.id.tab1);
spec.setIndicator("tab1");
tabhost.addTab(spec);
spec = tabhost.newTabSpec("tab2");
spec.setContent(R.id.tab2);
spec.setIndicator("tab2");
tabhost.addTab(spec);
spec = tabhost.newTabSpec("tab3");
spec.setContent(R.id.tab3);
spec.setIndicator("search");
tabhost.addTab(spec);
spec = tabhost.newTabSpec("tab4");
spec.setContent(R.id.tab4);
spec.setIndicator("play");
tabhost.addTab(spec);
tabhost.setCurrentTab(0);
updateSongList();

Button sear = (Button) findViewById(R.id.sear);
final EditText seartext = (EditText) findViewById(R.id.seartext);
searchlist = (ListView) findViewById(R.id.searlist);
sellist = (ListView) findViewById(R.id.selectlist);
sear.setOnClickListener(new View.OnClickListener() {

public void onClick(View v) {
searname = seartext.getText().toString();
searupdateSongList();

}
});
// SD카占쏙옙觀占쏙옙占�占쏙옙占쏙옙 占쏙옙占쏙옙占�占쌀뤄옙占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙 占쌌니댐옙.

searchlist.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,

int position, long id) {

currentPosition = position;
TextView tv1 = (TextView) parent.getChildAt(position)
.findViewById(R.id.sear_song_item_layout);
refresh(tv1.getText().toString());

}
});

sellist.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Toast.makeText(MainActivity.this, "" + songs.size(), Toast.LENGTH_SHORT).show();
currentPosition = position;
String filen = sellist.getItemAtPosition(position).toString();
for(int i=0; i<songs.size(); ++i) {
if(musicDataList.get(i).toString() != null && filen.equals(musicDataList.get(i).toString())) {
getArtworkQuick(MainActivity.this, Integer.parseInt(albumIdList.get(i).toString()), 100, 100);
}
}
playSong(MEDIA_PATH +positions.get(position));
}
private void playSong(String songPath) {
final AudioManager audio = (AudioManager)getSystemService(AUDIO_SERVICE);
tvtitle = (TextView)findViewById(R.id.textView1);
tvartist = (TextView)findViewById(R.id.textView2);
albumimage = (ImageView)findViewById(R.id.imageView1);
tvnow = (TextView)findViewById(R.id.nowseekview);
tvend = (TextView)findViewById(R.id.endseekview);
sbvol = (SeekBar)findViewById(R.id.seekvolumn);
sbmusic = (SeekBar)findViewById(R.id.seekBar1);
int sMax = audio.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
int svol = audio.getStreamVolume(AudioManager.STREAM_MUSIC);
sbvol.setMax(sMax);
sbvol.setProgress(svol);
sbmusic.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
public void onStopTrackingTouch(SeekBar seekbar) {
}
public void onProgressChanged(SeekBar seekbar, int progress, boolean fromuser) {
mp.seekTo(progress);
sbmusic.setProgress(progress);
int min = progress / 60000;
int sec = (progress % 60000) / 1000;
tvnow.setText(min + " : " + sec );
}
public void onStartTrackingTouch(SeekBar arg0) {

}
});
sbvol.setOnSeekBarChangeListener(
new OnSeekBarChangeListener() {
public void onStopTrackingTouch(SeekBar seekbar) {
}
public void onProgressChanged(SeekBar seekbar, int progress, boolean fromuser) {
audio.setStreamVolume(AudioManager.STREAM_MUSIC, progress, 0);
}
public void onStartTrackingTouch(SeekBar arg0) {

}
});
try {
String [] musicinfo = {MediaStore.Audio.Media._ID,
MediaStore.Audio.Media.ALBUM_ID,
MediaStore.Audio.Media.DATA,
MediaStore.Audio.Media.TITLE };
Cursor mcursor = managedQuery(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, musicinfo, null, null, null);
if(mcursor != null && mcursor.moveToFirst()) {
String musicID;
String albumID;
String musictitle;
String musicdata;
int musicIdcol = mcursor.getColumnIndex(MediaStore.Audio.Media._ID);
int albumIdcol = mcursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID);
int musictitlecol = mcursor.getColumnIndex(MediaStore.Audio.Media.TITLE);
int musicdatacol = mcursor.getColumnIndex(MediaStore.Audio.Media.DATA);
do {
musicID = mcursor.getString(musicIdcol);
albumID = mcursor.getString(albumIdcol);
musictitle = mcursor.getString(musictitlecol);
musicdata = mcursor.getString(musicdatacol);
musicIDList.add(musicID);
albumIdList.add(albumID);
musicTitleList.add(musictitle);
musicDataList.add(musicdata);
}while(mcursor.moveToNext());
}
mp.reset();
mp.setDataSource(songPath);
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
mp.setOnCompletionListener(new OnCompletionListener() {

public void onCompletion(MediaPlayer arg0) {

nextSong();

}

});
mp.prepare();
new Thread(MainActivity.this).start();
sbmusic.setVisibility(ProgressBar.VISIBLE);
sbmusic.setProgress(0);
sbmusic.setMax(mp.getDuration());
int mmax = sbmusic.getMax(); 
int min = mmax / 60000;
int sec = (mmax % 60000) / 1000;
tvend.setText(min + " : " + sec);
mp.setOnPreparedListener(new OnPreparedListener() {
public void onPrepared(MediaPlayer mp) {
mp.start();
}
});
// 한 곡의 재생이 끝나면 다음 곡을 재생하도록 합니다.


} catch (IOException e) {

}
}
private void nextSong() {

if (++currentPosition >= positions.size()) {

// 마지막 곡이 끝나면, 재생할 곡을 초기화합니다.

currentPosition = 0;

} else {

// 다음 곡을 재생합니다.
playSong(MEDIA_PATH + positions.get(currentPosition));

}

}

});

}

public void updateSongList() {
//Music [] music = new Music[10];
File home = new File(MEDIA_PATH);

if (home.listFiles(new Mp3Filter()).length > 0) {

for (File file : home.listFiles(new Mp3Filter())) {

songs.add(file.getName());

}

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
R.layout.song_item, songs);

setListAdapter(adapter);

}

}

public void searupdateSongList() {

File home = new File(MEDIA_PATH);
search = new ArrayList<String>();
if (home.listFiles(new SearchFilter()).length > 0) {

for (File file : home.listFiles(new SearchFilter())) {

search.add(file.getName());

}

ArrayAdapter<String> arrayAdapter1 = new ArrayAdapter<String>(
getApplicationContext(), R.layout.sear_song_item, search);

searchlist.setAdapter(arrayAdapter1);

}

}

// List 占쏙옙占쏙옙占쏙옙占쏙옙 클占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙 event占쏙옙 처占쏙옙占쌌니댐옙.

protected void onListItemClick(ListView l, View v, int position, long id) {

currentPosition = position;
TextView tv = (TextView) l.getChildAt(position).findViewById(
R.id.song_item_layout);
refresh(tv.getText().toString());

}

void refresh(String str) {
positions.add(str);
ListView sellist = (ListView) findViewById(R.id.selectlist);
ArrayAdapter<String> arrada = new ArrayAdapter<String>(
getApplicationContext(), R.layout.select_item, positions);
sellist.setAdapter(arrada);

}

class SearchFilter implements FilenameFilter {

public boolean accept(File dir, String name) {

return (name.endsWith(searname + ".mp3"));

}

}

@Override
public void run() {
int current=0;
try {
Thread.sleep(500);
if(mp.isPlaying()) {
current = mp.getCurrentPosition();
sbmusic.setProgress(current);
int mmax = sbmusic.getMax(); 
int min = mmax / 60000;
int sec = (mmax % 60000) / 1000;
tvnow.setText(min + " : " + sec);
}
}catch(InterruptedException e) {
e.printStackTrace();
}
}
private void setView(SeekBar _sb, TextView _tv) {
tvnow = _tv;
sbmusic = _sb;
}
protected void onDestroy() {
if(mp != null) {
mp.release();
}
super.onDestroy();
}
private static final BitmapFactory.Options sBitmapOptionsCache = new BitmapFactory.Options();
    private static final Uri sArtworkUri = Uri.parse("content://media/external/audio/albumart");
    

    private void getArtworkQuick(Context context, int album_id, int w, int h) {
        w -= 2;
        h -= 2;
        ContentResolver res = context.getContentResolver();
        Uri uri = ContentUris.withAppendedId(sArtworkUri, album_id);
        ImageView albumart = (ImageView)findViewById(R.id.imageView1);
        albumart.setImageURI(uri);
        /*if (uri != null) {
            ParcelFileDescriptor fd = null;
            try {
                fd = res.openFileDescriptor(uri, "r");
                int sampleSize = 1;
                
                sBitmapOptionsCache.inJustDecodeBounds = true;
                BitmapFactory.decodeFileDescriptor(
                        fd.getFileDescriptor(), null, sBitmapOptionsCache);
                int nextWidth = sBitmapOptionsCache.outWidth >> 1;
                int nextHeight = sBitmapOptionsCache.outHeight >> 1;
                while (nextWidth>w && nextHeight>h) {
                    sampleSize <<= 1;
                    nextWidth >>= 1;
                    nextHeight >>= 1;
                }

                sBitmapOptionsCache.inSampleSize = sampleSize;
                sBitmapOptionsCache.inJustDecodeBounds = false;
                Bitmap b = BitmapFactory.decodeFileDescriptor(
                        fd.getFileDescriptor(), null, sBitmapOptionsCache);

                if (b != null) {
                    // finally rescale to exactly the size we need
                    if (sBitmapOptionsCache.outWidth != w || sBitmapOptionsCache.outHeight != h) {
                        Bitmap tmp = Bitmap.createScaledBitmap(b, w, h, true);
                        b.recycle();
                        b = tmp;
                    }
                }
                
                return b;
            } catch (FileNotFoundException e) {
            } finally {
                try {
                    if (fd != null)
                        fd.close();
                } catch (IOException e) {
                }
            }
        }
        return null;*/
    }
}

class Mp3Filter implements FilenameFilter {

public boolean accept(File dir, String name) {

return (name.endsWith(".mp3"));

}
 
}
class Music {
String artist;
String name;
String image;
public Music(String _artist, String _name, String _image) {
artist = _artist;
name = _name;
image = _image;
}
public String getArtist(){
return artist;
}
public String getName() {
return name;
}
public String getImage() {
return image;
}
}


로그캣입니다!
12-18 15:39:24.640: E/AndroidRuntime(11504): FATAL EXCEPTION: main
12-18 15:39:24.640: E/AndroidRuntime(11504): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
12-18 15:39:24.640: E/AndroidRuntime(11504):  at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
12-18 15:39:24.640: E/AndroidRuntime(11504):  at java.util.ArrayList.get(ArrayList.java:304)
12-18 15:39:24.640: E/AndroidRuntime(11504):  at com.example.mp3player02.MainActivity$3.onItemClick(MainActivity.java:137)
12-18 15:39:24.640: E/AndroidRuntime(11504):  at android.widget.AdapterView.performItemClick(AdapterView.java:292)
12-18 15:39:24.640: E/AndroidRuntime(11504):  at android.widget.AbsListView.performItemClick(AbsListView.java:1058)
12-18 15:39:24.640: E/AndroidRuntime(11504):  at android.widget.AbsListView$PerformClick.run(AbsListView.java:2514)
12-18 15:39:24.640: E/AndroidRuntime(11504):  at android.widget.AbsListView.onTouchEvent(AbsListView.java:3180)
12-18 15:39:24.640: E/AndroidRuntime(11504):  at android.view.View.dispatchTouchEvent(View.java:5486)
12-18 15:39:24.640: E/AndroidRuntime(11504):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1953)
12-18 15:39:24.640: E/AndroidRuntime(11504):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1714)
12-18 15:39:24.640: E/AndroidRuntime(11504):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1959)
12-18 15:39:24.640: E/AndroidRuntime(11504):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1728)
12-18 15:39:24.640: E/AndroidRuntime(11504):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1959)
12-18 15:39:24.640: E/AndroidRuntime(11504):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1728)
12-18 15:39:24.640: E/AndroidRuntime(11504):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1959)
12-18 15:39:24.640: E/AndroidRuntime(11504):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1728)
12-18 15:39:24.640: E/AndroidRuntime(11504):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1959)
12-18 15:39:24.640: E/AndroidRuntime(11504):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1728)
12-18 15:39:24.640: E/AndroidRuntime(11504):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1959)
12-18 15:39:24.640: E/AndroidRuntime(11504):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1728)
12-18 15:39:24.640: E/AndroidRuntime(11504):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1959)
12-18 15:39:24.640: E/AndroidRuntime(11504):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1728)
12-18 15:39:24.640: E/AndroidRuntime(11504):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1959)
12-18 15:39:24.640: E/AndroidRuntime(11504):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1728)
12-18 15:39:24.640: E/AndroidRuntime(11504):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1959)
12-18 15:39:24.640: E/AndroidRuntime(11504):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1728)
12-18 15:39:24.640: E/AndroidRuntime(11504):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1892)
12-18 15:39:24.640: E/AndroidRuntime(11504):  at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1371)
12-18 15:39:24.640: E/AndroidRuntime(11504):  at android.app.Activity.dispatchTouchEvent(Activity.java:2364)
12-18 15:39:24.640: E/AndroidRuntime(11504):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1840)
12-18 15:39:24.640: E/AndroidRuntime(11504):  at android.view.View.dispatchPointerEvent(View.java:5662)
12-18 15:39:24.640: E/AndroidRuntime(11504):  at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:2863)
12-18 15:39:24.640: E/AndroidRuntime(11504):  at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442)
12-18 15:39:24.640: E/AndroidRuntime(11504):  at android.os.Handler.dispatchMessage(Handler.java:99)
12-18 15:39:24.640: E/AndroidRuntime(11504):  at android.os.Looper.loop(Looper.java:137)
12-18 15:39:24.640: E/AndroidRuntime(11504):  at android.app.ActivityThread.main(ActivityThread.java:4340)
12-18 15:39:24.640: E/AndroidRuntime(11504):  at java.lang.reflect.Method.invokeNative(Native Method)
12-18 15:39:24.640: E/AndroidRuntime(11504):  at java.lang.reflect.Method.invoke(Method.java:511)
12-18 15:39:24.640: E/AndroidRuntime(11504):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
12-18 15:39:24.640: E/AndroidRuntime(11504):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
12-18 15:39:24.640: E/AndroidRuntime(11504):  at dalvik.system.NativeStart.main(Native Method)