Android 음악 재생 기의 개발 실례 상세 설명

본 고 는 여러분 에 게 음악 재생 기 를 만 들 도록 유도 할 것 입 니 다.이 안 드 로 이 드 개발 사례 를 하 는 과정 에서 배 운 ListView 와 다른 구성 요 소 를 더욱 잘 알 고 파악 하 는 데 도움 을 줄 수 있 습 니 다.더 좋 은 학습 효 과 를 얻 기 위해 그 중에서 많은 기능 을 우 리 는 수 동 으로 실현 한다.예 를 들 어 음악 재생 의 빠 른 속도 와 빠 른 속도 등 이다.
       이 인 스 턴 스 가 완 료 된 후 실행 되 는 인터페이스 효 과 를 먼저 감상 합 니 다:

        우선 프로젝트 를 만 들 고 제 가 사용 하 는 SDK 는 Android 2.2 이 며 XML 에서 레이아웃 을 만 듭 니 다.
       위 에는 ListView 가 우리 의 음악 목록 을 표시 하 는 데 사 용 됩 니 다.중간 에는 SeekBar 가 현재 음악의 재생 진 도 를 끌 수 있 습 니 다.ProgressBar 를 사용 하지 않 는 이 유 는 음악의 빠 른 속도 기능 이 필요 하기 때 문 입 니 다.슬라이더 를 끌 어 진 도 를 바 꿀 수 있 기 때 문 입 니 다.현재 재생 중인 노래의 이름,시간 등 을 표시 하 는 TextView 도 있 습 니 다.맨 아래 는 4 개의 Button 입 니 다.각각 지난 곡,재생(일시 정지),정지,다음 곡 입 니 다.
       여러분 은 레이아웃 에 화면 에 직접 표 시 된 문자 내용 이 나타 나 지 않도록 주의 하 십시오.우 리 는 이러한 내용 을 모두 res/values 아래 의 strings.xml 에 놓 은 다음 에 각각 인용 하여 좋 은 습관 을 기 르 고 인터페이스 와 내용 을 분리 시 켜 디 버 깅 과 후기 유지 등 을 편리 하 게 합 니 다.현재 우리 의 화면 은 다음 과 같다.

       그리고 우 리 는 File Explorer 를 열 어 eclipse 의 Window-Show View-Other--Android--File Explore 에 있 습 니 다.당신 도 직접 Alt+Shift+Q 를 사용 할 수 있 습 니 다.

       mnt/sdcard 아래 에 두 세 곡 의 노래 를 틀 겠 습 니 다.가상 컴퓨터 에서 중국 어 를 지원 하지 않 습 니 다.중국어 가 있 는 파일 을 가 져 오 면 잘못 보 고 됩 니 다.
       이어서 우 리 는 우리 플레이어 의 서비스 클래스 를 만 들 었 습 니 다.저 는 MusicService 라 고 부 릅 니 다.아래 의 대상 을 설명 합 니 다.
자바 코드

public class MusicService {  
 
  private static final File MUSIC_PATH = Environment  
      .getExternalStorageDirectory();//   music     。  
  public List<String> musicList;//        mp3     。  
  public MediaPlayer player; //          
  public int songNum; //         List      
  public String songName; //           
 
} 
       그리고 방금 추 가 된 MP3 파일 을 불 러 오 겠 습 니 다.여 기 는 방식 이 다양 합 니 다.저 는 간단 한 것 을 마음대로 쓰 겠 습 니 다.
자바 코드

class MusicFilter implements FilenameFilter {  
   public boolean accept(File dir, String name) {  
   return (name.endsWith(".mp3"));//         .mp3       
   }  
} 
       MusicService 류 의 무 참 구조 함수 에서 대상 을 예화 하고 이 MP3 파일 을 musicList 에 넣 습 니 다.
자바 코드

public MusicService() {  
  musicList = new ArrayList<String>();  
  player = new MediaPlayer();  
 
  if (MUSIC_PATH.listFiles(new MusicFilter()).length > 0) {  
    for (File file : MUSIC_PATH.listFiles(new MusicFilter())) {  
      musicList.add(file.getAbsolutePath());  
    }  
  }  
} 
       우 리 는 현재 재생 되 고 있 는 노래의 이름 을 설정 하 는 방법 을 썼 다.(개인 적 으로 이 방법 이 비교적 멍청 하 다 고 생각 하지만 잠시 다른 방법 을 생각 하지 못 했다)
자바 코드

public void setPlayName(String dataSource) {  
  File file = new File(dataSource);//   D:\\mm.mp3  
  String name = file.getName();//name=mm.mp3  
  int index = name.lastIndexOf(".");//      .  
  songName = name.substring(0, index);//   mm  
} 
      다음은 우리 서비스 류 의 기본 적 인 방법 입 니 다.즉,시작,정지,이전 곡 과 다음 곡 입 니 다.
      우 리 는 각각 성명 한 멀티미디어 대상 의 start,pause,stop 등 방법 으로 완성 할 수 있다.
자바 코드

public void start() {  
  try {  
    player.reset(); //       
    String dataSource = musicList.get(songNum);//             
    setPlayName(dataSource);//      
    player.setDataSource(dataSource);//              
    player.prepare();//      
    player.start();//      
    //setOnCompletionListener                     
    player.setOnCompletionListener(new OnCompletionListener() {  
      public void onCompletion(MediaPlayer arg0) {  
        next();//          ,       .  
      }  
    });  
  } catch (Exception e) {  
    Log.v("MusicService", e.getMessage());  
  }  
}  
 
public void next() {  
  songNum = songNum == musicList.size() - 1 ? 0 : songNum + 1;  
  start();  
}  
 
public void last() {  
  songNum = songNum == 0 ? musicList.size() - 1 : songNum - 1;  
  start();  
}  
 
public void pause() {  
  if (player.isPlaying())  
    player.pause();  
  else 
    player.start();  
}  
 
public void stop() {  
  if (player.isPlaying()) {  
    player.stop();  
  }  
} 
       여기까지 우리 의 Service 클래스 를 다 썼 습 니 다.이어서 우 리 는 Activity 에 가서 각 컨트롤 에 사건 을 연결 합 니 다.
       이 액 티 비 티 에서 가장 어 려 운 점 은 SeekBar 의 슬라이더 를 끌 어 재생 진 도 를 바 꾸 는 것 이다.여기 서 나 는 여러 번 고려 해서 Handler 류 로 처리 했다.
       Handler 는 안 드 로 이 드 에서 메 시 지 를 보 내 고 처리 하 는 일 을 맡 고 있 습 니 다.그것 의 주요 용 도 는 다음 과 같다.
       1.계획 대로 메 시 지 를 보 내 거나 Runnanble 을 실행 합 니 다(POST 방법 사용).
       2.다른 스 레 드 에서 보 낸 메 시 지 를 메시지 큐 에 넣 고 스 레 드 충돌 을 피 합 니 다(UI 스 레 드 업데이트 에서 흔히 볼 수 있 습 니 다).
       기본적으로 Handler 는 현재 스 레 드 에 있 는 메시지 순환 인 스 턴 스(Handler(Looper looper),Handler(Looper looper,Handler.Callback callback)를 사용 하여 스 레 드 를 지정 할 수 있 습 니 다)를 받 아들 이 고 하나의 메시지 큐 는 현재 스 레 드 에 있 는 여러 대상 에 의 해 배포 되 고 처리 할 수 있 습 니 다(UI 스 레 드 에서 시스템 은 Activity 로 처리 되 었 습 니 다.너 는 몇 개의 Handler 를 다시 일 으 켜 처리 할 수 있다.Handler 를 실례 화 할 때 Looper 는 임의의 스 레 드 일 수 있 고 Handler 지침 만 있 으 면 모든 스 레 드 도 sendmessage 할 수 있 습 니 다.Handler 가 Message 에 대한 처 리 는 병행 되 지 않 습 니 다.하나의 Looper 는 하나의 Message 를 처리 해야만 다음 항목 을 읽 을 수 있 습 니 다.따라서 메시지 처 리 는 차단 형식(handleMessage()방법 에서 시간 이 걸 리 지 않 고 다른 스 레 드 에 시간 이 걸 리 는 동작 을 실행 할 수 있 습 니 다.작업 이 끝 난 후에 Message(sendMessages 방법 을 통 해)를 보 낸 다음 handleMessage()에서 UI 를 업데이트 할 수 있 습 니 다.
       다음 변수 설명:
자바 코드

private Button btnStart, btnStop, btnNext, btnLast;  
private TextView txtInfo;  
private ListView listView;  
private SeekBar seekBar;  
private MusicService musicService;  
private MusicHandler musicHandler;//            
private MusicThread musicThread;//             
private boolean autoChange, manulChange;//                    
private boolean isPause;//                 
       잘못 보고 한 것 이 있 으 면 먼저 주석 을 달 고 상관 하지 않 아 도 되 며 초기 화 과정 에서 사건 을 연결 할 수 있 습 니 다.
       이것 은 ListView 의 충전 방법 입 니 다.
자바 코드

private void setListViewAdapter() {  
  List<Map<String, Object>> date = new ArrayList<Map<String, Object>>();  
 
  for (String path : musicService.musicList) {  
    Map<String, Object> map = new HashMap<String, Object>();  
    File file = new File(path);  
    map.put("fileName", file.getName());  
    date.add(map);  
  }  
  SimpleAdapter adapter = new SimpleAdapter(this, date,  
        android.R.layout.simple_list_item_1,  
        new String[] { "fileName" }, new int[] { android.R.id.text1 });  
 
  listView.setAdapter(adapter);  
 
} 
       Simple Adapter 의 구조 함 수 는:
       public SimpleAdapter (Context context, List> data, int resource, String[] from, int[] to);
       첫 번 째 매개 변수 context 는 어떤 Activity 에 표 시 됩 니까?
       두 번 째 매개 변 수 는 하나의 범 형 을 데이터 소스 로 하고 모든 List 의 한 줄 은 보 여 주 는 한 줄 을 대표 합 니 다.Map 의 키 는 바로 이 줄 의 열 이름 이 고 값 도 열 이름 이 있 습 니 다.
       세 번 째 매개 변 수 는 자원 파일 입 니 다.이 열 에 필요 한 보기 자원 파일 을 불 러 오 려 면 시스템 에 내 장 된 자원 을 직접 참조 하 겠 습 니 다.예 쁜 스타일 을 원한 다 면 직접 쓸 수 있 습 니 다.
       네 번 째 매개 변 수 는 String 배열 로 맵 대상 의 이름 을 열 이름 에 표시 하고 일일이 대응 합 니 다.
       다섯 번 째 는 네 번 째 매개 변수의 값 을 대상 별로 표시(일일이 대응)하 는 것 입 니 다.다음 int 형의 id 배열 에서 이 id 배열 은 Layout 의 xml 파일 에서 id 를 명명 하여 형 성 된 유일한 int 형 식별 자 입 니 다.
       SeekBar 가 드래그 를 멈 춘 이벤트:
자바 코드

public void onStopTrackingTouch(SeekBar seekBar) { //        
  int progress = seekBar.getProgress();   
   
  if (!autoChange && manulChange) {   
    int musicMax = musicService.player.getDuration(); //             
    int seekBarMax = seekBar.getMax();   
   
    musicService.player   
        .seekTo(musicMax * progress / seekBarMax);//                 
  musicService.pause();   
  autoChange = true;   
  manulChange = false;   
  }   
}  
       Music Handler 류 의 실현:
자바 코드

class MusicHandler extends Handler {  
 
     public MusicHandler() {  
  }  
 
  @Override 
  public void handleMessage(Message msg) {  
    if (autoChange) {  
      try {  
        int position = musicService.player.getCurrentPosition();//          ( )  
        int mMax = musicService.player.getDuration();//      
        int sMax = seekBar.getMax();//seekBar   ,      
          seekBar.setProgress(position * sMax / mMax);  
          txtInfo.setText(setPlayInfo(position / 1000, mMax / 1000));  
      } catch (Exception e) {  
          e.printStackTrace();  
      }  
    } else {  
      seekBar.setProgress(0);  
      txtInfo.setText("      ");  
    }  
  }  
}  
 
//           
private String setPlayInfo(int position, int max) {  
  String info = "    : " + musicService.songName + "\t\t";  
 
  //            % ,       
  int pMinutes = 0;  
  while (position >= 60) {  
    pMinutes++;  
    position -= 60;  
  }  
  String now = (pMinutes < 10 ? "0" + pMinutes : pMinutes) + ":" 
    + (position < 10 ? "0" + position : position);  
 
  int mMinutes = 0;  
  while (max >= 60) {  
    mMinutes++;  
    max -= 60;  
  }  
  String all = (mMinutes < 10 ? "0" + mMinutes : mMinutes) + ":" 
    + (max < 10 ? "0" + max : max);  
 
  return info + now + " / " + all;  
} 
       MusicThread 의 실현:
자바 코드

class MusicThread implements Runnable {  
 
  @Override 
  public void run() {  
    while (true)  
      try {  
          musicHandler.sendMessage(new Message());  
        Thread.sleep(1000);//    1           
      } catch (InterruptedException e) {  
          e.printStackTrace();  
      }  
  }  
 
} 
       이로써 프로젝트 가 완성 되 었 다.여러분 들 이 이 실례 에서 더 많은 것 을 배우 고 더 많은 경험 을 쌓 을 수 있 기 를 바 랍 니 다.
        이상 은 안 드 로 이 드 개발 에 관 한 간단 한 플레이어 인 스 턴 스 입 니 다.본 사이트 에 대한 지원 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기