Android调用相机拍照旋转实现指南

作为一名经验丰富的开发者,我将指导你如何在Android应用中实现调用相机拍照并旋转照片的功能。本文将以表格和代码的形式详细介绍每个步骤,帮助你完成这一任务。

整体流程

以下是实现Android调用相机拍照旋转的流程:

journey
    title Android调用相机拍照旋转流程

    section 步骤
      开始 --> 启动相机 --> 拍照 --> 获取照片 --> 旋转照片 --> 保存照片 --> 结束

步骤和代码实现

步骤1: 开始

这一步是初始化步骤,你需要确保你的Android项目已经配置好了相机权限。

步骤2: 启动相机

在你的Activity中,你可以使用以下代码启动相机:

private static final int CAMERA_REQUEST_CODE = 1;

private void startCamera() {
    Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(cameraIntent, CAMERA_REQUEST_CODE);
}

这段代码创建了一个启动相机的Intent,并通过startActivityForResult方法启动相机界面。CAMERA_REQUEST_CODE是用于标识相机请求的一个常量值,以便在接收到照片后可以处理。

步骤3: 拍照

当相机界面启动后,用户可以拍照。相机应用会在拍照完成后将照片返回给你的Activity。

步骤4: 获取照片

在你的Activity中,你需要重写onActivityResult方法来获取相机返回的照片。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == CAMERA_REQUEST_CODE && resultCode == RESULT_OK) {
        Bitmap photo = (Bitmap) data.getExtras().get("data");
        // 在这里处理照片
    }
}

上述代码中,我们首先检查请求码和结果码是否匹配。然后,我们可以通过data.getExtras().get("data")获取到拍摄的照片,将其存储在Bitmap对象中。

步骤5: 旋转照片

有些设备会在拍摄完成后自动旋转照片,为了保证照片的正确方向,我们需要对照片进行旋转处理。

private Bitmap rotatePhoto(Bitmap photo) {
    // 获取照片的角度信息
    ExifInterface exifInterface;
    try {
        exifInterface = new ExifInterface(photoPath);
    } catch (IOException e) {
        e.printStackTrace();
        return photo;
    }
    int orientation = exifInterface.getAttributeInt(
            ExifInterface.TAG_ORIENTATION,
            ExifInterface.ORIENTATION_UNDEFINED);

    // 根据角度旋转照片
    Matrix matrix = new Matrix();
    switch (orientation) {
        case ExifInterface.ORIENTATION_ROTATE_90:
            matrix.setRotate(90);
            break;
        case ExifInterface.ORIENTATION_ROTATE_180:
            matrix.setRotate(180);
            break;
        case ExifInterface.ORIENTATION_ROTATE_270:
            matrix.setRotate(270);
            break;
        default:
            return photo;
    }

    // 返回旋转后的照片
    return Bitmap.createBitmap(photo, 0, 0, photo.getWidth(), photo.getHeight(), matrix, true);
}

在上述代码中,我们首先通过ExifInterface类获取照片的角度信息。然后,根据角度信息使用Matrix对象旋转照片。最后,通过Bitmap.createBitmap方法创建一个旋转后的照片,并返回。

步骤6: 保存照片

最后,我们需要将旋转后的照片保存到设备文件系统中。

private String savePhoto(Bitmap photo) {
    String photoPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/photo.jpg";
    try {
        FileOutputStream fos = new FileOutputStream(photoPath);
        photo.compress(Bitmap.CompressFormat.JPEG, 100, fos);
        fos.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return photoPath;
}