간단한 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)
http://dreamchallenger.blogspot.kr/2011/01/sdcardaudio-mp3-albumart-andorid-show.html
쿼리자체가 다르네요 ㅡㅡㅋ