如何在拍摄照片时获取设备方向

时间:2017-10-12 22:09:53

标签: android camera rotation exif

我从来没有像现在这样在图像上苦苦挣扎,我很感激一些帮助:D
所以,事情是,我使用内置摄像头捕获图片,然后将其发送到后端以保存它,但是Kit katSamsung的方向混乱了设备。我尝试使用每个人都建议的exif界面,但我无法获得照片方向 几分钟前我发现了一个与此有些相关的答案,说可能一个好的解决方案是在拍照时保存设备方向,这听起来很不错,但是,我不知道如何做到这一点内置摄像头,因为用Intent打开相机时我无法完全控制,如下所示:

mPathToTakenImage = ImageProvider.getUriForFile(this, BuildConfig.APPLICATION_ID + ".provider",
            newFile);

    openCamera.putExtra(MediaStore.EXTRA_OUTPUT, mPathToTakenImage);
    openCamera.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

    startActivityForResult(openCamera, AlgebraNationConstants.TAKE_PHOTO_REQUEST_CODE);

那么,如何在拍摄图像时获取设备方向以正确旋转图像? 这是旋转图像的代码,但是,我总是为零:

        final Bitmap finalImg;
        final StringBuilder base64Image = new StringBuilder("data:image/jpeg;base64,");

        final ExifInterface exifInterface;

        try {
            final String imagePath = params[0].getPath();

            exifInterface = new ExifInterface(imagePath);

            final int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION,
                    ExifInterface.ORIENTATION_UNDEFINED);

            final Bitmap takenPhoto = MediaStore.Images.Media.getBitmap(mRelatedContext.getContentResolver(),
                    params[0]);

            if (null == takenPhoto) {
                base64Image.setLength(0);
            } else {
                finalImg = rotateBitmap(takenPhoto, orientation);

                if (null == finalImg) {
                    base64Image.setLength(0);
                } else {
                    final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
                    finalImg.compress(Bitmap.CompressFormat.JPEG, 75, byteArrayOutputStream);
                    final byte[] byteArray = byteArrayOutputStream.toByteArray();
                    base64Image.append(Base64.encodeToString(byteArray, Base64.DEFAULT));
                }
            }

        } catch (IOException e) {
            e.printStackTrace();
        }

        return base64Image.length() == 0 ? null : base64Image.toString();

我对此感到疯狂,任何帮助都将深受赞赏。

修改
<code>exiftool</code> data from the picture I'm using, which is in landscape mode

2 个答案:

答案 0 :(得分:0)

targetSandboxVersion="2"不是文件。除非Uri的方案是Uri,否则file毫无意义。在您的情况下,该计划主要是getPath(),而不是content。就目前而言,您没有获得EXIF标头,因为file无法找到该文件。

使用ExifInterfaceContentResolveropenInputStream()标识的内容上打开InputStream。将Uri传递给the android.support.media.ExifInterface constructor

此外,请记住,您将使用InputStream大部分时间崩溃,因为您将没有堆空间来容纳base64编码的照片。

答案 1 :(得分:0)

所以,我最终使用这两个答案解决了我的问题:

https://stackoverflow.com/a/17426328

https://stackoverflow.com/a/40865982

一般来说,问题是由于磁盘中的图像分配,因为我不知道为什么Android不喜欢我自己的路径来保存拍摄的图像。最后,打开相机的Intent看起来像这样:
final Intent openCamera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(openCamera, AlgebraNationConstants.TAKE_PHOTO_REQUEST_CODE);

Android本身正在解决放置图像的位置。尽管如此,@ CommonsWare感谢您的启发和答案。