Android 如何显示前置摄像头(仅适用于镜像)

标签 android kotlin android-camera android-permissions

我想在仅用于镜子的布局中显示前置摄像头,我只想要那个,并且我可能在摄像头布局上有几个简单的按钮。 注意:我不想拍照或任何东西。只想展示镜子的前置摄像头。 有没有最好的方法来实现它。 我曾经尝试过下面的代码,但相机显示错误的旋转,类似于横向模式,图像被拉伸(stretch)。

    surfaceView.holder.addCallback(object : SurfaceHolder.Callback {
            private var mCamera:Camera? = null
            override fun surfaceDestroyed(holder: SurfaceHolder) {
                mCamera?.stopPreview()
                mCamera?.release()
                mCamera = null
            }

            override fun surfaceCreated(holder: SurfaceHolder) {
                mCamera = getCameraInstance()

                try {
                    mCamera?.setPreviewDisplay(holder)
                } catch (exception: IOException) {
                    mCamera?.release()
                    mCamera = null
                }

            }

            override fun surfaceChanged(holder: SurfaceHolder, format: Int, width: Int,
                                        height: Int) {
                mCamera?.startPreview()
            }
        })

fun getCameraInstance(): Camera? {
        var c: Camera? = null
        try {
            c = openFrontFacingCamera()
        } catch (e: Exception) {
        }

        return c
    }

    private fun openFrontFacingCamera(): Camera? {
        var cameraCount = 0
        var cam: Camera? = null
        val cameraInfo = Camera.CameraInfo()
        cameraCount = Camera.getNumberOfCameras()
        for (camIdx in 0 until cameraCount) {
            Camera.getCameraInfo(camIdx, cameraInfo)
            if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
                try {
                    cam = Camera.open(camIdx)
                } catch (e: RuntimeException) {
//                    Log.e(FragmentActivity.TAG, "Camera failed to open: " + e.localizedMessage)
                }

            }
        }

        return cam
    }

最佳答案

以下代码 fragment 有助于打开前置摄像头

private Camera openFrontFacingCamera() {
    int cameraCount = 0;
    Camera cam = null;
    Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
    cameraCount = Camera.getNumberOfCameras();
    for (int camIdx = 0; camIdx<cameraCount; camIdx++) {
        Camera.getCameraInfo(camIdx, cameraInfo);
        if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
            try {
                cam = Camera.open(camIdx);
            } catch (RuntimeException e) {
                Log.e("Your_TAG", "Camera failed to open: " + e.getLocalizedMessage());
            }
        }
    }
    return cam; }

setDisplayOrientation()

方法可用于旋转相机 View 。试试下面的代码 fragment 来管理相机方向。

int rotation = activity.getWindowManager().getDefaultDisplay().getRotation();
   int degrees = 0;

   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 (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
       result = (info.orientation + degrees) % 360;
       result = (360 - result) % 360;  // compensate the mirror
   } else {  // back-facing
       result = (info.orientation - degrees + 360) % 360;
   }
   camera.setDisplayOrientation(result);

关于Android 如何显示前置摄像头(仅适用于镜像),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53477653/

相关文章:

java - 如何在日历中显示两位数?

android - 改造响应在 Android 中返回 null

android - 使用字节数组读入文件,然后显示在ImageView (Android)

java - 在 Android 应用程序的改造实现中访问 kotlin 类自动生成的 getter 方法

Android Studio 实时模板

android - 缓冲区的像素不够大

generics - 如何处理从 Java 迁移到 Kotlin 的通用边界?

android - 相机表面 View 图像看起来被拉伸(stretch)

Android Systemproperties.set 不起作用

android - 在 QRcodeScanner React Native 中打开/关闭手电筒 - 替代解决方案