1. 카메라 기능을 사용하기 위해 매니페스트에 다음 선언문을 작성한다.
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
2. 정적 메서드로 카메라 객체를 생성한다.
static Camera open()
3. 객체 생성 후 미리보기 표면을 제공하기 위해 미리보기 표면과 방향을 지정한다.
void setPreviewDisplay(SurfaceHolder holder)
void setDisplayOrientation(int degrees)
// 미리보기 표면 클래스
class MyCameraSurface extends SurfaceView implements SurfaceHolder.Callback {
SurfaceHolder mHolder;
Camera mCamera;
public MyCameraSurface(Context context, AttributeSet attrs){
super(context, attrs);
mHolder = getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
// 표면 생성 시 카메라 오픈하고 미리보기 설정
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
mCamera = Camera.open();
try {
mCamera.setPreviewDisplay(mHolder);
} catch (IOException e) {
// TODO Auto-generated catch block
mCamera.release();
mCamera = null;
}
}
}
4. 카메라의 동작 방식이나 여러 가지 옵션을 지정하는 파라미터를 설정한다. (해상도, 품질, 미리보기 크기 등등)
Camera.Parameters getParameters() : 현재 파라미터를 값을 읽어온다.
void setParameters(Camera.Parameters params) : 파라미터를 설정한다.
- 미리보기 영역의 크기 목록을 조사하고 설정하는 메서드
List<Camera.Size> Camera.Parameters.getSupportedPreviewSizes()
void Camera.Parameters.setPreviewSize(int width, int height)
- 사진의 해상도를 조사 및 지정하는 방식
List<Camera.Size> getSupportedPictureSizes()
void setPictureSize(int width, int height)
5. 파라미터 설정 후, 미리보기를 표시한다.
void startPreview()
void stopPreview()
// 미리보기 표면 클래스
class MyCameraSurface extends SurfaceView implements SurfaceHolder.Callback {
SurfaceHolder mHolder;
Camera mCamera;
public MyCameraSurface(Context context, AttributeSet attrs){
super(context, attrs);
mHolder = getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
// 표면의 크기가 결정될 때 최적의 미리보기 크기를 구해 설정한다.
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
Camera.Parameters parameters = mCamera.getParameters();
List<Size> arSize = parameters.getSupportedPreviewSizes();
if(arSize==null){
parameters.setPreviewSize(width, height);
String msg;
msg= "width:"+width+"height:"+height;
Log.i("tag", msg);
} else {
int diff = 10000;
Size opti = null;
for(Size s : arSize){
if(Math.abs(s.height - height) < diff) {
diff = Math.abs(s.height - height);
opti = s;
}
}
parameters.setPreviewSize(opti.width, opti.height);
}
mCamera.setParameters(parameters);
mCamera.startPreview();
}
}
6. Layout.xml 파일을 작성한다.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".CameraPreviewActivity" >
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Start" />
<com.example.smarttv.MycameraSurface
android:id="@+id/preview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
</LinearLayout>
7. 질 좋은 이미지를 얻기 위해 오토 포커싱 과정을 거친다.
void autoFocus(Camera.AutoFocusCallback cb)
void AutoFocusCallback.onAutoFocus(boolean success, Camera camera)
void cancelAutoFocus()
※ 장비가 오토 포커싱을 지원하지 않으면 콜백이 즉시 호출되며 포커싱은 성공한 것으로 가정한다.