안드로이드 개발 질문/답변
(글 수 45,052)
1. main activity
public class PlayerActivity extends Activity implements Runnable,SeekBar.OnSeekBarChangeListener{ boolean clickBar=true, done=false; TextView curtime; Thread tr; final Handler h = new Handler(); SeekBar sbar; static final String MEDIA_PATH = new String("/mnt/sdcard/"); // ROOT 경로를 지정합니다. List<String> songs = new ArrayList<String>(); Button play; Button ff; Button rew; Button pause; TextView fulltime; Button list; playSong play1 = new playSong(); /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);
play = (Button)findViewById(R.id.button1); ff = (Button)findViewById(R.id.button2); rew = (Button)findViewById(R.id.button3); pause = (Button)findViewById(R.id.button4); Button list = (Button)findViewById(R.id.button5); pause.setVisibility(View.GONE); //플레이버튼 play.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub play.setVisibility(View.GONE); pause.setVisibility(View.VISIBLE); } }); //일시정지 pause.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub pause.setVisibility(View.GONE); play.setVisibility(View.VISIBLE); play1.mp.pause(); } }); //노래 리스트 activity 전환 list.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent intent = new Intent(PlayerActivity.this, song_list.class); startActivity(intent); finish(); } }); } }
2. sub activity
public class song_list extends ListActivity { static boolean result=false; static String[] value; PlayerActivity play2 = new PlayerActivity(); playSong play1 = new playSong();
@Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.song_list); final Button rtn = (Button)findViewById(R.id.RtnBtn); updateSongList(); // SD카드로부터 파일 목록을 불러오는 역할을 합니다.
//main activity로 돌아가는 버튼
rtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent intent = new Intent(song_list.this, PlayerActivity.class); startActivity(intent); finish(); } }); }
public void updateSongList() { File home = new File(play2.MEDIA_PATH); // home으로 sd카드의 root를 지정합니다.
if (home.listFiles(new Mp3Filter()).length > 0) { for (File file : home.listFiles(new Mp3Filter())) { play2.songs.add(file.getName()); // 재생목록 리스트에 파일 이름을 추가합니다. } ArrayAdapter<String> songList = new ArrayAdapter<String>(this,R.layout.file_list_item, play2.songs); // ListView의 레이아웃 및 참조할 리스트를 설정합니다. setListAdapter(songList); // ListView와 ArrayList를 연결합니다. } }
//목록클릭하면 그 곡 재생 protected void onListItemClick(ListView l, View v, int position, long id) { play1.playSong(play2.MEDIA_PATH + play2.songs.get(position)); Intent intent = new Intent(song_list.this, PlayerActivity.class); startActivity(intent); finish();//sub activity 완전 종료 }
}//end of class
class Mp3Filter implements FilenameFilter { public boolean accept(File dir, String name) { return (name.endsWith(".m4a")|name.endsWith(".mp3")); } }
먼저 액티비티는 메인액티비티(노래 플레이, 정지 아이콘)와 리스트를 보여줄 수 있는 액티비티 두개로 구성되어 있습니다.
메인 액티비티에서 노래 리스트 버튼을 클릭하면 서브액티비티로 넘어갑니다. 여기서 노래 리스트를 볼 수 있고요. 리스트에서 해당 노래를터치하면 첫 노래는 잘 시작됩니다. 또한 액티비티 전환을 하지 않을 시에는 먼저 실행된 노래는 중단되고 새롭게 터치한 노래가 시작됩니다.
문제는 여기서 노래를 터치와 동시에 플레이를 하면서 메인 액티비티로 전환을 하고 다시 서브액티비티로 돌아와서 노래를 터치하면 이전에 플레이 되던 노래가 중단되지 않고 새로운 노래와 함께 플레이 됩니다.
여러분의 도움 부탁드립니다.
우선, 제생각에는 MediaPlayer를 쓰셨을 것 같은데요.
MediaPlayer는 서비스 입니다. 백그라운드에서 돌아간다는 의미이지요.
왠지 메인에서 선택한 곡을 듣고 싶어 하시는 것 같은데요.
우선 백그라운드로 노래는 계속 나오고
다시 Sub로 돌아가서 선택하면 새로운 곡을 나오게 하고 싶으신거죠?
서버에서 리스트 선택해서 플레이하기 전에
만약 이미 Mediaplayer가 실행중인지 확인하시고
그러면 초기화나 꺼버리는 예외처리를 해주는 것은 어떨까요??