Android调用摄像头

在Android应用开发中,调用摄像头是一个常见的需求。本文将以详细的步骤和代码示例,教你如何在Android中实现调用摄像头功能。

步骤概览

下表展示了实现"Android调用摄像头"的整个流程,包括权限申请、摄像头调用和获取拍摄照片。

步骤 操作
1. 添加权限 添加相机权限到AndroidManifest.xml文件中
2. 创建布局 在布局文件中添加一个SurfaceView用于显示摄像头预览画面
3. 初始化摄像头 在Activity的onCreate方法中初始化摄像头,获取摄像头实例和配置摄像头参数
4. 显示摄像头预览 在SurfaceView的SurfaceHolder.Callback中实现surfaceCreated和surfaceDestroyed方法,用于显示和停止显示摄像头预览画面
5. 拍照 在拍照按钮的点击事件中调用摄像头的takePicture方法进行拍照操作
6. 保存照片到本地 在Camera.PictureCallback的onPictureTaken方法中保存照片到本地文件系统

代码示例

添加权限

首先,你需要在AndroidManifest.xml文件中添加相机权限。在<manifest>标签中添加以下代码:

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

创建布局

在你的布局文件中,添加一个SurfaceView用于显示摄像头预览画面。例如,在activity_main.xml中添加以下代码:

<SurfaceView
    android:id="@+id/surfaceView"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

初始化摄像头

在Activity的onCreate方法中,初始化摄像头,获取摄像头实例并配置摄像头参数。在MainActivity.java中添加以下代码:

private Camera camera;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // 初始化摄像头
    camera = Camera.open();
    Camera.Parameters parameters = camera.getParameters();
    // 配置摄像头参数
    camera.setParameters(parameters);
}

显示摄像头预览

为了显示摄像头的预览画面,你需要在SurfaceView的SurfaceHolder.Callback中实现surfaceCreated和surfaceDestroyed方法。在MainActivity.java中添加以下代码:

private SurfaceHolder surfaceHolder;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    SurfaceView surfaceView = findViewById(R.id.surfaceView);
    surfaceHolder = surfaceView.getHolder();
    surfaceHolder.addCallback(new SurfaceHolder.Callback() {
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            // 在Surface创建时调用,开始显示摄像头预览画面
            try {
                camera.setPreviewDisplay(holder);
                camera.startPreview();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
            // 在Surface大小或格式发生变化时调用
        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            // 在Surface销毁时调用,停止显示摄像头预览画面
            camera.stopPreview();
            camera.release();
        }
    });
}

拍照

在拍照按钮的点击事件中,调用摄像头的takePicture方法进行拍照操作。在MainActivity.java中添加以下代码:

private Camera.PictureCallback pictureCallback = new Camera.PictureCallback() {
    @Override
    public void onPictureTaken(byte[] data, Camera camera) {
        // 在拍照完成时调用,可以在这里处理照片数据
        // 例如,保存照片到本地文件系统
        File pictureFile = new File(getExternalFilesDir(null), "photo.jpg");
        try (FileOutputStream fos = new FileOutputStream(pictureFile)) {
            fos.write(data);
            Toast.makeText(MainActivity.this, "照片保存成功", Toast.LENGTH_SHORT).show();
        } catch (IOException e) {
            e.printStackTrace();
            Toast.makeText(MainActivity.this, "照片保存失败", Toast.LENGTH_SHORT).show();
        }