繁体   English   中英

SurfaceView中人像的Android相机

[英]Android Camera in Portrait on SurfaceView

我尝试了几种方法来尝试使照相机预览以纵向显示在SurfaceView 没事。 我正在测试具有2.0.1的Droid。 我试过了:

1)通过以下方式强制使布局为纵向: this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

2)使用

Camera.Parameters parameters = camera.getParameters();
parameters.set("orientation", "portrait");
parameters.setRotation(90);
camera.setParameters(parameters);

还有什么我可以尝试的吗? 如果这是Android或手机中的错误,我该如何确定情况如此,以便我有证据通知客户?

谢谢,Prasanna

从API lvl 8开始,此功能可用:

公共最终空白setDisplayOrientation(以度为单位)

即与清单中的肖像:

public void surfaceCreated(SurfaceHolder holder) {
    mCamera = Camera.open();
    mCamera.setDisplayOrientation(90);

我有一个工作在2.1(在Desire上测试)下的肖像模式的可行解决方案。

活动屏幕方向设置为纵向。 (android:screenOrientation =“ portrait”)

相机参数:

Camera.Parameters p = mCamera.getParameters();

 p.set("jpeg-quality", 100);
 p.set("orientation", "landscape");
 p.set("rotation", 90);
 p.setPictureFormat(PixelFormat.JPEG);
 p.setPreviewSize(h, w);// here w h are reversed
 mCamera.setParameters(p);

并且图像将是纵向的。

用于相机的SurfaceHolder必须具有与手机预览尺寸(通常为屏幕分辨率)兼容的尺寸。

有趣的Desire 2.2无法运作...这里是解决方法:

   At surfaceCreated(..) or when you have this line
camera = Camera.open();
       add
camera.setDisplayOrientation(90);//only 2.2>

Camera.Parameters p = camera.getParameters();
    p.set("jpeg-quality", 100);
p.setRotation(90);
p.setPictureFormat(PixelFormat.JPEG);
p.setPreviewSize(h, w);
camera.setParameters(p);

您可以尝试一下(适用于2.2或更低版本)。 在这里,我先旋转图像,然后再将其保存到SD卡中。 但这仅适用于肖像模式。 如果必须同时使用这两种模式,则应在拍摄图像之前检查相机方向并进行一些检查。

PictureCallback jpegCallback = new PictureCallback() {
   public void onPictureTaken(byte[] data, Camera camera) {
      FileOutputStream outStream = null;
      try {
        imageFilePath = getFilename();
        InputStream is = new ByteArrayInputStream(data);
        Bitmap bmp = BitmapFactory.decodeStream(is);
        // Getting width & height of the given image.
        if (bmp != null){
           int w = bmp.getWidth();
           int h = bmp.getHeight();
           // Setting post rotate to 90
           Matrix mtx = new Matrix();
           mtx.postRotate(90);
           // Rotating Bitmap
           Bitmap rotatedBMP = Bitmap.createBitmap(bmp, 0, 0, w, h, mtx, true);
           ByteArrayOutputStream stream = new ByteArrayOutputStream();
           rotatedBMP.compress(Bitmap.CompressFormat.PNG, 100, stream);
           byte[] byteArray = stream.toByteArray(); 
           outStream = new FileOutputStream
                              (String.format(imageFilePath,System.currentTimeMillis()));
           outStream.write(byteArray);
           outStream.close();
        } else {
           outStream = new FileOutputStream
                              (String.format(imageFilePath,System.currentTimeMillis()));
           outStream.write(data);
           outStream.close();           
        }       

        preview.camera.startPreview();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
    }
  }
};

在许多当前设备(包括G1和Droid)上都无法做到这一点。 在这里查看相关的错误报告:

另请参阅此处的一位Android工程师(Dave)的评论:

Roman给出的问题线程链接具有我现在正在使用的可行解决方案。

在此处找到它: http : //code.google.com/p/android/issues/detail?id=1193#c26

除非您需要明确地进行设置,否则无需为定向设置任何参数。 默认情况下,它支持此功能。 就我而言,我有一个“活动”,而在该活动之上,我有一个摄影机视图,因此我没有为摄影机属性设置任何方向,而是为该活动在Manifest文件中将其方向设置为纵向。 现在,该应用程序看起来很好用。 可能会对某些人有所帮助。

谢谢。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM