Interesting/ANDROID | Posted by hyena0 2009. 7. 7. 02:57

[Android] 카메라 Test


  Camera Test

  안드로이드 카메라 동작 테스트 코드 입니다.

  CameraApiTest.java 파일을 참조하여

  SDK 1.5에서 동작하도록 수정하였습니다.

  카메라 동작은 키보드를 열지 않으면

  화면이 90도로 회전되어 있어서 제대로 동작하지 않네요

  키보드 열고 해보면 스페이스 바 눌렀을때 사진이 찍힙니다.

  현재 셔터 없이 바로 jpg만 동작하게 수정했고(takePicture),

  mCamera.setPreviewDisplay(holder) 부분에 IOException 미처리 오류로 수정하였습니다.

  소스는 아래와 같습니다.

  하지만 사진을 저장하는 코드가 없기 때문에 스페이스 바를 눌러보다 보면 오류로 프로그램이 죽네요..^^

package <<당신의 패키지 이름>>;


import java.io.IOException;

import android.app.Activity;

import android.content.Intent;

import android.graphics.Canvas;

import android.graphics.Paint;

import android.graphics.PixelFormat;

import android.graphics.Rect;

import android.net.Uri;

import android.os.Handler;

import android.os.Message;

import android.os.Bundle;

import android.provider.MediaStore.Images;

import android.provider.MediaStore.Video;

import android.view.Menu;

import android.view.MenuItem;

import android.view.SurfaceHolder;

import android.view.SurfaceView;

import android.view.KeyEvent;

import android.hardware.Camera;


import android.util.Log;


public class camera extends Activity implements SurfaceHolder.Callback

{

    Camera mCamera;

    boolean mPreviewRunning = false;

    

     


    public void onCreate(Bundle icicle)

    {

        super.onCreate(icicle);


        Log.e(TAG, "onCreate");


        getWindow().setFormat(PixelFormat.TRANSLUCENT);


        setContentView(R.layout.main);

        mSurfaceView = (SurfaceView)findViewById(R.id.surface);


        mSurfaceHolder = mSurfaceView.getHolder();

        mSurfaceHolder.addCallback(this);

        mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

    }


    public boolean onCreateOptionsMenu(android.view.Menu menu) {

        MenuItem item = menu.add(0, 0, 0, "goto gallery");

        item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {

            public boolean onMenuItemClick(MenuItem item) {

                Uri target = Uri.parse("content://media/external/images/media");

                Intent intent = new Intent(Intent.ACTION_VIEW, target);

                startActivity(intent);

                return true;

            }

        });

        return true;

    }

    

    @Override

    protected void onRestoreInstanceState(Bundle savedInstanceState)

    {

        super.onRestoreInstanceState(savedInstanceState);

    }


    Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {

        public void onPictureTaken(byte[] data, Camera c) {

            Log.e(TAG, "PICTURE CALLBACK: data.length = " + data.length);

            mCamera.startPreview();

        }

    };


    public boolean onKeyDown(int keyCode, KeyEvent event)

    {

        if (keyCode == KeyEvent.KEYCODE_BACK) {

            return super.onKeyDown(keyCode, event);

        }

 

        if (keyCode == KeyEvent.KEYCODE_SPACE) {

            mCamera.takePicture(null, null, mPictureCallback);

            return true;

        }


        return false;

    }


    protected void onResume()

    {

        Log.e(TAG, "onResume");

        super.onResume();

    }


    protected void onSaveInstanceState(Bundle outState)

    {

        super.onSaveInstanceState(outState);

    }


    protected void onStop()

    {

        Log.e(TAG, "onStop");

        super.onStop();

    }


    public void surfaceCreated(SurfaceHolder holder)

    {

        Log.e(TAG, "surfaceCreated");

        mCamera = Camera.open();

        //mCamera.startPreview();

    }


    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h)

    {

        Log.e(TAG, "surfaceChanged");

        IOException mExcep = new IOException();  // 수정부분


        // XXX stopPreview() will crash if preview is not running

        if (mPreviewRunning) {

            mCamera.stopPreview();

        }


        Camera.Parameters p = mCamera.getParameters();

        p.setPreviewSize(w, h);

        mCamera.setParameters(p);

        try{

        mCamera.setPreviewDisplay(holder);

         if (false) throw new IOException(); 

        }catch (IOException e){

        //do something

        }

        mCamera.startPreview();

        mPreviewRunning = true;

        

    }


    public void surfaceDestroyed(SurfaceHolder holder)

    {

        Log.e(TAG, "surfaceDestroyed");

        mCamera.stopPreview();

        mPreviewRunning = false;

        mCamera.release();

    }


    private SurfaceView mSurfaceView;

    private SurfaceHolder mSurfaceHolder;

}