Android - 相机预览是横向的

标签 android camera orientation preview portrait

我正在使用预览来显示相机在屏幕上看到的内容。

我可以让一切正常工作,创建表面,设置表面并显示表面。

但在纵向模式下,它总是以错误的 90 度角显示图片。

如图:

alt text

我知道使用下面的代码会使图片变得清晰:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

但是,我在一个包含其他元素的 Activity 中有预览,并且我的 Activity 以横向模式显示是没有意义的。 (默认关闭)

所以我想知道有没有办法改变预览的方向?并让我的 Activity 的其余部分以纵向模式正确显示?

或者无论如何要旋转预览以使其正确显示?

最佳答案

这个问题一开始似乎是某些硬件的错误 see here但可以通过调用 API 8 中提供的 mCamera.setDisplayOrientation(degrees) 来克服。所以这就是我实现它的方式:

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {            
    if (isPreviewRunning) {
        mCamera.stopPreview();
    }

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

    if(display.getRotation() == Surface.ROTATION_0) {
        parameters.setPreviewSize(height, width);                           
        mCamera.setDisplayOrientation(90);
    }

    if(display.getRotation() == Surface.ROTATION_90) {
        parameters.setPreviewSize(width, height);                           
    }

    if(display.getRotation() == Surface.ROTATION_180) {
        parameters.setPreviewSize(height, width);               
    }

    if(display.getRotation() == Surface.ROTATION_270) {
        parameters.setPreviewSize(width, height);
        mCamera.setDisplayOrientation(180);
    }

    mCamera.setParameters(parameters);
    previewCamera();                      
}

And the previewCamera method :

public void previewCamera() {        
    try {           
        mCamera.setPreviewDisplay(mSurfaceHolder);          
        mCamera.startPreview();
        isPreviewRunning = true;
    } catch(Exception e) {
        Log.d(APP_CLASS, "Cannot start preview", e);    
    }
}

这是在 HTC Desire 上,我最初必须在每个轮换检查中放入日志语句以说明轮换是什么,然后在设备上进行调试并在我旋转设备时观察 logCat 输出。对于 HTC Desire,0 是您所期望的手机(纵向),90 度是将手机逆时针旋转 90 度(我以为它会是顺时针方向)。在代码中,您会看到当手机处于 90 度或 180 度时,我不需要进行任何显示旋转 - 设备似乎可以自行处理。只有一点不能正常工作: 270 度旋转是当您将设备顺时针旋转 90 度时,显示屏旋转计数器正常,但如果您将设备逆时针旋转 270 度,它似乎无法正确补偿。

附:注意在适当的旋转中宽度和高度的交换。

关于Android - 相机预览是横向的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3841122/

相关文章:

Android 同时运行 Wifi Lan 和 Wifi Direct

iPhone SDK - 如何禁用 UIImagePickerController 中的图片预览?

iphone - 使用检查设备方向的方法获取警告

iphone - 一个 View Controller ios 的强制景观

java - ImageView旋转+填屏

java - Room DAO 无法从数据库检索数据

android - 寻找在 android 中使用 get() 和 AsyncTask 的好例子

ios - 有没有一种方法可以在不请求相机权限的情况下创建一个简单的 iOS 相机实例? ( swift 5.1)

android - 打开 fragment 内的相机

android - PhoneGap/Android 中的屏幕方向