Android预览拍照

在Android应用程序中,拍照功能是一个常见的需求。用户可以通过应用程序拍摄照片,并在拍摄前预览照片,以确保照片质量符合要求。本文将介绍如何在Android应用中实现预览拍照功能,包括使用相机API和展示预览照片。

使用相机API

Android提供了Camera API和Camera2 API来实现相机功能。Camera2 API是Android 5.0(API级别21)引入的新API,相比较之前的Camera API,Camera2 API提供了更多的控制和功能。

1. 添加权限

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

<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

2. 检查相机是否可用

在代码中检查设备是否具备相机功能:

private boolean checkCameraHardware(Context context) {
    return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA);
}

3. 打开相机

使用Camera2 API打开相机:

private void openCamera() {
    CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
    try {
        String cameraId = manager.getCameraIdList()[0];
        manager.openCamera(cameraId, mStateCallback, null);
    } catch (CameraAccessException e) {
        e.printStackTrace();
    }
}

4. 创建预览

创建预览视图,将相机输出展示在界面上:

private void createCameraPreviewSession() {
    SurfaceTexture texture = mTextureView.getSurfaceTexture();
    texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
    
    Surface surface = new Surface(texture);

    try {
        mPreviewRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
        mPreviewRequestBuilder.addTarget(surface);

        mCameraDevice.createCaptureSession(Arrays.asList(surface), new CameraCaptureSession.StateCallback() {
            @Override
            public void onConfigured(@NonNull CameraCaptureSession session) {
                mCaptureSession = session;
                try {
                    mCaptureSession.setRepeatingRequest(mPreviewRequestBuilder.build(), null, null);
                } catch (CameraAccessException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onConfigureFailed(@NonNull CameraCaptureSession session) {
                // Handle configuration failed
            }
        }, null);
    } catch (CameraAccessException e) {
        e.printStackTrace();
    }
}

展示预览照片

展示预览照片可以通过SurfaceView或TextureView来实现。这里以TextureView为例。

1. 在布局文件中添加TextureView

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

2. 在Activity中初始化TextureView

private void initViews() {
    mTextureView = findViewById(R.id.textureView);
    mTextureView.setSurfaceTextureListener(mSurfaceTextureListener);
}

3. 实现SurfaceTextureListener

private TextureView.SurfaceTextureListener mSurfaceTextureListener = new TextureView.SurfaceTextureListener() {
    @Override
    public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
        openCamera();
    }

    @Override
    public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
        // Handle surface size changed
    }

    @Override
    public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
        // Handle surface destroyed
        return true;
    }

    @Override
    public void onSurfaceTextureUpdated(SurfaceTexture surface) {
        // Handle surface updated
    }
};

总结

通过上述步骤,我们可以在Android应用中实现预览拍照功能。首先使用Camera2 API打开相机,并创建预览视图,然后在界面上展示预览照片。同时,也可以根据需求添加拍照功能,保存照片等操作。

希望本文能帮助你实现预览拍照功能,并提升你的Android开发技能。

sequenceDiagram
    participant A as Android应用
    participant B as 相机
    A->>B: 打开相机
    B->>A: 返回相机实例
    A->>B: 创建