반응형
Camera Class
Cameara camera = Camera.open();
...
camera.release();
<uses-permission android:name="android.permission.CAMERA" />
카메라 설정 제어
카메라 Parameters 객체를 이용하여 이미지 크기, 미리보기, 포맷, 프레임 속도 등을 지정
Camera.Parameters parameters = camera.getParameters();
parameters.setPictureFormat(PixelFormat.JPEG);
camera.setParameters(parameters);
* 카메라 세팅 잘못하면 기기 특성을 타게 되서 어플이 죽을 수 있다.
Camera 미리 보기
SurfaceView를 이용하여 실시간으로 카메라 미리보기를 표시할 수 있다.
현재 증감현실 어플리케이션 대부분이 이 기능을 이용한다.
Camera camera = Camera.open();
camera.setPreviewDisplay(holder);
camera.startPreview();
...
camera.stopPreview();
Camera 미리보기 도중 사진 찍기
SutterCallback shutterCallback = new ShutterCallback(){
public void onShutter(){
// 셔터를 눌렀을 때 Action(효과음 등 삽입)
}
}
PictureCallback rawCallback = new PictureCallback(){
public void onPictureTaken(byte[] data, Camera camera){
// 카메라를 통해 들어온 RAW 데이터를 이용
}
}
PictureCallback jpegCallbak = new PictureCallback(){
public void onPictureTaken(byte[] data, Camera camera){
// 카메라를 통해 들어온 JPEN 데이터를 이용
}
}
주의사항
1. 안드로이드는 가로세로 전환시 Activity를 Destroy까지 불러서 없애고 새로 불러오기 때문에 화면에 데이터가 초기화된다. (미리보기 이미지도 날라갈 수 있다.)
다음과 같이 설정해서 가로세로 전환시 기존 Activity의 데이터를 초기화하는 것을 막을 수 있다.
CameraPreview Sample
...
camera.release();
<uses-permission android:name="android.hardware.camera" />
<uses-permission android:name="android.hardware.camera.autofocus" />
카메라 설정 제어
카메라 Parameters 객체를 이용하여 이미지 크기, 미리보기, 포맷, 프레임 속도 등을 지정
parameters.setPictureFormat(PixelFormat.JPEG);
camera.setParameters(parameters);
Camera 미리 보기
SurfaceView를 이용하여 실시간으로 카메라 미리보기를 표시할 수 있다.
현재 증감현실 어플리케이션 대부분이 이 기능을 이용한다.
camera.setPreviewDisplay(holder);
camera.startPreview();
...
camera.stopPreview();
Camera 미리보기 도중 사진 찍기
public void onShutter(){
// 셔터를 눌렀을 때 Action(효과음 등 삽입)
}
}
PictureCallback rawCallback = new PictureCallback(){
public void onPictureTaken(byte[] data, Camera camera){
// 카메라를 통해 들어온 RAW 데이터를 이용
}
}
PictureCallback jpegCallbak = new PictureCallback(){
public void onPictureTaken(byte[] data, Camera camera){
// 카메라를 통해 들어온 JPEN 데이터를 이용
}
}
주의사항
1. 안드로이드는 가로세로 전환시 Activity를 Destroy까지 불러서 없애고 새로 불러오기 때문에 화면에 데이터가 초기화된다. (미리보기 이미지도 날라갈 수 있다.)
다음과 같이 설정해서 가로세로 전환시 기존 Activity의 데이터를 초기화하는 것을 막을 수 있다.
<activity android:name=".Main"
android:screenOrientation="landscape"
android:configChanges="orientation\keyboardHidden"
android:label="@string/app_name">
2. StatusBar나 TitleBar 때문에 미리보기 화면이 찌그러져서 나올 수 있다. 기기마다 설정을 새로 해주는것보다 이 StatusBar나 TitleBar를 없애주는 편이 좋다.CameraPreview Sample
package com.tistory.atin.camera;
import android.app.Activity;
import android.os.Bundle;
public class Main extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
CameraPreview cp = new CameraPreview(this);
setContentView(cp);
}
}
[Source 1. Main.java]
package com.tistory.atin.camera;
import java.io.IOException;
import android.content.Context;
import android.hardware.Camera;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.SurfaceHolder.Callback;
public class CameraPreview extends SurfaceView implements Callback {
Camera camera = null;
SurfaceHolder holder = null;
public void init() {
holder = getHolder();
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public CameraPreview(Context context) {
super(context);
init();
}
public CameraPreview(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
if(camera != null) {
Camera.Parameters params = camera.getParameters();
params.setPreviewSize(width, height);
camera.startPreview();
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
camera = Camera.open();
try{
camera.setPreviewDisplay(holder);
} catch(IOException e){
e.printStackTrace();
camera.release();
camera = null;
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if(camera != null) {
camera.stopPreview();
camera.release();
camera = null;
}
}
}
[Source 2. CameraPreview.java]
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.tistory.atin.camera"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="7" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.hardware.camera" />
<uses-permission android:name="android.hardware.camera.autofocus" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".Main"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
android:screenOrientation="landscape"
android:configChanges="orientation|keyboardHidden"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
[Source 3. Manifest.xml]
[Picture 1. 실행결과]
반응형
'Devlopment > Mobile' 카테고리의 다른 글
안드로이드 ListView구현시 Adapter의 getView 중복 호출 문제 (0) | 2011.07.11 |
---|---|
[Android] 알림 - AlertDialog, Toast (0) | 2011.06.27 |
모바일상에서의 Network Programming (1) | 2011.06.23 |
Android Sensor 활용 (0) | 2011.06.22 |
Android 진동 다루기 (0) | 2011.06.22 |
Android Drawing (0) | 2011.06.21 |
안드로이드 OS Version 및 이름 (0) | 2011.06.20 |
Eclipse에서 안드로이드 개발시 Device가 안 잡힐 경우 (0) | 2011.06.17 |
Mobile UI Framework (0) | 2011.06.16 |
Mobile Browser Header 분석 (0) | 2011.06.16 |