TOMPA [Android] - 디바이스

2011. 9. 27. 21:45카테고리 없음

1. 카메라  

- 카메라 기능을 사용하려면 매니페스트에 다음 선언문을 작성한다. tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

<uses-permission android:name="android.permission.CAMERA"/>

<uses-feature android:name="android.hardware.camera"/>tompa 모바일 프로그래밍 능 력 시험 안드로이드 marcof

<uses-feature android:name="android.hardware.camera.autofocus"/> tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- 카메라 기능은 운영체제의 서비스 형태로 제공되며 서비스와 앱 사이를 연결하는 것이 바로 Camera 클래스이다. 별도의 생성자는 없으므로 다음 메소드로 생성 및 파괴한다. tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

Camera open()

void release() tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

정적 메소드로 카메라 객체를 생성하고 다 사용한 후 release 메소드로 해제한다. 카메라는 입수된 영상의 미리보기를 표시하기 위해 표면 객체를 요구하므로 객체 생성 후 미리보기 표면을 제공해야 한다. 미리보기 표면은 렌즈로부터 영상을 공급 받으므로 별도의 버퍼를 가질 필요는 없으며 그래서 타입을 SURFACE_TYPE_PUSH_BUFFERS 로 설정한다. 다음 메소드로 미리보기 표면과 방향을 지정한다.

void setPreviewDisplay(SurfaceHolder holder); tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

void setDisplayOrientation(int degrees); tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

미리보기는 기본적으로 가로 방향으로 표시된다. 일반적으로 카메라는 방향 전환을 하지 않는다.

- 표면을 지정한 후 카메라의 동작 방식이나 여러 가지 옵션을 지정하는 파라미터를 전달한다. 파라미터는 Camera의 내부 클래스인 Parameters 클래스로 표현된다. get 메소드로 현재 파라미터를 얻고 원하는 값을 수정한 후 set 메소드로 편집한 파라미터를 다시 전달하면 이후부터 카메라는 수정된 파라미터대로 동작한다. 실행 중에도 파라미터는 언제든지 수정할 수 있다. tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

Camera.Parameters getParameters() tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

void setParameters(Camera.Parameters parans)

- 파라미터로 조정할 수 있는 값은 아주 다양하다. Parameters 클래스는 하드웨어 능력치를 조사하는 메소드와 옵션을 변경하는 메소드가 같이 제공된다.

- 파라미터로 옵션을 설정했으면 다음 메소드로 미리보기를 표시한다.

void startPreview()  tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

void stopPreview() tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- startPreview를 호출하면 지정한 표면에 카메라 렌즈로부터 입수된 영상이 반복적으로 출력된다. 미리보기의 프레임 비율이나 포맷도 파라미터로 지정할 수 있다. 미리보기까지 나왔으면 언제든지 촬영을 할 수 있지만 좀 더 질 좋은 이미지를 얻기 위해 오토 포커싱 과정을 거쳐야 한다.

void autoFocus(Camera.AutoFocusCallback cb)  tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

void AutoFocusCallback.onAutoFocus(boolean success, Camera camera)

void cancelAutoFocus()  tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- autoFocuse 메소드는 카메라와 영상 간의 거리를 자동 판별하여 초점을 조절한다. 렌즈의 모터를 동작시켜 움직여야 하므로 다소 시간이 걸리며 그래서 이 메소드는 비동기적으로 동작한다.  tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- 오토 포커싱 콜백을 등록해 놓으면 포커싱 완료 후에 콜백이 호출되며 이때 인수로 포커싱 성공 여부가 전달된다. 포커싱 중에 사용자의 다른 요청이 들어왔다면 중간에 취소할 수도 있다. 오토 포커싱은 기능의 제공 여부를 조사할 필요없이 무조건 호출해도 상관없다. 지원하지 않으면 콜백이 즉시 호출되며 이때 포커싱은 성공한 것으로 가정한다.   tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- 초점을 잡았으면 사진을 찍을 차례다. 이때는 다음 메소드를 호출한다.

void takePicture(Camera.ShutterCallback shutter, Camera.PictureCallback raw, [Camera.PictureCallback postview,] Camera.PictureCallback jpeg)   tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- 사진 한 장을 촬영하려면 굉장히 많은 절차를 거쳐야 하는데 takePicture 메소드는 카메라 서비스에게 사진 촬영 명령만 내린 후 즉시 리턴하되 각 단계마다 호출될 콜백 메소드를 전달해 놓는다. 필요치 않은 콜백은 null로 지정하여 생략할 수 있다.  

- 셔터 콜백은 셔터를 닫을 때 호출되는데 보통 이 시점에서 셔터음을 낸다. 이 콜백 메소드에서 아무 것도 하지 않으면 소리가 안나야 정상이지만 무음 촬영이 법적으로 금지되어 있는 경우에는 강제로 소리가 나기도 한다.  tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- PictureCallback 인터페이스에는 다음 콜백 메소드가 정의되어 있는데 각 단계의 이미지를 얻을 때마다 이 메소드가 호출된다.

void onPictureTaken(byte[] data, Camera camera)tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- data 인수는 이미지의 래스터 정보이다. tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- raw 콜백으로는 압축하기 전의 원본 이미지 데이터가 전달되는데 용량이 대단히 크다. 손실없는 영상이 필요할 때 이 콜백을 처리하되 메모리가 충분하지 않을 경우는 원본 영상이 전달되지 않는다.  tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- postview 콜백은 촬영 후 액정으로 보여줄 이미지가 크기 조정이 완료된 상태로 전달된다.

- 카메라의 경우 가장 중요한 콜백은 이미지 데이터를 압축해서 전달하는 JPEG 콜백이다. 미리 정한 포맷으로 압축된 이미지가 전달되는데 통상 JPEG 포맷이며 이 데이터를 파일로 저장하면 촬영된 사진 파일이 된다. 이미지를 저장할 때 상세 정보를 Exif 헤더에 저장할 수도 있다. 또 새 이미지가 추가되었으므로 미디어 DB에게 신호를 보내는 처리도 필요하다.  tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- takePicture 메소드는 촬영 전에 미리보기를 자동으로 중지하므로 stopPreview를 호출할 필요는 없다. 렌즈로부터 촬영 영상을 읽어들이는 동안에는 미리보기가 강제로 중지된다. 그러나 촬영이 끝난 후 미리보기를 자동으로 재시작하지 않으므로 startPreview는 직접 호출해야 한다. 이 처리는 보통 JPEG 콜백에서 파일 저장까지 완료한 후에 수행한다. tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- 미리보기 표면 클래스는 SurfaceView를 상속하고, SurfaceHolder.Callback를 인터페이스로 가진다.

- 표면과 카메라는 생명주기가 일치하며 표면이 먼저 준비되어야 카메라가 동작할 수 있다.

2. 맵 서비스 tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- 위치관리자(LocationManager)는 이름이 의미하듯이 위치 기반 서비스에 관련된 주요 기능을 제공하는데 가장 중요한 기능이 위치 제공자의 목록을 조사하는 것이다. 위치 제공자의 목록을 조사할 때는 다음 메소드를 호출한다.

List<String> getAllProviders()  tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

장비가 제공하는 모든 제공자 목록을 구하며 현재 상태에서 사용 불가능한 것이나 권한이 없는 것들도 포함된다. 제공자의 이름 문자열 배열이 리턴된다. 당장 쓸 수 없는 제공자까지 같이 조사되므로 별 실용성은 없으며 어디까지나 장비의 구성이나 능력치를 조사해 볼 뿐이다.

List<String> getProviders([Criteria criteria], boolean enabledOnly)

사용 권한이 있는 제공자 목록을 조사한다. ( 사용가능한 )  tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

String getBestProvider(Criteria criteria, boolean enabledOnly)

사용 권한이 있는 제공자 목록을 조사하여 그 중 기준에 가장 부합되는 하나를 선택한다.

criteria 인수로 기준을 주거나 enableOnly 인수를 true로 지정하여 현재 동작 가능한 것만 조사할 수도 있다.

- COARSE : 대충의 정밀도, FINE : 정밀한 정밀도  tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- 기준들은 어디까지나 힌트로 참조될 뿐이며 절대적이지는 않다. 모든 기준에 다 부합되는 제공자가 없을 시에는 일부 기준을 무시하고 차점자를 찾는다.

- 필요할 때 위치를 바로 구할 수 없으므로 미리 수신 리스너를 등록해 놓고 위치 정보가 들어올 때마다 받아 두었다가 갱신하는 식이어야 한다. 위치 제공자는 위치가 확인될 때마다 리스너로 갱신된 좌표를 전달하며 응용 프로그램은 최후로 받은 위치를 취한다.

requestLocationUpdates 메소드로 위치 갱신 리스너를 등록한다.  tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- 지도 API Key 키에는 자신이 설치한 SDK 버전의 인증서 지문과 개인의 신상정보가 포함되어있다. 따라서 자신이 만든 앱에서는 해당 키가 유효하지만 다른 사람이 만든 앱에서는 유효하지 않다.

2-1. MapView  tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- 맵뷰를 위한 별도의 액티비티 클래스가 제공되는데 바로 MapActivity 이다. MapActivity는 지도 데이터 관리에 필요한 모든 동작을 자동으로 수행한다. 맵뷰는 MapActivity에 강하게 의존하며 또한 MapActivity는 맵뷰를 위해서 존재하는 액티비티이다. 따라서 이 둘은 항상 같이 사용된다.

- 맵뷰는 맵 액티비티 내부에서만 사용할 수 있으며 일반 액티비티 안에서는 전혀 동작하지 않는다.

- 액티비티당 딱 하나의 맵뷰만 사용할 수 있다는 제약도 있는데 한 화면에 두 개의 지도를 띄울 수는 없다.

- 맵뷰를 사용하는 프로젝트는 타겟을 반드시 표준 API에 맵 서비스가 추가된 Google APIs로 선택해야 한다.

<uses-library android:name="com.google.android.maps"/> 해당 라이브러리를 사용한다는 것과 인터넷 퍼미션을 추가해야 한다.

- XML 레이아웃에 맵뷰 위젯을 배치할 때는 다른 위젯과 동일하되 추가 라이브러리 소속이므로 전체 경로를 완전히 지정해야 한다는 것과

apiKey 속성이 필요하다는 정도만 다르다   tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

2-3. GeoPoint 클래스  tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- 위도와 경도를 사용해서 위치를 표시하는 클래스

- 매개인자를 GeoPoint 클래스로 지정해서 사용자의 현재 위치를 중심으로 지도를 표시하거나 특정 위치를 기준으로 표시할 수 있도록 해줌

- GeoPoint(int latitudeE6, int longitudeE6) 생성자는 위도와 경도를 정수로 표현하며 실제 값에 1E6을 곱한 값을 맥인자로 지정하고

getLatitudeE6(), getLongitudeE6()의 메소드로 그 값을 각각 리턴함  tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- 안드로이드의 맵뷰는 십진좌표 형태의 GeoPoint 객체를 요구하기에 십진 실수 형태로 변환해야되서 GeoPoint가 사용된다.

- 추출된 좌표를 지도에 적용하기 위해서는 1,000,000을 곰하여 GeoPoint 객체로 변환해야 한다.

2-4. 지오코딩 (GeoCoding)  tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- 지명이나 주소 같은 문자열로부터 좌표를 찾아내는 연산을 지오코딩이라고 한다.

- 이러한 연산이 가능하려면 방대한 양의 데이터베이스가 필요한데 장비에 이 정보들이 다 내장되어 있을리는 없으므로 네트워크를 통해 조사한다. 이 정보는 물론 구글이 제공하며 안드로이드는 지오코딩 연산을 위한 백그라운드 서비스를 제공한다. 서비스에 연결하여 원하는 정보를 얻어내는 모든 동작은 Geocoder 클래스가 담당하므로 다음 메소드를 호출하면 된다.

List<Address> getFromLocation(~~)  tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

List<Address> getFromLocationName(~~)  tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

위도와 경도 좌표를 전달하면 이 위치의 주소 배열이 리턴된다.

- 주소는 Address 타입의 객체로 표현하는데 이 클래스에는 주소의 상세 정보를 구하는 메소드가 제공된다.

2-5. 오버레이  tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

- 커스텀 지도 제작을 위한 기능, 맵뷰가 보여주는 지도 위에 추가로 뭔가를 더 표시하는 기능이며 지도에 유용한 부가 정보를 출력할 수 있는 수단이다.

- draw 메소드에서 해당 맵뷰에 캔버스를 이용하여 그려주는 오버레이 방법,

맵뷰 위에 표시되는 여러 가지 마커를 다룰 수 있게 하는 itemizedOverlay,   tompa 모바일 프로그래밍 능력 시험 안드로이드 marcof

그저 현재 내 위치를 표시하는 오버레이