'Camera'에 해당되는 글 5

  1. 2009.07.09 [Android] 카메라 화면에 무언가 그리기
  2. 2009.07.07 [Android] 카메라 Test 2

  카메라 화면에 무언가 그리기

  카메라 화면은 surfaceView 를 이용하고 있습니다.

  아래의 소스코드는 anddev.org 사이트에서 참조하였습니다.

  v1.5에 맞게 수정하였고

  간단히 텍스트 와 라인을 그려보았습니다.

  다른 응용도 가능할거라고 봅니다.




package com.google.android.MySurfaceView;


import java.io.IOException;


import android.app.Activity; 

import android.content.Context; 

import android.graphics.Canvas; 

import android.graphics.Color; 

import android.graphics.Paint; 

import android.hardware.Camera; 

import android.os.Bundle; 

import android.view.SurfaceHolder; 

import android.view.SurfaceView; 

import android.view.View; 

import android.view.Window; 

import android.view.ViewGroup.LayoutParams; 


public class MySurfaceView extends Activity { 

    /** Called when the activity is first created. */ 

    @Override 

    public void onCreate(Bundle savedInstanceState) { 

        super.onCreate(savedInstanceState); 

        


        requestWindowFeature(Window.FEATURE_NO_TITLE); 


        Preview mPreview = new Preview(this); 

        DrawOnTop mDraw = new DrawOnTop(this); 

    

        setContentView(mPreview); 

        addContentView(mDraw, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 

        

    } 


class DrawOnTop extends View { 


     public DrawOnTop(Context context) { 

          super(context); 

          // TODO Auto-generated constructor stub 

     } 


     @Override 

     protected void onDraw(Canvas canvas) { 

          // TODO Auto-generated method stub 

           

          Paint paint = new Paint(); 

          paint.setStyle(Paint.Style.FILL); 

          paint.setColor(Color.RED);                    // 적색

          paint.setStrokeWidth(10);                     // 크기 10

          canvas.drawText("Test Text", 10, 10, paint); // 텍스트 표시

          canvas.drawLine(50, 50, 200, 200, paint);    // 라인그리기

           

          super.onDraw(canvas); 

     } 

      


//---------------------------------------------------------------------- 


class Preview extends SurfaceView implements SurfaceHolder.Callback { 

    SurfaceHolder mHolder

    Camera mCamera

    

    Preview(Context context) { 

        super(context); 

        

        // Install a SurfaceHolder.Callback so we get notified when the 

        // underlying surface is created and destroyed. 

        mHolder = getHolder(); 

        mHolder.addCallback(this); 

        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

    } 


    public void surfaceCreated(SurfaceHolder holder) { 

        // The Surface has been created, acquire the camera and tell it where 

        // to draw. 

        mCamera = Camera.open(); 

        try{    //수정부분

        mCamera.setPreviewDisplay(holder);

         if (false) throw new IOException(); 

        }catch (IOException e){

        //do something

        }

    } 


    public void surfaceDestroyed(SurfaceHolder holder) { 

        // Surface will be destroyed when we return, so stop the preview. 

        // Because the CameraDevice object is not a shared resource, it's very 

        // important to release it when the activity is paused. 

        mCamera.stopPreview(); 

        mCamera = null

    } 


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

        // Now that the size is known, set up the camera parameters and begin 

        // the preview. 

        Camera.Parameters parameters = mCamera.getParameters(); 

        parameters.setPreviewSize(w, h); 

        mCamera.setParameters(parameters); 

        mCamera.startPreview(); 

    } 


}



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;

}