一、设置权限

在 AndroidManifest.xml 文件中添加相机权限和存储权限(如果需要保存数据的话):

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

二、布局设置

在布局文件中添加一个 SurfaceView 用于显示相机预览:

1
2
3
4
<SurfaceView
    android:id="@+id/surfaceView"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

三、初始化相机

  1. 在 Activity 或 Fragment 中,获取 SurfaceView 实例并设置其 holder:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
       SurfaceView surfaceView = findViewById(R.id.surfaceView);
       SurfaceHolder surfaceHolder = surfaceView.getHolder();
       surfaceHolder.addCallback(new SurfaceHolder.Callback() {
           @Override
           public void surfaceCreated(SurfaceHolder holder) {
               // Surface 创建时初始化相机
               initCamera();
           }
    
           @Override
           public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
               // Surface 尺寸改变时
           }
    
           @Override
           public void surfaceDestroyed(SurfaceHolder holder) {
               // Surface 销毁时释放相机资源
               releaseCamera();
           }
       });
    
  2. 初始化相机的方法:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    private void initCamera(SurfaceHolder holder){
        try {
            camera = Camera.open();
            Camera.Parameters parameters = camera.getParameters();
            // 设置相机参数,如预览尺寸等
            List<Size> previewSizes = parameters.getSupportedPreviewSizes();
            Size previewSize = previewSizes.get(0);
            parameters.setPreviewSize(previewSize.width, previewSize.height);
            camera.setParameters(parameters);
            // 设置预览的 Surface
            camera.setPreviewDisplay(holder);
            camera.setPreviewCallback(previewCallback);
            camera.startPreview();
        } catch (IOException e) {
            e.printStackTrace();
        }
    
    }
    

四、获取yuv数据

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
private Camera.PreviewCallback previewCallback = new Camera.PreviewCallback() {
        @Override
        public void onPreviewFrame(byte[] data, Camera camera) {
 			//这里获取到的data就是yuv数据
            processYUVData(data);
        }
}

//处理yuv数据 nv21格式
private void processYUVData(byte[] yuv){
    
}

五、释放资源

1
2
3
4
5
6
private void releaseCamera(){
    if (camera!= null) {
        camera.close();
        camera = null;
    }
}

以上就是在 Android 中使用 Camera1 API 获取 YUV 数据的基本步骤。在实际应用中,你可能需要根据具体需求进行适当的调整和扩展。同时,处理 YUV 数据的过程可能会比较复杂,需要根据具体的需求进行相应的处理。