Android11拍照后保存照片实现教程

介绍

在Android开发中,实现拍照并保存照片是一个常见的需求。本文将教会你如何在Android11上实现拍照后保存照片的功能。我们将按照以下步骤进行操作:

步骤 描述
步骤一 创建相机预览界面
步骤二 设备权限检查与请求
步骤三 拍照功能实现
步骤四 保存照片到设备

步骤一:创建相机预览界面

首先,我们需要创建一个相机预览界面,让用户能够看到拍摄的图像。这可以通过使用CameraViewTextureView来实现。在这里,我们选择使用TextureView

在XML布局文件中添加TextureView

<TextureView
    android:id="@+id/textureView"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

在Java代码中找到TextureView并进行初始化:

TextureView textureView = findViewById(R.id.textureView);

步骤二:设备权限检查与请求

在Android11及以上的版本中,我们需要动态请求相机权限。为了实现这一点,我们需要检查并请求相机权限。

首先,在AndroidManifest.xml文件中添加相机权限:

<uses-permission android:name="android.permission.CAMERA" />

然后,在Java代码中检查并请求相机权限:

private static final int REQUEST_CAMERA_PERMISSION = 200;

if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION);
} else {
    // 已经有相机权限,进行下一步操作
}

确保在onRequestPermissionsResult方法中处理权限请求的结果:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    if (requestCode == REQUEST_CAMERA_PERMISSION) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // 相机权限已授予,进行下一步操作
        } else {
            // 用户拒绝了相机权限请求,处理相应逻辑
        }
    }
}

步骤三:拍照功能实现

在这一步中,我们将实现拍照的功能。我们需要使用Camera类或者CameraX库来实现相机功能。

首先,获取相机设备:

CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
String cameraId = cameraManager.getCameraIdList()[0]; // 获取第一个相机设备

然后,配置相机的预览界面:

SurfaceTexture surfaceTexture = textureView.getSurfaceTexture();
surfaceTexture.setDefaultBufferSize(previewSize.getWidth(), previewSize.getHeight());
Surface surface = new Surface(surfaceTexture);

cameraManager.openCamera(cameraId, new CameraDevice.StateCallback() {
    @Override
    public void onOpened(@NonNull CameraDevice camera) {
        // 相机已打开,进行下一步操作
    }

    @Override
    public void onDisconnected(@NonNull CameraDevice camera) {
        // 相机连接断开,处理相应逻辑
    }

    @Override
    public void onError(@NonNull CameraDevice camera, int error) {
        // 相机打开错误,处理相应逻辑
    }
}, null);

接下来,创建CaptureRequestCaptureSession对象,并进行拍照操作:

private CameraCaptureSession cameraCaptureSession;
private CaptureRequest.Builder captureRequestBuilder;

camera.createCaptureSession(Arrays.asList(surface), new CameraCaptureSession.StateCallback() {
    @Override
    public void onConfigured(@NonNull CameraCaptureSession session) {
        cameraCaptureSession = session;

        try {
            captureRequestBuilder = camera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
            captureRequestBuilder.addTarget(surface);

            // 设置自动对焦模式
            captureRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);

            // 设置自动曝光模式
            captureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);

            cameraCaptureSession.setRepeatingRequest(captureRequestBuilder.build(), null, null);
        } catch (CameraAccessException e)