Android – 相机预览横向

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

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

但是,纵向模式下,它总是以不正确的90度angular显示图像。

如图中所示:

替代文字

我知道使用下面的代码将直接设置图片:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 

不过,我在“活动”中预览了其中包含其他元素的“预览”,而且我的“活动”无法在横向模式下显示。 (默认禁用)

所以我想知道有没有改变预览的方向? 并在肖像模式下正确显示我的活动的其余部分?

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

这个问题似乎开始作为一个错误,某些硬件在这里看到,但可以通过调用API 8中提供的mCamera.setDisplayOrientation(度)来克服。所以这是我如何实现它:

 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(); } 

和previewCamera方法:

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

这是在HTC Desire上,我不得不最初在每个旋转检查中放入日志语句,以说明什么是旋转,然后在设备上进行debugging,并在旋转设备时观看logCat输出。 对于HTC Desire来说,0就是你所期望的(肖像)手机,90度手机是90度逆时针旋转(我假设它是顺时针的)。 在代码中,当手机处于90度或180度时,我不需要做任何显示旋转 – 设备似乎自己处理这个问题。 只有一点不能正常工作:270度旋转是当你顺时针旋转设备90度,显示器旋转计数器正常,但是如果你逆时针旋转设备270度,它似乎不能正确补偿。

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

尝试设置显示方向。 它解决了我的问题。

  mCamera.setDisplayOrientation(90); 
  public void surfaceCreated(SurfaceHolder holder) { mCamera = Camera.open(); mCamera.setDisplayOrientation(90); try { mCamera.setPreviewDisplay(holder); mCamera.setPreviewCallback(new PreviewCallback() { @Override public void onPreviewFrame(byte[] data, Camera camera) { } }); } catch (Exception e) { e.printStackTrace(); } } 

试试这个代码

我做了mCamera.setDisplayOrientation(90)的build议; 但也旋转位图,因为某些原因其他方法不适合我在版本2.3.3。

为了旋转位图,我这样做了:

 Matrix matrix = new Matrix(); matrix.postRotate(90); imageView1 = new ImageView(this); Bitmap bitmap = BitmapFactory.decodeFile(files[i].getAbsolutePath()); Bitmap rotatedBitmap = Bitmap.createBitmap(bitmap , 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); Bitmap scaledBitmap = Bitmap.createScaledBitmap(rotatedBitmap, 80, 80, true); imageView1.setImageBitmap(scaledBitmap); 

我已经将我的代码与教程进行了比较,最终解决了将以下代码放入我的AndroidManifext.xml中:在<activity>标记中:

 android:screenOrientation="landscape" android:configChanges="keyboardHidden|orientation"> 

我有前面的相机问题(颠倒的问题)。 然后我用这个方法

 public void setCameraDisplayOrientation(Activity activity , int icameraId , Camera camera1s) { CameraInfo cameraInfo = new CameraInfo(); Camera.getCameraInfo(icameraId, cameraInfo); int rotation = activity.getWindowManager().getDefaultDisplay().getRotation(); int degrees = 0; // k switch (rotation) { case Surface.ROTATION_0: degrees = 0; break; case Surface.ROTATION_90: degrees = 90; break; case Surface.ROTATION_180: degrees = 180; break; case Surface.ROTATION_270: degrees = 270; break; } int result; if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { // cameraType=CAMERATYPE.FRONT; result = (cameraInfo.orientation + degrees) % 360; result = (360 - result) % 360; // compensate the mirror } else { // back-facing result = (cameraInfo.orientation - degrees + 360) % 360; } // displayRotate=result; camera.setDisplayOrientation(result); } 
 public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { // If your preview can change or rotate, take care of those events here. // Make sure to stop the preview before resizing or reformatting it. if (mHolder.getSurface() == null) { // preview surface does not exist return; } try { mCamera.stopPreview(); } catch (Exception e) { e.printStackTrace(); } Camera.Parameters parameters = mCamera.getParameters(); Display display = ((WindowManager) getContext().getSystemService(WINDOW_SERVICE)).getDefaultDisplay(); if (display.getRotation() == Surface.ROTATION_0) { parameters.setPreviewSize(h, w); mCamera.setDisplayOrientation(90); } if (display.getRotation() == Surface.ROTATION_90) { parameters.setPreviewSize(w, h); mCamera.setDisplayOrientation(0); } if (display.getRotation() == Surface.ROTATION_180) { parameters.setPreviewSize(h, w); mCamera.setDisplayOrientation(270); } if (display.getRotation() == Surface.ROTATION_270) { parameters.setPreviewSize(w, h); mCamera.setDisplayOrientation(180); } previewCamera(); } public void previewCamera() { try { mCamera.setPreviewDisplay(mHolder); mCamera.startPreview(); } catch (Exception e) { //Log.d(APP_CLASS, "Cannot start preview", e); e.printStackTrace(); } } 

这条线为我工作完美

  static { ORIENTATIONS.append(Surface.ROTATION_0, 90); ORIENTATIONS.append(Surface.ROTATION_90, 180); ORIENTATIONS.append(Surface.ROTATION_180, 270); ORIENTATIONS.append(Surface.ROTATION_270, 360); }