我正在捕获图像并将其设置为图像视图.

public void captureImage() {

    Intent intentCamera = new Intent("android.media.action.IMAGE_CAPTURE");
    File filePhoto = new File(Environment.getExternalStorageDirectory(), "Pic.jpg");
    imageUri = Uri.fromFile(filePhoto);
    MyApplicationGlobal.imageUri = imageUri.getPath();
    intentCamera.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
    startActivityForResult(intentCamera, TAKE_PICTURE);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intentFromCamera) {
    super.onActivityResult(requestCode, resultCode, intentFromCamera);

    if (resultCode == RESULT_OK && requestCode == TAKE_PICTURE) {

        if (intentFromCamera != null) {
            Bundle extras = intentFromCamera.getExtras();
            if (extras.containsKey("data")) {
                bitmap = (Bitmap) extras.get("data");
            }
            else {
                bitmap = getBitmapFromUri();
            }
        }
        else {
            bitmap = getBitmapFromUri();
        }
        // imageView.setImageBitmap(bitmap);
        imageView.setImageURI(imageUri);
    }
    else {
    }
}

public Bitmap getBitmapFromUri() {

    getContentResolver().notifyChange(imageUri, null);
    ContentResolver cr = getContentResolver();
    Bitmap bitmap;

    try {
        bitmap = android.provider.MediaStore.Images.Media.getBitmap(cr, imageUri);
        return bitmap;
    }
    catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

但问题是,有些设备上的图像每次旋转时.例如,在三星设备上,它运行良好,但在Sony Xperia上,图像旋转90度,在Toshiba Thrive(平板电脑)上旋转180度.

推荐答案

大多数手机摄像头都是横向的,这意味着如果你用纵向的方式拍摄照片,得到的照片会旋转90度.在这种情况下,相机软件应该用应该查看照片的方向填充Exif个数据.

请注意,以下解决方案取决于填充Exif数据的摄像头软件/设备制造商,因此它在大多数情况下都可以工作,但不是100%可靠的解决方案.

ExifInterface ei = new ExifInterface(photoPath);
int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION,
                                     ExifInterface.ORIENTATION_UNDEFINED);

Bitmap rotatedBitmap = null;
switch(orientation) {

    case ExifInterface.ORIENTATION_ROTATE_90:
        rotatedBitmap = rotateImage(bitmap, 90);
        break;

    case ExifInterface.ORIENTATION_ROTATE_180:
        rotatedBitmap = rotateImage(bitmap, 180);
        break;

    case ExifInterface.ORIENTATION_ROTATE_270:
        rotatedBitmap = rotateImage(bitmap, 270);
        break;

    case ExifInterface.ORIENTATION_NORMAL:
    default:
        rotatedBitmap = bitmap;
}

下面是rotateImage的方法:

public static Bitmap rotateImage(Bitmap source, float angle) {
    Matrix matrix = new Matrix();
    matrix.postRotate(angle);
    return Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(),
                               matrix, true);
}

Android相关问答推荐

在Android上使用XSLT文件转换XML文件

原因平滑滚动的滞后懒惰列在android jetpack compose

无法使用MenuItemColors.Copy()

MAP函数返回单位列表而不是字符列表

无法将Kotlin序列化添加到Android项目

在带有REACT-Native-CLI的开发和生产中使用Firebase的最佳实践

在androidStudio中,如何使用带有ResolutionStrategy的ResolutionSelector而不是setTargetResolve()?

如何修复Google Play市场中有关已删除广告库的错误消息?

当提供非状态对象时,compose 如何进行重组

Android Kotlin - 计费 - 从应用内购买获取productId

Camera2 将图像从 ImageReader 传递到 MediaRecorder

面向Jetpack Compose的可组合放置问题

将 React Native 应用程序背景带到前台

在Android RoomDB中使用Kotlin Flow和删除数据时如何解决错误?

Jetpack Compose UI - 在 AlertDialog 中单击时按钮宽度会发生变化

组成不重叠的元素

PayUCheckoutPro Android SDK 实现问题

TextField 溢出和软包装不适用于 Compose 约束布局

如何将文本组合放在行中,一个具有可变宽度的组合

如何将 Android Studio 与模拟器连接起来