为什么未检测到前置摄像头(CAMERA_FACING_FRONT)?

时间:2018-07-05 16:00:12

标签: android android-camera

我正在尝试使用前置摄像头(自拍照)和后置摄像头获取图片并将其保存到imageview。当我尝试使用前置摄像头(自拍照)拍摄照片时,图像会上下颠倒(垂直),而当使用后置摄像头时,图像会水平翻转。

我正在尝试使用“ camInfo.face ==(Camera.CameraInfo.CAMERA_FACING_FRONT”和“ camInfo.face ==(Camera.CameraInfo.CAMERA_FACING_BACK”)来检测摄像机的使用情况,但仅使用“ camInfo.face ==(Camera .CameraInfo.CAMERA_FACING_BACK”正在工作。我希望可以稍作调整以使其正常工作。

不知道如何进行。帮助非常可观。

compileSdkVersion 28
    defaultConfig {
        applicationId "com.austurn.keikonew.keiko"
        minSdkVersion 19
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"



 @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data){

        try {
                if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
                    Uri uri = photoURI;
                    Bitmap myImg = BitmapFactory.decodeFile(photoFile.getAbsolutePath());
                    Matrix matrix = new Matrix();
                    int width = myImg.getWidth();
                    int height=myImg.getHeight();
                    Camera cam = null;
                    Camera.CameraInfo cameraInfo = new Camera.CameraInfo();

                        Camera.CameraInfo camInfo = new Camera.CameraInfo();

                        if (camInfo.facing ==(Camera.CameraInfo.CAMERA_FACING_FRONT)) {
                            matrix.postRotate(90);
                            Toast.makeText(this.getActivity(), "Front camera", Toast.LENGTH_LONG).show();
                             }

                        if (camInfo.facing ==(Camera.CameraInfo.CAMERA_FACING_BACK)) {
                            Toast.makeText(this.getActivity(), "back camera", Toast.LENGTH_LONG).show();
                            float[] mirrorY = { -1, 0, 0, 0, 1, 0, 0, 0, 1};
                            Matrix matrixMirrorY = new Matrix();
                            matrixMirrorY.setValues(mirrorY);
                            matrix.postConcat(matrixMirrorY);
                            matrix.postRotate(270);
                        }

                    Bitmap bitPicFinal = Bitmap.createBitmap(myImg, 0, 0, width, height,matrix, true);
                    myImg.recycle();
                    int desWidth;
                    int desHeight;
                    desWidth = bitPicFinal.getWidth();
                    desHeight = desWidth;
                    Bitmap croppedBitmap = Bitmap.createBitmap(bitPicFinal, 0,bitPicFinal.getHeight() / 2 - bitPicFinal.getWidth() / 2,desWidth, desHeight);
                    croppedBitmap = Bitmap.createScaledBitmap(croppedBitmap, 528, 528, true);
                    camview.setImageBitmap(croppedBitmap);
                }
        }catch(Exception e){
            Toast.makeText("Something went wrong", Toast.LENGTH_LONG).show();
        }
    }
}

2 个答案:

答案 0 :(得分:0)

您正在创建Camera.CameraInfo的新实例,该实例实际上并不引用用于捕获照片的相机。 您应该使用捕获文件中包含的exif元数据,请尝试此处描述的解决方案:

Why does an image captured using camera intent gets rotated on some devices on Android?

答案 1 :(得分:0)

Camera.CameraInfo()默认构造函数没有说明您使用的实际设备。应该使用Camera#getCameraInfo()静态方法填充此对象。然后,您将知道索引1处的摄像头设备是面向后还是面向前,并且还具有该设备的 hardware 方向,这可以帮助通过Camera API调整此摄像头拍摄的图像。

此方向信息与通过ACTION_IMAGE_CAPTURE意向接收的图像无关,因为“相机”应用可能会选择旋转或不旋转Jpeg,然后再将其存储到MediaStore。

在大多数设备上,存储的图像的EXIF会带有前置或后置摄像头的指示,但是有no officially documented way可以确定。

请注意,EXIF方向"0"并不表示“人像”,它表示Jpeg以自然方式存储,并且无需调整方向即可显示。如果您获得的图像的方向是"0",且宽度<高度,则为纵向;如果您获得的图像的方向为"0",且宽度>高度,则为横向。