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 [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en