Android的 - 相机预览横盘
-
27-09-2019 - |
题
我使用的是预览显示哪些相机在屏幕上看到的。
我可以得到一切工作正常,在表面上,表面组并显示表面。
然而,它总是显示画面在纵向模式的不正确的90度角。
如在图片:
据我所知,使用下面的代码将直设置图像:
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();
}
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欲望,我不得不最初放于登录在各旋转检查的陈述说什么转速为然后调试的设备上,并且观看了的logcat输出而我旋转的装置。对于HTC欲望,0是手机作为你会预期(纵向),90度转向了手机90度逆时针(我曾以为它会一直顺时针方向)。在代码中你会看到我并不需要做任何屏幕旋转的时候,手机在90度或180度 - 该设备似乎这个处理本身。只有一个点不能正常工作:270度旋转,当你打开设备顺时针旋转90度和显示旋转计数器,OK,但如果你旋转设备270度逆时针,它似乎并没有适当补偿它<。 / p>
P.S。请注意,在适当的旋转的宽度和高度的swapover。
其他提示
尝试设置的显示方向。它解决了我的问题。
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();
}
}
尝试此代码
我在和前摄像机(倒挂问题)中的问题。然后我用在的Android文档记录了以下方法 -
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);
}
我做到了服用mCamera.setDisplayOrientation的建议(90);而且旋转的位图,因为某种原因,人在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 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();
}
}