카메라 Landscape 로 실행하기

  이전 포스팅에서 카메라를 실행해서 Preview 함수로

  영상을 보면 키보드를 열지 않은 상태에서는

  90도로 회전된 영상이 보였었다. 

  일부에서는 버그라고 취급하고 있었는데


  기본으로 제공되는 카메라나 캠코더, Wikitude 등의 

  APP에서는 Portrait mode 에서도 정상적으로 

  카메랑 영상이 나오는 것을 알수 있다. 

  오랜 검색 끝에 해결방법을 알아냈다.

  방법은 designerandroid.com에서 발견하였고,

  APP의 Activity 가 처음 실행되는 곳인 onCreate 함수에 다음의 문장을 삽입한다.

 this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

 아래는 그 예이다.

 public class <<당신의 Activity이름>> 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); 

        /////여기에 삽입//////////////////////// 

        this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

        ////////////////////////////////////

        setContentView(mPreview);

        

    } 

}



  이 문장을 넣고 시험한 결과 정상 동작하는 것을 확인했다.

  카메라로 테스트 하시는 분들은 참조하시길...

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

  카메라 화면은 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;

}