Android 음악 재생 기의 개발 실례 상세 설명
이 인 스 턴 스 가 완 료 된 후 실행 되 는 인터페이스 효 과 를 먼저 감상 합 니 다:
우선 프로젝트 를 만 들 고 제 가 사용 하 는 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();
}
}
}
이로써 프로젝트 가 완성 되 었 다.여러분 들 이 이 실례 에서 더 많은 것 을 배우 고 더 많은 경험 을 쌓 을 수 있 기 를 바 랍 니 다.이상 은 안 드 로 이 드 개발 에 관 한 간단 한 플레이어 인 스 턴 스 입 니 다.본 사이트 에 대한 지원 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.