Android 摄像头采集 Demo

在现代移动应用开发中,摄像头的使用频率越来越高。无论是拍照、视频录制还是图像处理,都会涉及到摄像头的操作。本文将探讨如何在 Android 上实现摄像头采集,并提供一个简单的示例。

1. 准备工作

在开始编写代码之前,你需要确保你有以下环境:

  • Android Studio
  • Android 设备或模拟器
  • Android SDK

接下来,我们需要在 build.gradle 文件中添加必要的权限和依赖。

android {
    ...
    compileSdkVersion 31

    defaultConfig {
        ...
        minSdkVersion 21
        targetSdkVersion 31
    }
}

dependencies {
    implementation 'androidx.camera:camera-camera2:1.0.1'
    implementation 'androidx.camera:camera-lifecycle:1.0.1'
    implementation 'androidx.camera:camera-view:1.0.0-alpha29'
}

然后在 AndroidManifest.xml 中请求摄像头权限:

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

2. 创建布局文件

我们将创建一个简单的界面,其中包含一个用于显示摄像头预览的 PreviewView,以及一个按钮用于开始视频录制。

<RelativeLayout xmlns:android="
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.camera.view.PreviewView
        android:id="@+id/preview_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <Button
        android:id="@+id/capture_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Capture"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true" />
</RelativeLayout>

3. 编写代码

在我们的主活动中,我们需要初始化摄像头以及处理按钮的点击事件。

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.camera.core.CameraSelector;
import androidx.camera.core.CameraX;
import androidx.camera.core.Preview;
import androidx.camera.lifecycle.ProcessCameraProvider;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.camera.view.PreviewView;

public class MainActivity extends AppCompatActivity {

    private static final int REQUEST_CAMERA_PERMISSION = 200;
    private PreviewView previewView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        previewView = findViewById(R.id.preview_view);
        
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
            startCamera();
        } else {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION);
        }
    }

    private void startCamera() {
        Preview preview = new Preview.Builder().build();
        preview.setSurfaceProvider(previewView.createSurfaceProvider());

        CameraSelector cameraSelector = new CameraSelector.Builder()
                .requireLensFacing(CameraSelector.LENS_FACING_BACK)
                .build();

        CameraX.bindToLifecycle(this, cameraSelector, preview);
    }

    @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) {
                startCamera();
            } else {
                // Permission denied, show a message to the user
            }
        }
    }
}

代码解析

  1. 权限请求:我们首先检查是否拥有摄像头权限。如果没有,我们请求权限。
  2. 启动摄像头:使用 CameraX 启动摄像头并将预览显示在 PreviewView 中。
  3. 生命周期管理:CameraX 能够与活动的生命周期自动管理,从而简化摄像头的使用。

4. 数据采集与处理

在捕获图像或视频后,我们可以使用图片处理库进行分析,如 OpenCV 或 TensorFlow。此时,你可以考虑数据的可视化。例如,当采集成功时,可以展示一个饼图,以便展示采集成功的比例。

pie
    title 摄像头采集状态
    "成功": 70
    "失败": 30

结论

通过 CameraX,我们可以轻松地实现摄像头的功能,处理图像采集与查看的需求。虽然本文展示了一个简单的例子,实际应用中可以根据需求进行扩展,例如添加图像处理、视频录制等功能。希望通过这个 demo,让大家对 Android 摄像头采集业务有更深入的了解,为后续的开发提供灵感与基础。