Android Camera系列(一):SurfaceView+Camera

[复制链接]
发表于 2025-12-21 00:21:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
心行慈善,何需积极看经—《西游记》
  
      
  • Android Camera系列(一):SurfaceView+Camera  
  • Android Camera系列(二):TextureView+Camera  
  • Android Camera系列(三):GLSurfaceView+Camera  
  • Android Camera系列(四):TextureView+OpenGL ES+Camera  
  • Android Camera系列(五):Camera2  
  • Android Camera系列(六):MediaCodec视频编码上-编码YUV  
  • Android Camera系列(七):MediaCodec视频编码中-OpenGL ES多线程渲染  
  • Android Camera系列(八):MediaCodec视频编码下-OpenGL ES离屏渲染
本系列重要报告Android开发中Camera的干系利用、预览方式、视频录制等。项目结构简单、代码耦合性低,旨在资助各人能从中有所劳绩(方便copy :) ),对于个人来说也是一个总结的好机遇

一. Camera利用

Android体系存在这么多年,google更新了不少API。光是对摄像头的利用如今就有3种API:

      
  • android.hardware.Camera:最早用来自界说Camera的API  
  • android.hardware.camera2.*:Android5.0之后保举使用的API,对Camera利用更机动,功能更丰富  
  • CameraX:对Camera2的封装,API更简单
由于Android版本浩繁,思量兼容性,本文我们还是对android.hardware.Camera举行讲授,利用Camera具体必要哪些步调呢?
      
  • 设置Camera权限,Android6.0以上请动态申请  
  • 打开相机,Camera.open()  
  • 开始预览,startPreview  
  • 克制预览,stopPreview  
  • 关闭相机,release()
1. 打开相机

申请Camera权限,Android6.0以上记得在打开相机进步举措态申请
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android">
  3.     <uses-permission android:name="android.permission.CAMERA" />
  4.     <uses-feature android:name="android.hardware.camera" />
  5.     ...
  6. </manifest>
复制代码
我们对Camera举行了简单的封装,无论是Camera还是Camera2我们预览视图都可以是SurfaceView、TextureView、GLSurfaceView,以是我们将Camera利用和预览视图举行分离,让预览View不在依靠具体的某种Camera实现
界说接口类ICameraManager:
  1. /**
  2. * Camera和Camera2通用接口
  3. *
  4. * @author xiaozhi
  5. * @since 2024/8/15
  6. */
  7. public interface ICameraManager {
  8.    
  9.    
  10.     /**
  11.      * 打开Camera
  12.      */
  13.     void openCamera();
  14.     /**
  15.      * 关闭释放Camera
  16.      */
  17.     void releaseCamera();
  18.     /**
  19.      * 开启预览
  20.      *
  21.      * @param surfaceHolder
  22.      */
  23.     void startPreview(SurfaceHolder surfaceHolder);
  24.     /**
  25.      * 开启预览
  26.      *
  27.      * @param surfaceTexture
  28.      */
  29.     void startPreview(SurfaceTexture surfaceTexture);
  30.     /**
  31.      * 停止预览
  32.      */
  33.     void stopPreview();
  34.     ...
  35. }
复制代码
CameraManager实现ICameraManager,打开摄像头
  1.     /**
  2.      * 打开Camera
  3.      */
  4.     @Override
  5.     public synchronized void openCamera() {
  6.    
  7.    
  8.         Logs.i(TAG, "Camera open #" + mCameraId);
  9.         if (mCamera == null) {
  10.    
  11.    
  12.             if (mCameraId >= Camera.getNumberOfCameras()) {
  13.    
  14.    
  15.                 onOpenError(CAMERA_ERROR_NO_ID, "No camera.");
  16.                 return;
  17.             }
  18.             try {
  19.    
  20.    
  21.                 mCamera = Camera.open(mCameraId);
  22.                 Camera.getCameraInfo(mCameraId, mCameraInfo);
  23.                 mCamera.setErrorCallback(errorCallback);
  24.                 initCamera();
  25.                 onOpen();
  26.                 mOrientationEventListener.enable();
  27.             } catch (Exception e) {
  28.    
  29.    
  30.                 onOpenError(CAMERA_ERROR_OPEN, e.getMessage());
  31.             }
  32.         }
  33.     }
复制代码
打开摄像头之后我们可以设置摄像头的一些根本参数,如预览尺寸,照相尺寸等
  1.     /**
  2.      * 配置Camera参数
  3.      */
  4.     private void initCamera() {
  5.    
  6.    
  7.         if (mCamera != null) {
  8.    
  9.    
  10.             mParameters = mCamera.getParameters
复制代码
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表