一、引言

在安卓开发中,摄像头的使用是一个非常常见且重要的功能。无论是开发拍照应用、视频录制应用还是其他需要获取图像或视频数据的应用,都离不开对摄像头的操作。


二、权限设置

在使用安卓摄像头之前,首先需要在AndroidManifest.xml文件中添加相关的权限。

  1. 摄像头权限
    • 如果只需要使用摄像头进行拍照或录制视频,需要添加以下权限:
    <uses - permission android:name = "android.permission.CAMERA"/>
    
    • 在Android 6.0(API级别23)及以上版本,还需要在运行时动态请求该权限。
  2. 存储权限(用于保存拍摄的照片或视频)
    • 写入外部存储权限:
    <uses - permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE"/>
    
    • 读取外部存储权限(如果需要从存储中读取之前拍摄的内容等情况):
    <uses - permission android:name = "android.permission.READ_EXTERNAL_STORAGE"/>
    

三、打开摄像头

  1. 创建Camera对象

    • 在较旧的安卓版本(API 21及以下)中,可以使用以下方式打开摄像头:
    import android.hardware.Camera;
    
    public class MainActivity extends AppCompatActivity {
        private Camera mCamera;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            // 打开后置摄像头,0表示后置摄像头,1表示前置摄像头
            mCamera = Camera.open(0);
        }
    }
    
    • 在API 21及以上版本,推荐使用Camera2 API。不过,这里先以旧的Camera API为例进行讲解。
  2. 处理摄像头异常

    • 当设备没有摄像头或者摄像头被其他应用占用时,Camera.open()方法可能会抛出RuntimeException。所以需要对其进行异常处理:
    try {
        mCamera = Camera.open(0);
    } catch (RuntimeException e) {
        e.printStackTrace();
    }
    

四、摄像头的属性设置

(一)预览尺寸

  1. 获取支持的预览尺寸
    • 可以通过Camera.Parameters类来获取摄像头支持的预览尺寸。
    Camera.Parameters parameters = mCamera.getParameters();
    List<Camera.Size> supportedPreviewSizes = parameters.getSupportedPreviewSizes();
    
  2. 设置预览尺寸
    • 例如,选择一个合适的预览尺寸(这里简单选择第一个支持的尺寸):
    if (supportedPreviewSizes.size() > 0) {
        Camera.Size previewSize = supportedPreviewSizes.get(0);
        parameters.setPreviewSize(previewSize.width, previewSize.height);
        mCamera.setParameters(parameters);
    }
    

(二)图片格式

  1. 获取支持的图片格式
    • 同样通过Camera.Parameters类:
    List<Integer> supportedPictureFormats = parameters.getSupportedPictureFormats();
    
    • 常见的图片格式有ImageFormat.JPEG(用于拍摄JPEG格式的照片)等。
  2. 设置图片格式
    parameters.setPictureFormat(ImageFormat.JPEG);
    mCamera.setParameters(parameters);
    

(三)对焦模式

  1. 获取支持的对焦模式
    • 使用Camera.Parameters类:
    List<String> supportedFocusModes = parameters.getSupportedFocusModes();
    
    • 常见的对焦模式有Camera.Parameters.FOCUS_MODE_AUTO(自动对焦)、Camera.Parameters.FOCUS_MODE_MACRO(微距对焦,适用于近距离拍摄小物体)等。
  2. 设置对焦模式
    if (supportedFocusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO)) {
        parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
        mCamera.setParameters(parameters);
    }
    

五、摄像头预览

  1. 创建SurfaceView用于预览
    • 在布局文件(例如activity_main.xml)中添加SurfaceView
    <SurfaceView
        android:id="@+id/surfaceView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
    
  2. 在代码中设置SurfaceView与摄像头关联
    • Activity类中:
    SurfaceView surfaceView = findViewById(R.id.surfaceView);
    SurfaceHolder surfaceHolder = surfaceView.getSurfaceHolder();
    surfaceHolder.addCallback(new SurfaceHolder.Callback() {
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            try {
                mCamera.setPreviewDisplay(holder);
                mCamera.startPreview();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
            // 如果SurfaceView的大小发生变化,可以在这里重新设置预览参数
        }
    
        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            mCamera.stopPreview();
            mCamera.release();
        }
    });
    

六、拍照功能

在这里插入图片描述

  1. 创建拍照回调接口
    • 当调用mCamera.takePicture()方法拍照时,需要传入三个回调接口,分别用于处理拍照前的准备、拍摄的原始数据(一般不常用)和最终的JPEG格式照片数据。
    Camera.PictureCallback jpegCallback = new Camera.PictureCallback() {
        @Override
        public void onPictureTaken(byte[] data, Camera camera) {
            // 这里可以将data保存为文件,例如保存到外部存储
            File pictureFile = getOutputMediaFile();
            if (pictureFile == null) {
                return;
            }
            try {
                FileOutputStream fos = new FileOutputStream(pictureFile);
                fos.write(data);
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            // 拍照后重新开始预览
            camera.startPreview();
        }
    };
    
    • 其中getOutputMediaFile()方法是一个自定义的方法,用于创建一个用于保存照片的文件对象。
  2. 触发拍照
    • 在合适的时机(例如用户点击拍照按钮)调用mCamera.takePicture()方法:
    public void takePhoto() {
        mCamera.takePicture(null, null, jpegCallback);
    }
    

七、视频录制

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/27000514d67a46418c8b016b236403eb.png#pic_cente
在这里插入图片描述

  1. 设置视频编码格式等参数(使用MediaRecorder)
    • 首先创建MediaRecorder对象,并进行相关设置。
    MediaRecorder mediaRecorder = new MediaRecorder();
    mCamera.unlock();
    mediaRecorder.setCamera(mCamera);
    mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
    mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
    mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
    
  2. 设置输出文件路径
    • 同样需要创建一个合适的文件用于保存视频。
    File videoFile = getOutputMediaFileForVideo();
    mediaRecorder.setOutputFile(videoFile.getAbsolutePath());
    
  3. 开始和停止录制
    • 开始录制:
    try {
        mediaRecorder.prepare();
        mediaRecorder.start();
    } catch (IOException e) {
        e.printStackTrace();
    }
    
    • 停止录制:
    mediaRecorder.stop();
    mediaRecorder.reset();
    mediaRecorder.release();
    mCamera.lock();
    
Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐