아틴
Atin
아틴
전체 방문자
오늘
어제
  • 분류 전체보기 (460)
    • Devlopment (246)
      • 정리 글 (20)
      • MicroServices (0)
      • Reactive, Concurrenc.. (12)
      • Java (44)
      • Spring (20)
      • C,C++,Ruby,Python (52)
      • Mobile (39)
      • Web (35)
      • Tip & Info (14)
      • Unit Test (7)
    • Infra (44)
      • OS (21)
      • RDBMS (13)
      • NoSQL&Cache (5)
      • AWS (4)
    • Computer Science (11)
    • Etc (156)

블로그 메뉴

  • Home
  • Guestbook

공지사항

인기 글

태그

  • mysql
  • 정읍
  • Dungeons & Dragons
  • Python
  • 해킨토시
  • jsp
  • 던젼 앤 드래곤즈
  • CSS
  • Java
  • Android
  • 안드로이드
  • Ruby on Rails
  • 여행
  • Linux
  • TRPG
  • 전라도
  • C
  • 아이폰
  • javascript
  • 자바

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
아틴

Atin

Android Camera
Devlopment/Mobile

Android Camera

2011. 6. 22. 10:33
반응형
Camera Class

Cameara camera = Camera.open();
...
camera.release();

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

<uses-permission android:name="android.hardware.camera" />
<uses-permission android:name="android.hardware.camera.autofocus" />


카메라 설정 제어
카메라 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의 데이터를 초기화하는 것을 막을 수 있다.
<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
    'Devlopment/Mobile' 카테고리의 다른 글
    • Android Sensor 활용
    • Android 진동 다루기
    • Android Drawing
    • 안드로이드 OS Version 및 이름
    아틴
    아틴

    티스토리툴바