Hi all,

I'm not able to display the camera preview in portrait mode with Samsung S.
The preview is not well oriented. I have try to rotate it with the following
camera API but nothing change.
*params.set("orientation", "landscape");
params.set("rotation", 0);

*Is there a known issue on Samsung S (2.1), because I don't have this
problem with HTC Desire (2.1) ?

Is it related to:
6558 <http://code.google.com/p/android/issues/detail?id=6558>: Camera API
lacks a way to set orientation to portrait
9901 <http://code.google.com/p/android/issues/detail?id=9901>: Camera
preview only works in landscape


Cyril

____________________
*Part of source code:

*/**
 *
 */
public class ARPreviewer extends SurfaceView implements
SurfaceHolder.Callback{
    private SurfaceHolder mHolder;
    private int mpreview_width, mpreview_height; // requested frame size
    private byte[] mybuffer=null;
    ARCameraPreviewer myCameraPreviewer;


    public ARPreviewer(Context context, int preview_width, int
preview_height){
        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);

        mpreview_width = preview_width;
        mpreview_height = preview_height;

        setZOrderMediaOverlay(false);

        myCameraPreviewer = new ARCameraPreviewer(this);
    }


    public void surfaceCreated(SurfaceHolder holder) {
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        myCameraPreviewer.release();
    }


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

        if (mybuffer == null){ //don't restart camera when screen
orientation changed
            try {
                myCameraPreviewer.initCamera(holder, mpreview_width,
mpreview_height);
            } catch (InterruptedException e) {
                e.printStackTrace();
                return;
            }

            int bufSize = myCameraPreviewer.getBufferSize();
            mybuffer = new byte[bufSize];

            myCameraPreviewer.addCallbackBuffer(mybuffer);
            myCameraPreviewer.startPreview();
        }

        /*
        [...]
        */
    }

/**
 *
 */
public class ARCameraPreviewer implements Camera.PreviewCallback,
Camera.ErrorCallback{
    private Method mAcb;
    private Method mPCWB;
    private Camera mCamera;
    private ARPreviewer myPreviewer;
    private int pixelformat;

    ARCameraPreviewer(ARPreviewer Previewer){
        myPreviewer = Previewer;
    }

    void initCamera(SurfaceHolder holder, int preview_width, int
preview_height) throws InterruptedException{
        if(mCamera == null){
            // The Surface has been created, acquire the camera and tell it
where
            // to draw.
            int i = 0;
            while(i++ < 5){
                try{
                    mCamera = Camera.open();
                    break;
                }catch(RuntimeException e){
                    Thread.sleep(200);
                }
            }
            try {
                mCamera.setPreviewDisplay(holder);
            } catch (IOException exception) {
                mCamera.release();
                mCamera = null;

            }catch(RuntimeException e){
                Log.e("camera", "stacktrace", e);
            }
        }

        // Camera configuration
        if(mCamera != null){
            parameters.setPreviewSize(preview_width, preview_height);
            mCamera.setParameters(parameters);
        }

        //init setPreviewCallbackWithBuffer
        try {
            mPCWB = Class.forName("android.hardware.Camera").getMethod(
                    "setPreviewCallbackWithBuffer", PreviewCallback.class);
        } catch (Exception e) {
            Log.e("CameraView",
                    "Problem setting up for setPreviewCallbackWithBuffer: "
                            + e.toString());
        }

        //init addCallbackBuffer
        try {
            mAcb = Class.forName("android.hardware.Camera").getMethod(
                    "addCallbackBuffer", byte[].class);
        } catch (Exception e) {
            Log.e("CameraView", "Problem setting up for addCallbackBuffer:
"+ e.toString());
        }
    }


    void release(){
        if(mCamera !=null){
            mCamera.stopPreview();
            mCamera.release();
        }

        clearPreviewCallbackWithBuffer();
        mCamera = null;
        mAcb = null;
        mPCWB = null;
    }

    /**
     * Camera callback, call after a frame request
     */
    @Override
    public void onPreviewFrame(byte[] data, Camera camera) {
        // Forward frame to previewer
        myPreviewer.onPreviewFrame(data, pixelformat);
    }


    public void addCallbackBuffer(byte[] b) {
        try {
            mAcb.invoke(mCamera, b);
        } catch (Exception e) {
            Log.e("CameraView", "invoking addCallbackBuffer failed: "+
e.toString());
        }
    }


    /**
     * Tell the camera driver to use a preview callback with buffer
     */
    private void setPreviewCallbackWithBuffer() {
        try {
            mPCWB.invoke(mCamera, this);
        } catch (Exception e) {
            Log.e("CameraView", e.toString());
        }
    }

    protected void clearPreviewCallbackWithBuffer() {
        try {
            mPCWB.invoke(mCamera, (PreviewCallback) null);
        } catch (Exception e) {
            Log.e("CameraView", e.toString());
        }
    }

    public void startPreview(){
        setPreviewCallbackWithBuffer();
        mCamera.startPreview();
    }


    /**
     * Call by preview to know the size of frame buffer
     * @return frame buffer size
     */
    public int getBufferSize(){
        // define buffer size
        PixelFormat pixelinfo = new PixelFormat();
        pixelformat = mCamera.getParameters().getPreviewFormat();
        PixelFormat.getPixelFormatInfo(pixelformat, pixelinfo);

        Size preview_size = mCamera.getParameters().getPreviewSize();

        return preview_size.width * preview_size.height *
pixelinfo.bitsPerPixel / 8;
    }
/*
    [...]
*/
}

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to