'안드로이드'에 해당되는 글 42

  1. 2009.07.10 [Android] 카메라 Landscape 로 실행하기
  2. 2009.07.07 [Android] 카메라 Test 2
  3. 2009.07.07 [android] 나침반 + 구글지도

  카메라 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);

        

    } 

}



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

  카메라로 테스트 하시는 분들은 참조하시길...
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;

}

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

[android] 나침반 + 구글지도


  나침반 + 구글지도

  안드로이드에서 구글지도를 

  보이게 하는 것은 검색페이지에서 쉽게 찾을 수 있다.

  안드로이드의 센서 중 하나인

  나침반을 이용해서 구글지도와 연결하면

  핸드폰을 가지고 방향만 틀어도 지도를 볼 수 있게 된다.

  여기서 센서의 방향 값을 가지고 지도를 회전할 수 있게 해야 하는게 관건인데

  아래의 샘플코드를 보면 센서값 중 heading 값을 가지고 평면의 회전 각도를 입력한다.

  아래 코드는 MapViewCompassDemo.java를 수정한 것이다. 

  SDK 1.5 맞게 수정했으므로 한번 시험해 보면 동작을 확인해 볼 수 있다. 

  여기서 중요한 건 MapActivity 로 상속받아 사용할때 Manifest 파일을 수정해야 한다는 것과

  프로젝트 속성에서 Build Target을 Google API로 해놓고 해야 한다는 것이다.

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


import javax.microedition.khronos.opengles.GL;


import android.os.Bundle;

import android.view.MotionEvent;

import android.view.View;

import android.view.ViewGroup;

import android.content.Context;

import android.graphics.Bitmap;

import android.graphics.Canvas;

import android.graphics.DrawFilter;

import android.graphics.Matrix;

import android.graphics.Paint;

import android.graphics.Path;

import android.graphics.Picture;

import android.graphics.PorterDuff;

import android.graphics.Rect;

import android.graphics.RectF;

import android.graphics.Region;

import android.hardware.Sensor;

import android.hardware.SensorManager;

import android.hardware.SensorEventListener;

import android.hardware.SensorEvent;


import com.google.android.maps.MapActivity;

import com.google.android.maps.MapView;

import com.google.android.maps.MyLocationOverlay;


/**

 * Example of how to use an {@link com.google.android.maps.MapView}

 * in conjunction with the {@link com.hardware.SensorManager}

 * <h3>MapViewCompassDemo</h3>


<p>This demonstrates creating a Map based Activity.</p>


<h4>Source files</h4>

 * <table class="LinkTable">

 *         <tr>

 *             <td >src/com/android/samples/view/MapViewCompassDemo.java</td>

 *             <td >The Alert Dialog Samples implementation</td>

 *         </tr>

 * </table>

 */

public class rotatableMap extends MapActivity {


    private SensorManager mSensorManager;

    private RotateView mRotateView;

    private MapView mMapView;

    private MyLocationOverlay mMyLocationOverlay;


    private class RotateView extends ViewGroup implements SensorEventListener {

                                           //v1.5 부터는 SensorEventListener를 이용합니다.

        private static final float SQ2 = 1.414213562373095f;

        private final SmoothCanvas mCanvas = new SmoothCanvas();

        private float mHeading = 0;


        public RotateView(Context context) {

            super(context);

        }


        public void onSensorChanged(SensorEvent sensorEvent) {

            synchronized (this) {

                mHeading = sensorEvent.values[0];  // 센서 값중 Heading 값만 가져갑니다.

                invalidate();

            }

        }

        public void onAccuracyChanged(Sensor sensor, int accuracy){

    }

        

        @Override

        protected void dispatchDraw(Canvas canvas) {

            canvas.save(Canvas.MATRIX_SAVE_FLAG);

            canvas.rotate(-mHeading, getWidth() * 0.5f, getHeight() * 0.5f);

            mCanvas.delegate = canvas;

            super.dispatchDraw(mCanvas);

            canvas.restore();

        }


        @Override

        protected void onLayout(boolean changed, int l, int t, int r, int b) {

            final int width = getWidth();

            final int height = getHeight();

            final int count = getChildCount();

            for (int i = 0; i < count; i++) {

                final View view = getChildAt(i);

                final int childWidth = view.getMeasuredWidth();

                final int childHeight = view.getMeasuredHeight();

                final int childLeft = (width - childWidth) / 2;

                final int childTop = (height - childHeight) / 2;

                view.layout(childLeft, childTop, childLeft + childWidth, childTop + childHeight);

            }

        }



        @Override

        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

            int w = getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec);

            int h = getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec);

            int sizeSpec;

            if (w > h) {

                sizeSpec = MeasureSpec.makeMeasureSpec((int) (w * SQ2), MeasureSpec.EXACTLY);

            } else {

                sizeSpec = MeasureSpec.makeMeasureSpec((int) (h * SQ2), MeasureSpec.EXACTLY);

            }

            final int count = getChildCount();

            for (int i = 0; i < count; i++) {

                getChildAt(i).measure(sizeSpec, sizeSpec);

            }

            super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        }


        @Override

        public boolean dispatchTouchEvent(MotionEvent ev) {

            // TODO: rotate events too

            return super.dispatchTouchEvent(ev);

        }

    }


    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);


        //original

        //requestWindowFeature(Window.FEATURE_OPENGL);


        mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);

        mRotateView = new RotateView(this);

        mMapView = new MapView(this, "06MmQkkJlMQtcbbaAI1Njy1JcO39_F4DrwR-cpA");

        mRotateView.addView(mMapView);

        setContentView(mRotateView);


        mMyLocationOverlay = new MyLocationOverlay(this, mMapView);

        mMyLocationOverlay.runOnFirstFix(new Runnable() { public void run() {

            mMapView.getController().animateTo(mMyLocationOverlay.getMyLocation());

        }});

        mMapView.getOverlays().add(mMyLocationOverlay);

        mMapView.getController().setZoom(18);

        mMapView.setClickable(true);

        mMapView.setEnabled(true);

    }


    @Override

    protected void onResume() {

        super.onResume();

        mSensorManager.registerListener(mRotateView,

        mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),

                SensorManager.SENSOR_DELAY_UI);

        mMyLocationOverlay.enableMyLocation();

    }


    @Override

    protected void onStop() {

        mSensorManager.unregisterListener(mRotateView);

        mMyLocationOverlay.disableMyLocation();

        super.onStop();

    }


    @Override

    protected boolean isRouteDisplayed() {

        return false;

    }



    static final class SmoothCanvas extends Canvas {

        Canvas delegate;


        private final Paint mSmooth = new Paint(Paint.FILTER_BITMAP_FLAG);


        public void setBitmap(Bitmap bitmap) {

            delegate.setBitmap(bitmap);

        }


        public void setViewport(int width, int height) {

            delegate.setViewport(width, height);

        }


        public boolean isOpaque() {

            return delegate.isOpaque();

        }


        public int getWidth() {

            return delegate.getWidth();

        }


        public int getHeight() {

            return delegate.getHeight();

        }


        public int save() {

            return delegate.save();

        }


        public int save(int saveFlags) {

            return delegate.save(saveFlags);

        }


        public int saveLayer(RectF bounds, Paint paint, int saveFlags) {

            return delegate.saveLayer(bounds, paint, saveFlags);

        }


        public int saveLayer(float left, float top, float right, float

                bottom, Paint paint,

                int saveFlags) {

            return delegate.saveLayer(left, top, right, bottom, paint,

                    saveFlags);

        }


        public int saveLayerAlpha(RectF bounds, int alpha, int saveFlags) {

            return delegate.saveLayerAlpha(bounds, alpha, saveFlags);

        }


        public int saveLayerAlpha(float left, float top, float right,

                float bottom, int alpha,

                int saveFlags) {

            return delegate.saveLayerAlpha(left, top, right, bottom,

                    alpha, saveFlags);

        }


        public void restore() {

            delegate.restore();

        }


        public int getSaveCount() {

            return delegate.getSaveCount();

        }


        public void restoreToCount(int saveCount) {

            delegate.restoreToCount(saveCount);

        }


        public void translate(float dx, float dy) {

            delegate.translate(dx, dy);

        }


        public void scale(float sx, float sy) {

            delegate.scale(sx, sy);

        }


        public void rotate(float degrees) {

            delegate.rotate(degrees);

        }


        public void skew(float sx, float sy) {

            delegate.skew(sx, sy);

        }


        public void concat(Matrix matrix) {

            delegate.concat(matrix);

        }


        public void setMatrix(Matrix matrix) {

            delegate.setMatrix(matrix);

        }


        public void getMatrix(Matrix ctm) {

            delegate.getMatrix(ctm);

        }


        public boolean clipRect(RectF rect, Region.Op op) {

            return delegate.clipRect(rect, op);

        }


        public boolean clipRect(Rect rect, Region.Op op) {

            return delegate.clipRect(rect, op);

        }


        public boolean clipRect(RectF rect) {

            return delegate.clipRect(rect);

        }


        public boolean clipRect(Rect rect) {

            return delegate.clipRect(rect);

        }


        public boolean clipRect(float left, float top, float right,

                float bottom, Region.Op op) {

            return delegate.clipRect(left, top, right, bottom, op);

        }


        public boolean clipRect(float left, float top, float right,

                float bottom) {

            return delegate.clipRect(left, top, right, bottom);

        }


        public boolean clipRect(int left, int top, int right, int bottom) {

            return delegate.clipRect(left, top, right, bottom);

        }


        public boolean clipPath(Path path, Region.Op op) {

            return delegate.clipPath(path, op);

        }


        public boolean clipPath(Path path) {

            return delegate.clipPath(path);

        }


        public boolean clipRegion(Region region, Region.Op op) {

            return delegate.clipRegion(region, op);

        }


        public boolean clipRegion(Region region) {

            return delegate.clipRegion(region);

        }


        public DrawFilter getDrawFilter() {

            return delegate.getDrawFilter();

        }


        public void setDrawFilter(DrawFilter filter) {

            delegate.setDrawFilter(filter);

        }


        public GL getGL() {

            return delegate.getGL();

        }


        public boolean quickReject(RectF rect, EdgeType type) {

            return delegate.quickReject(rect, type);

        }


        public boolean quickReject(Path path, EdgeType type) {

            return delegate.quickReject(path, type);

        }


        public boolean quickReject(float left, float top, float right,

                float bottom,

                EdgeType type) {

            return delegate.quickReject(left, top, right, bottom, type);

        }


        public boolean getClipBounds(Rect bounds) {

            return delegate.getClipBounds(bounds);

        }


        public void drawRGB(int r, int g, int b) {

            delegate.drawRGB(r, g, b);

        }


        public void drawARGB(int a, int r, int g, int b) {

            delegate.drawARGB(a, r, g, b);

        }


        public void drawColor(int color) {

            delegate.drawColor(color);

        }


        public void drawColor(int color, PorterDuff.Mode mode) {

            delegate.drawColor(color, mode);

        }


        public void drawPaint(Paint paint) {

            delegate.drawPaint(paint);

        }


        public void drawPoints(float[] pts, int offset, int count,

                Paint paint) {

            delegate.drawPoints(pts, offset, count, paint);

        }


        public void drawPoints(float[] pts, Paint paint) {

            delegate.drawPoints(pts, paint);

        }


        public void drawPoint(float x, float y, Paint paint) {

            delegate.drawPoint(x, y, paint);

        }


        public void drawLine(float startX, float startY, float stopX,

                float stopY, Paint paint) {

            delegate.drawLine(startX, startY, stopX, stopY, paint);

        }


        public void drawLines(float[] pts, int offset, int count, Paint paint) {

            delegate.drawLines(pts, offset, count, paint);

        }


        public void drawLines(float[] pts, Paint paint) {

            delegate.drawLines(pts, paint);

        }


        public void drawRect(RectF rect, Paint paint) {

            delegate.drawRect(rect, paint);

        }


        public void drawRect(Rect r, Paint paint) {

            delegate.drawRect(r, paint);

        }


        public void drawRect(float left, float top, float right, float

                bottom, Paint paint) {

            delegate.drawRect(left, top, right, bottom, paint);

        }


        public void drawOval(RectF oval, Paint paint) {

            delegate.drawOval(oval, paint);

        }


        public void drawCircle(float cx, float cy, float radius, Paint paint) {

            delegate.drawCircle(cx, cy, radius, paint);

        }


        public void drawArc(RectF oval, float startAngle, float

                sweepAngle, boolean useCenter,

                Paint paint) {

            delegate.drawArc(oval, startAngle, sweepAngle, useCenter, paint);

        }


        public void drawRoundRect(RectF rect, float rx, float ry, Paint paint) {

            delegate.drawRoundRect(rect, rx, ry, paint);

        }


        public void drawPath(Path path, Paint paint) {

            delegate.drawPath(path, paint);

        }


        public void drawBitmap(Bitmap bitmap, float left, float top,

                Paint paint) {

            if (paint == null) {

                paint = mSmooth;

            } else {

                paint.setFilterBitmap(true);

            }

            delegate.drawBitmap(bitmap, left, top, paint);

        }


        public void drawBitmap(Bitmap bitmap, Rect src, RectF dst,

                Paint paint) {

            if (paint == null) {

                paint = mSmooth;

            } else {

                paint.setFilterBitmap(true);

            }

            delegate.drawBitmap(bitmap, src, dst, paint);

        }


        public void drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint) {

            if (paint == null) {

                paint = mSmooth;

            } else {

                paint.setFilterBitmap(true);

            }

            delegate.drawBitmap(bitmap, src, dst, paint);

        }


        public void drawBitmap(int[] colors, int offset, int stride,

                int x, int y, int width,

                int height, boolean hasAlpha, Paint paint) {

            if (paint == null) {

                paint = mSmooth;

            } else {

                paint.setFilterBitmap(true);

            }

            delegate.drawBitmap(colors, offset, stride, x, y, width,

                    height, hasAlpha, paint);

        }


        public void drawBitmap(Bitmap bitmap, Matrix matrix, Paint paint) {

            if (paint == null) {

                paint = mSmooth;

            } else {

                paint.setFilterBitmap(true);

            }

            delegate.drawBitmap(bitmap, matrix, paint);

        }


        public void drawBitmapMesh(Bitmap bitmap, int meshWidth, int

                meshHeight, float[] verts,

                int vertOffset, int[] colors, int colorOffset, Paint paint) {

            delegate.drawBitmapMesh(bitmap, meshWidth, meshHeight,

                    verts, vertOffset, colors,

                    colorOffset, paint);

        }


        public void drawVertices(VertexMode mode, int vertexCount,

                float[] verts, int vertOffset,

                float[] texs, int texOffset, int[] colors, int

                colorOffset, short[] indices,

                int indexOffset, int indexCount, Paint paint) {

            delegate.drawVertices(mode, vertexCount, verts,

                    vertOffset, texs, texOffset, colors,

                    colorOffset, indices, indexOffset, indexCount, paint);

        }


        public void drawText(char[] text, int index, int count, float

                x, float y, Paint paint) {

            delegate.drawText(text, index, count, x, y, paint);

        }


        public void drawText(String text, float x, float y, Paint paint) {

            delegate.drawText(text, x, y, paint);

        }


        public void drawText(String text, int start, int end, float x,

                float y, Paint paint) {

            delegate.drawText(text, start, end, x, y, paint);

        }


        public void drawText(CharSequence text, int start, int end,

                float x, float y, Paint paint) {

            delegate.drawText(text, start, end, x, y, paint);

        }


        public void drawPosText(char[] text, int index, int count,

                float[] pos, Paint paint) {

            delegate.drawPosText(text, index, count, pos, paint);

        }


        public void drawPosText(String text, float[] pos, Paint paint) {

            delegate.drawPosText(text, pos, paint);

        }


        public void drawTextOnPath(char[] text, int index, int count,

                Path path, float hOffset,

                float vOffset, Paint paint) {

            delegate.drawTextOnPath(text, index, count, path, hOffset,

                    vOffset, paint);

        }


        public void drawTextOnPath(String text, Path path, float

                hOffset, float vOffset,

                Paint paint) {

            delegate.drawTextOnPath(text, path, hOffset, vOffset, paint);

        }


        public void drawPicture(Picture picture) {

            delegate.drawPicture(picture);

        }


        public void drawPicture(Picture picture, RectF dst) {

            delegate.drawPicture(picture, dst);

        }


        public void drawPicture(Picture picture, Rect dst) {

            delegate.drawPicture(picture, dst);

        }

    }

}