2012-11-03 63 views
2

我开发了一款基于相机的应用程序。它运行良好,但与Android 4.0相机和索尼Xperia Sola OS有一个问题。Android中的相机预览

问题是以下几点:

当我从我的应用程序相机预览启动相机显示半屏索尼XPERIA索拉设备和其他设备HTC,三星就在全屏工作不错。

对于相机预览我用SurfaceView类。而在SurfaceChanged()方法我用下面的代码

Parameters parameters = mCamera.getParameters(); 
Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay(); 

    if(display.getRotation() == Surface.ROTATION_0) 
    { 

     System.out.println("Preview Height : " + h); 
     System.out.println("Preview Width : " + w); 

     parameters.setPreviewSize(h, w);       
     mCamera.setDisplayOrientation(90); 
    } 

请帮我找到一个解决方案。

+0

我对这个解决方案可以在[http://stackoverflow.com/questions/13428797找到/camera-camera-preview-is-not-proper-after-setdisplayorientation-in-android](http://stackoverflow.com/questions/13428797/camera-camera-preview-is-not-proper-after-setdisplayorientation-在-机器人)。 –

回答

0

我很好奇,当你运行你的应用程序是什么高度和宽度的打印输出提供。我实现了一个简单的SurfaceView类并使用你的代码。的宽度和高度通过的logcat报道是

I /的System.out(4706):预览宽度:480

I /的System.out(4706):预览高度:744

这与SurfaceView跨越的区域相当一致。

小组代码,我用这个:

public class Panel extends SurfaceView implements SurfaceHolder.Callback { 
    private Camera mCamera; 
    private Context mContext; 

    public Panel(Context context) { 
     super(context); 
     mContext = context; 
     getHolder().addCallback(this); 
    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     try { 
      mCamera = Camera.open(); 
      mCamera.setPreviewDisplay(getHolder()); 
     } catch (IOException ioe) { 
      ioe.printStackTrace(); 
     } 

    } 

    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
     Parameters parameters = mCamera.getParameters(); 

     Display display = ((WindowManager) mContext.getSystemService(android.content.Context.WINDOW_SERVICE)).getDefaultDisplay(); 

     if (display.getRotation() == Surface.ROTATION_0) { 

      System.out.println("Preview Width : " + width); 
      System.out.println("Preview Height : " + height); 

      parameters.setPreviewSize(width, height); 
      mCamera.setDisplayOrientation(90); 
     } 
    } 


    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     mCamera.stopPreview(); 
     mCamera.release(); 
     mCamera = null; 
    } 

} 

请提供一些更多的细节,我会尽力,如果需要进一步调查。

我上的Xperia索拉运行与4.0.4。如果您可以为我提供设备的内部版本号,这也会有所帮助。

+0

关于这个的任何消息? – Perty

+0

我已经提出了与内部工作人员,并等待回应。 –

+0

我已经与一位应该能够协助和/或评论这一整天的人联系。我将返回结果。 –

0

在这里,我们遇到同样的问题,我用你上面的代码,看看它是如何工作的,以及它看起来像旋转中心位移,从而旋转90度时的画像它只是显示视图的约10-20% 。

现在看来似乎是:

mCamera.setDisplayOrientation(90); 

这会导致问题。

这是可再现上:

  • 索尼XPERIA ST25i,采用Android 4.0.4版本(版本:6.1.1.B.1.54)
  • 索尼XPERIA独奏MT27i,采用Android 4.0.4(建设:6.1.1.B.1.54)

这里是相机参数,如果它们包含的任何信息:

01-22 16:04:01.015: D/CameraTest(1336): Haz camera: true 
01-22 16:04:01.095: D/TextLayoutCache(1336): Using debug level: 0 - Debug Enabled: 0 
01-22 16:04:01.425: D/libEGL(1336): loaded /system/lib/egl/libGLES_android.so 
01-22 16:04:01.505: D/libEGL(1336): loaded /system/lib/egl/libEGL_mali.so 
01-22 16:04:01.535: D/libEGL(1336): loaded /system/lib/egl/libGLESv1_CM_mali.so 
01-22 16:04:01.545: D/libEGL(1336): loaded /system/lib/egl/libGLESv2_mali.so 
01-22 16:04:01.725: D/OpenGLRenderer(1336): Enabling debug mode 0 
01-22 16:04:02.987: D/CameraTest(1336): preferred-preview-size-for-video=864x480 
01-22 16:04:02.987: D/CameraTest(1336): zoom=0 
01-22 16:04:02.987: D/CameraTest(1336): recording-hint=false 
01-22 16:04:02.987: D/CameraTest(1336): max-num-detected-faces-hw=5 
01-22 16:04:02.987: D/CameraTest(1336): zoom-supported=true 
01-22 16:04:02.987: D/CameraTest(1336): whitebalance=auto 
01-22 16:04:02.987: D/CameraTest(1336): scene-mode=auto 
01-22 16:04:02.987: D/CameraTest(1336): jpeg-quality=85 
01-22 16:04:02.987: D/CameraTest(1336): preview-format-values=yuv420sp,yuv420p 
01-22 16:04:02.987: D/CameraTest(1336): jpeg-thumbnail-quality=100 
01-22 16:04:02.987: D/CameraTest(1336): preview-format=yuv420sp 
01-22 16:04:02.987: D/CameraTest(1336): video-size-values=1280x720,864x480,720x480,640x480,352x288,320x240,176x144 
01-22 16:04:02.987: D/CameraTest(1336): preview-size=640x480 
01-22 16:04:02.987: D/CameraTest(1336): focal-length=3.5 
01-22 16:04:02.987: D/CameraTest(1336): flash-mode-values=off,auto,on,red-eye,torch 
01-22 16:04:02.987: D/CameraTest(1336): preview-frame-rate-values=15,30 
01-22 16:04:02.987: D/CameraTest(1336): max-num-metering-areas=0 
01-22 16:04:02.987: D/CameraTest(1336): preview-frame-rate=30 
01-22 16:04:02.987: D/CameraTest(1336): focus-mode-values=auto,infinity,macro,fixed,continuous-picture,continuous-video 
01-22 16:04:02.987: D/CameraTest(1336): jpeg-thumbnail-width=160 
01-22 16:04:02.987: D/CameraTest(1336): video-size=1280x720 
01-22 16:04:02.987: D/CameraTest(1336): scene-mode-values=auto,portrait,landscape,night,night-portrait,beach,snow,sports,party,barcode 
01-22 16:04:02.987: D/CameraTest(1336): preview-fps-range-values=(1000,15000),(1000,30000) 
01-22 16:04:02.987: D/CameraTest(1336): jpeg-thumbnail-size-values=160x120,0x0 
01-22 16:04:02.987: D/CameraTest(1336): zoom-ratios=100,107,115,123,132,141,152,162,174,187,200,214,230,246,264,283,303,325,348,373,400,429,459,492,528,566,606,650,696,746,800 
01-22 16:04:02.987: D/CameraTest(1336): preview-size-values=864x480,720x480,640x480,480x320,352x288,320x240,176x144 
01-22 16:04:02.987: D/CameraTest(1336): picture-size-values=2592x1944,2560x1440,1632x1224,1920x1080,640x480,480x320,320x240 
01-22 16:04:02.987: D/CameraTest(1336): preview-fps-range=1000,30000 
01-22 16:04:02.987: D/CameraTest(1336): auto-whitebalance-lock=false 
01-22 16:04:02.987: D/CameraTest(1336): min-exposure-compensation=-6 
01-22 16:04:02.987: D/CameraTest(1336): antibanding=auto 
01-22 16:04:02.987: D/CameraTest(1336): max-num-focus-areas=1 
01-22 16:04:02.987: D/CameraTest(1336): vertical-view-angle=360 
01-22 16:04:02.987: D/CameraTest(1336): horizontal-view-angle=360 
01-22 16:04:02.987: D/CameraTest(1336): video-stabilization-supported=false 
01-22 16:04:02.987: D/CameraTest(1336): jpeg-thumbnail-height=120 
01-22 16:04:02.987: D/CameraTest(1336): smooth-zoom-supported=true 
01-22 16:04:02.987: D/CameraTest(1336): focus-mode=macro 
01-22 16:04:02.987: D/CameraTest(1336): auto-whitebalance-lock-supported=true 
01-22 16:04:02.987: D/CameraTest(1336): video-frame-format=yuv420mb 
01-22 16:04:02.987: D/CameraTest(1336): max-num-detected-faces-sw=5 
01-22 16:04:02.987: D/CameraTest(1336): picture-format-values=jpeg 
01-22 16:04:02.987: D/CameraTest(1336): max-exposure-compensation=6 
01-22 16:04:02.987: D/CameraTest(1336): focus-areas=(0,0,0,0,0) 
01-22 16:04:02.987: D/CameraTest(1336): video-snapshot-supported=false 
01-22 16:04:02.987: D/CameraTest(1336): exposure-compensation=0 
01-22 16:04:02.987: D/CameraTest(1336): exposure-compensation-step=0.333333 
01-22 16:04:02.987: D/CameraTest(1336): flash-mode=off 
01-22 16:04:02.987: D/CameraTest(1336): auto-exposure-lock=false 
01-22 16:04:02.987: D/CameraTest(1336): effect-values=none,mono,negative,solarize,sepia,posterize 
01-22 16:04:02.987: D/CameraTest(1336): picture-size=2592x1944 
01-22 16:04:02.987: D/CameraTest(1336): max-zoom=30 
01-22 16:04:02.987: D/CameraTest(1336): effect=none 
01-22 16:04:02.987: D/CameraTest(1336): whitebalance-values=auto,incandescent,fluorescent,daylight,cloudy-daylight 
01-22 16:04:02.987: D/CameraTest(1336): picture-format=jpeg 
01-22 16:04:02.987: D/CameraTest(1336): focus-distances=Infinity,Infinity,Infinity 
01-22 16:04:02.987: D/CameraTest(1336): auto-exposure-lock-supported=true 
01-22 16:04:02.987: D/CameraTest(1336): antibanding-values=auto,50hz,60hz,off 
01-22 16:04:03.037: D/CameraTest(1336): Rotation : 0 
01-22 16:04:03.037: D/CameraTest(1336): Preview Width : 480 
01-22 16:04:03.037: D/CameraTest(1336): Preview Height : 744 
01-22 16:04:03.057: D/CameraTest(1336): Supported FPS : [[1000, 15000], [1000, 30000]] 
+1

刚刚尝试过Xperia Function Tester,它有同样的问题: https://play.google.com/store/apps/details?id=com.sonymobile.androidapp.functiontester 当使用power +音量进行屏幕截图时它看起来不错。 – Perty

0

我已经证实该问题与相机软件有关。

不幸的是没有可用的解决方法。

唯一的解决方案将是未来的固件更新,其中包括解决相机问题。

0

我有同样的问题,在我的情况与索尼Experia还LT22I,当我与旋转

mCamera.setDisplayOrientation屏幕(90);

只显示约10-20%的视图。最后我找到了这款手机的解决方案(补丁)。只有丝毫改变距顶部(我不知道为什么)认为这个效果很好,是这样的:

String model = (Build.MANUFACTURER+Build.MODEL).toUpperCase(Locale.getDefault()); 
if (model.equals(Constants.MODEL_EXCEPTION)) { 
    final ViewGroup.MarginLayoutParams lpt =(MarginLayoutParams)  
    surfaceView.getLayoutParams(); 
    lpt.setMargins(0,-150,0,0); 
    surfaceView.setLayoutParams(lpt); 
}