XML 처리
인터넷을 통하여 전달되는 데이터는 주로 XML 형식으로 html과 비슷한 형태를 띄고 있다.
XML 처리 과정은 XML 문서 -> XML 파서 -> DOM 트리 의 과정을 거친다.
XML 파서
XML 파서의 종류로는 대표적으로 DOM 파서, SAX 파서, PullParser 파서가 있다.
- DOM: 요소들을 한 번에 트리 구조로 파싱하여 메모리에 저장하여 언제든지 원하는 요소에 대한 정보를 얻을 수 있다는 장점이 있고, 메모리를 많이 차지한다는 단점이 있다.
- SAX : 라인 단위로 파싱하기 때문에 메모리의 소모가 적다는 장점이 있고, 지나쳐간 요소의 정보를 얻고 싶으면 다시 파싱해야 한다는 단점이 있다.
- PullParser : SAX와 유사하지만 원하는 부분까지만 파싱이 가능하다.
DOM
- DOM(Document Object Model)은 W3C의 표준으로 XML 문서에 접근하고 처리하는 표준적인 방법을 정의한다.
- DOM은 XML 문서를 트리 구조로 표현한다.
- DOM은 문서 요소의 객체(object), 특징(property), 메소드(interface)를 정의한다.
멀티미디어
안드로이드의 멀티미디어 지원
오디오나 비디오 등의 멀티미디어를 재생하기 위해서는 MediaPlayer 클래스를 사용한다.
MediaPlayer 클래스를 사용하면 SD 카드나 인터넷에 있는 비디오나 오디오 파일을 재생할 수 있다.
오디오나 비디오를 녹화하기 위해서는 MediaRecorder 클래스를 사용한다. 카메라로부터 영상을 캡처하기 위해서는 Camera 클래스도 필요하다.
안드로이드 지원 파일 형식
오디오 재생
안드로이드에서 오디오를 재생하는 것은 다음과 같은 2가지 방법으로 가능하다.
- 인텐트를 사용하여서 전용 애플리케이션에 오디오를 재생해달라고 요청할 수 있다.
- 애플리케이션에서 직접 MediaPlayer 클래스를 사용하여서 오디오를 재생할 수 있다.
만약 간단하게 재생이나 녹음이 필요한 경우에는 인텐트를 사용하는 것이 좋고, 기존의 인터페이스가 아닌 다른 인터페이스가 필요한 경우에는 오디오 관련 클래스를 사용하는 것이 바람직하다.
MediaPlayer 클래스를 사용하여서 오디오 재생하기
MediaPlayer 클래스는 모든 미디어의 재생을 담당하는 클래스로 MediaPlayer 클래스는 상태기계(state machine)로 관리된다. 상태 기계란 입력에 따라 상태가 변화되는 시스템을 의미한다. MediaPlayer 클래스는 호출되는 메소드에 따라 내부 상태가 변화된다.
- 객체 생성(mp = new MediaPlayer())
- 데이터 소스 지정(mp.setDataSource())
- 재생 준비(mp.prepare())
- 재생 시작(mp.start())
- 재생 중지(mp.stop())
- 리소스 해제의 단계를 거친다.(mp.release())
안드로이드 액티비티에서 MediaPlayer 객체로 setDataSource()로 데이터 소스를 지정해주고 prepare()로 재생 준비를 하고 start()로 재생한다.
MediaPlayer 클래스를 사용하는 3가지 방법
- 리소스 미디어 재생
- 파일 미디어 재생
- 네트워크에서 미디어 재생
매니페스트 파일
SD 카드에서 리소스를 읽어오려면 매니페스트 파일에 다음과 같은 권한을 요청해야 한다.
을 추가시켜줘야 한다.
오디오 녹음
오디오의 녹음도 두 가지의 방법이 있다.
- 인텐트를 사용하여서 전용 애플리케이션에 오디오를 녹음해달라고 요청한다.
- 애플리케이션에서 직접 MediaRecorder 클래스를 사용해 오디오를 녹음한다.
MediaRecorder를 사용하여서 오디오 녹음
//MediaRecorder의 객체를 생성한다.
MediaRecorder recorder = new MediaRecorder();
// 오디오 소스를 설정한다.
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
//출력 파일 형식을 설정한다.
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
//엔코더를 설정한다.
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
//데이터가 저장될 파일 경로를 설정한다.
recorder.setOutputFile(PATH_NAME);
매니페스트 파일
오디오를 녹음하기 위해서는 매니페스트 파일에 다음과 같은 권한을 선언해야 한다.
<uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
이미지 캡처
이미지를 캡처하기 위해서는 2가지의 방법이 있다
- 인텐트 사용
//이미지를 요청하는 인텐트 생성 intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); //카메라 인텐트 실행 startActivityForResult(i, CAMERA_CAPTURE); //카메라 인텐트로부터 결과를 받는다. 사용자가 촬영이 끝나면 시스템이 이 콜백 메소드를 호출한다. protected void onActivityResult(int requestCode, int resultCode, Intent intent) {}
- Camera 클래스 사용
매니페스트 파일
카메라에서 영상을 획득해서 SD 카드에 기록하려면 다음과 같은 권한이 설정되야 한다.
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORATGE"></uses-permission>
<uses-permission android:name="android.permission.CAMERA"></uses-permission>
Camera 클래스를 이용한 영상 캡처
만약 안드로이드에서 기본적으로 제공하는 카메라 서비스를 이용하지 않고 자신만의 카메라 애플리케이션을 작성하고자 한다면 Camera 클래스를 이용하면 된다.
Camera 클래스를 이용하면 이미지 캡처 설정 변경, 이미지 프리뷰, 비디오에서 프레임 추출 등을 할 수 있다.
카메라 관련 애플리케이션을 작성할 때 고려할 점
- 애플리케이션에서 카메라의 사용이 필수적인가?
- 매니페스트 파일에서 카메라를 요구해야 한다.
- 단순히 이미지만 필요한가? 아니면 맞춤형 카메라 기능이 필요한가?
- 단순 이미지 캡처 기능만 필요하다면 기존 카메라 애플리케이션을 사용하고 맞춤형 카메라 기능이 필요하다면 Camera 클래스를 사용해야 한다.
- 이미지나 비디오가 애플리케이션에서만 사용되는가?
- 미디어 파일을 저장하는 방법을 적절하게 선택한다.
필요한 클래스들
- android.hardware.camera2 클래스
- 카메라 장치를 제어하는 주요 api로 사진을 찍거나 동영상을 촬영하는데 사용
- Camera 클래스
- 예전 버전에서도 사용되지만 현재도 사용
- SurfaceView 클래스
- 사용자에게 실시간 카메라 미리보기 제공
- MediaRecorder 클래스
- 카메라로부터 동영상을 녹화하는데 사용.
- Intent 클래스
- 인텐트 액션타입 MediaStore.ACTION_IMAGE_CAPTURE 및 MediaStore.ACTION_VIDEO_CAPTURE는 Camera 객체를 직접 사용하지 않고 이미지나 동영상을 캡쳐하는데 사용.
매니페스트에 표기해야 하는 권한들
- 카메라 사용 권한
- 카메라 특성 사용
- 저장 권한
- 오디오 녹음
- 장소 권한
애플리케이션에서 카메라 인터페이스를 생성하는데 필요한 단계
- 카메라 하드웨어 감지
- 프리뷰 클래스 생성
- 레이아웃 작성
- 캡처 담당 리스너 설정
- 캡처 및 저장
- 카메라 해제
비디오 재생
MediaPlayer 클래스는 오디오 재생 뿐만 아니라 비디오 재생도 담당한다.
VideoView 클래스는 MediaPlayer 객체의 생성과 초기화를 담당한다.
'Android' 카테고리의 다른 글
[Android] 안드로이드 작업 스레드에서 UI 업데이트 (0) | 2021.12.08 |
---|---|
[Android] 안드로이드 센서와 NFC (0) | 2021.12.04 |
[Android] 스레드 (0) | 2021.10.13 |
[Android] 안드로이드 방송 수신자(Broadcast Receiver) (0) | 2021.10.07 |
[Android] 안드로이드 서비스 (0) | 2021.10.07 |