* 카메라 이용을 위한 SurfaceView
안녕하세요 송군함대입니다~!^-^/
간만의 포스팅이네요~!! 오늘 포스팅은 간단하게 카메라를 이용하는 방법입니다~!
조금이나마 도움이 되시길 바라며, 아래 내용을 첨부합니다.
* SurfaceView 란?
: 다른 View와 마찬가지로 컨텐츠를 표시할 수 있는 View 중 하나로써, 다른 View와 달리 직접 SurfaceView 가 컨텐츠를 표시하지 않고 SurfaceView 내의 Surface 객체가 표시해준다.
일반적인 View는 화면에 표시하는 연산 등을 하나의 쓰레드에서 처리하게 되어있다. 이를 통해 나타나는 현상이 ANR(Application Not Responding) 이다. ANR 은 어플리케이션이 5초 이상 동작을 멈췄을때(GUI 업데이트가 5초 이상 멈춘 경우), 해당 현상을 확인할 수 있다.
Surface 의 경우에는 실시간으로 카메라로부터 받은 화상을 지속적으로 업데이트를 해야 하므로, 화면 업데이트를 백그라운드 쓰레드로 수행하여 어플리케이션의 자원을 잠식하지 않고 원할하게 뷰를 업데이트 해준다.
* SurfaceView 를 이용한 카메라 이용 예제
: SurfaceView 를 이용하기 위해 상속받고, SurfaceHolder.Callback을 설정하여 Sureface 가 생성, 소멸되었는지를 확인할 수 있다.
이를 이용하기 위해서는 surfaceCreated, surfaceDestroyed, surfaceChanged 메소드를 구현해주어야 한다. 이름에서 알 수 있듯이 surface 생성, 소멸, 변경에 따른 메소드들이다.
아래 예제는 카메라에 담긴 모습을 화면에 뿌려주는 예제이다. 간단한 예제이니, 그리 어렵지 않게 구현할 수 있을 것이다.
구현 하기 전에 먼저 카메라를 사용하기 위한 권한을 아래와 같이 선언해주는 것을 잊지 말자~!!
[예제]
<AndroidManifest.xml>
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
=> 위의 두 가지 권한을 추가해준다.
<CameraViewAppActivity.java>
public class CameraViewAppActivity extends ActionBarActivity { private Preview mPreview; class Preview extends SurfaceView implements SurfaceHolder.Callback { Camera mCamera; SurfaceHolder mHolder; public void close() { if (mCamera != null) { mCamera.setPreviewCallback(null); mCamera.stopPreview(); mCamera.release(); mCamera = null; } } public Preview(Context context) { super(context); if (mCamera == null) { mCamera = Camera.open(); } mHolder = getHolder(); mHolder.addCallback(this); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // TODO Auto-generated method stub Camera.Parameters parameters = mCamera.getParameters(); parameters.setPreviewSize(width, height); mCamera.setParameters(parameters); mCamera.startPreview(); } @Override public void surfaceCreated(SurfaceHolder holder) { // TODO Auto-generated method stub try { if (mCamera == null) { mCamera = Camera.open(); } if (mCamera != null) { mCamera.setPreviewDisplay(holder); Camera.Parameters parameters = mCamera.getParameters(); mCamera.setParameters(parameters); mCamera.startPreview(); } } catch (IOException e) { // TODO Auto-generated catch block if (mCamera != null) { mCamera.release(); mCamera = null; } } } @Override public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub if (mCamera != null) { mCamera.stopPreview(); mCamera.release(); mCamera = null; } } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mPreview = new Preview(this); setContentView(mPreview); } }
'개발 관련 지식 > 안드로이드(Android)' 카테고리의 다른 글
[안드로이드] 안드로이드 애니메이션 효과 및 기능 (0) | 2014.10.30 |
---|---|
[안드로이드] 전면 카메라 사용 예제 (1) | 2014.10.17 |
[안드로이드] GCM 서버 JSON 파라미터 정보 (1) | 2014.08.14 |
[안드로이드] GCM 서버 구현 예제(3)_JAVA를 이용한 푸시 서버 (15) | 2014.07.21 |
[안드로이드] GCM 서버 구현 예제(2)_node.js를 이용한 푸시 서버 (1) | 2014.07.12 |