安卓摄像头的具体使用

花瓣小跑  金牌会员 | 2025-2-14 10:20:54 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 855|帖子 855|积分 2565

一、弁言

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

二、权限设置

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

  • 摄像头权限

    • 假如只需要使用摄像头进行拍照或录制视频,需要添加以下权限:
    1. <uses - permission android:name = "android.permission.CAMERA"/>
    复制代码
      

    • 在Android 6.0(API级别23)及以上版本,还需要在运行时动态请求该权限。

  • 存储权限(用于保存拍摄的照片或视频)

    • 写入外部存储权限:
    1. <uses - permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE"/>
    复制代码
      

    • 读取外部存储权限(假如需要从存储中读取之前拍摄的内容等情况):
    1. <uses - permission android:name = "android.permission.READ_EXTERNAL_STORAGE"/>
    复制代码

三、打开摄像头


  • 创建Camera对象

    • 在较旧的安卓版本(API 21及以下)中,可以使用以下方式打开摄像头:
    1. import android.hardware.Camera;
    2. public class MainActivity extends AppCompatActivity {
    3.     private Camera mCamera;
    4.     @Override
    5.     protected void onCreate(Bundle savedInstanceState) {
    6.         super.onCreate(savedInstanceState);
    7.         setContentView(R.layout.activity_main);
    8.         // 打开后置摄像头,0表示后置摄像头,1表示前置摄像头
    9.         mCamera = Camera.open(0);
    10.     }
    11. }
    复制代码
      

    • 在API 21及以上版本,推荐使用Camera2 API。不外,这里先以旧的Camera API为例进行讲解。

  • 处理摄像头异常

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

四、摄像头的属性设置

(一)预览尺寸


  • 获取支持的预览尺寸

    • 可以通过Camera.Parameters类来获取摄像头支持的预览尺寸。
    1. Camera.Parameters parameters = mCamera.getParameters();
    2. List<Camera.Size> supportedPreviewSizes = parameters.getSupportedPreviewSizes();
    复制代码

  • 设置预览尺寸

    • 例如,选择一个合适的预览尺寸(这里简单选择第一个支持的尺寸):
    1. if (supportedPreviewSizes.size() > 0) {
    2.     Camera.Size previewSize = supportedPreviewSizes.get(0);
    3.     parameters.setPreviewSize(previewSize.width, previewSize.height);
    4.     mCamera.setParameters(parameters);
    5. }
    复制代码

(二)图片格式


  • 获取支持的图片格式

    • 同样通过Camera.Parameters类:
    1. List<Integer> supportedPictureFormats = parameters.getSupportedPictureFormats();
    复制代码
      

    • 常见的图片格式有ImageFormat.JPEG(用于拍摄JPEG格式的照片)等。

  • 设置图片格式
    1. parameters.setPictureFormat(ImageFormat.JPEG);
    2. mCamera.setParameters(parameters);
    复制代码
(三)对焦模式


  • 获取支持的对焦模式

    • 使用Camera.Parameters类:
    1. List<String> supportedFocusModes = parameters.getSupportedFocusModes();
    复制代码
      

    • 常见的对焦模式有Camera.Parameters.FOCUS_MODE_AUTO(主动对焦)、Camera.Parameters.FOCUS_MODE_MACRO(微距对焦,适用于近间隔拍摄小物体)等。

  • 设置对焦模式
    1. if (supportedFocusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO)) {
    2.     parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
    3.     mCamera.setParameters(parameters);
    4. }
    复制代码
五、摄像头预览


  • 创建SurfaceView用于预览

    • 在布局文件(例如activity_main.xml)中添加SurfaceView:
    1. <SurfaceView
    2.     android:id="@+id/surfaceView"
    3.     android:layout_width="match_parent"
    4.     android:layout_height="match_parent"/>
    复制代码

  • 在代码中设置SurfaceView与摄像头关联

    • 在Activity类中:
    1. SurfaceView surfaceView = findViewById(R.id.surfaceView);
    2. SurfaceHolder surfaceHolder = surfaceView.getSurfaceHolder();
    3. surfaceHolder.addCallback(new SurfaceHolder.Callback() {
    4.     @Override
    5.     public void surfaceCreated(SurfaceHolder holder) {
    6.         try {
    7.             mCamera.setPreviewDisplay(holder);
    8.             mCamera.startPreview();
    9.         } catch (IOException e) {
    10.             e.printStackTrace();
    11.         }
    12.     }
    13.     @Override
    14.     public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    15.         // 如果SurfaceView的大小发生变化,可以在这里重新设置预览参数
    16.     }
    17.     @Override
    18.     public void surfaceDestroyed(SurfaceHolder holder) {
    19.         mCamera.stopPreview();
    20.         mCamera.release();
    21.     }
    22. });
    复制代码

六、拍照功能



  • 创建拍照回调接口

    • 当调用mCamera.takePicture()方法拍照时,需要传入三个回调接口,分别用于处理拍照前的准备、拍摄的原始数据(一般不常用)和最终的JPEG格式照片数据。
    1. Camera.PictureCallback jpegCallback = new Camera.PictureCallback() {
    2.     @Override
    3.     public void onPictureTaken(byte[] data, Camera camera) {
    4.         // 这里可以将data保存为文件,例如保存到外部存储
    5.         File pictureFile = getOutputMediaFile();
    6.         if (pictureFile == null) {
    7.             return;
    8.         }
    9.         try {
    10.             FileOutputStream fos = new FileOutputStream(pictureFile);
    11.             fos.write(data);
    12.             fos.close();
    13.         } catch (IOException e) {
    14.             e.printStackTrace();
    15.         }
    16.         // 拍照后重新开始预览
    17.         camera.startPreview();
    18.     }
    19. };
    复制代码
      

    • 此中getOutputMediaFile()方法是一个自定义的方法,用于创建一个用于保存照片的文件对象。

  • 触发拍照

    • 在合适的机会(例如用户点击拍照按钮)调用mCamera.takePicture()方法:
    1. public void takePhoto() {
    2.     mCamera.takePicture(null, null, jpegCallback);
    3. }
    复制代码

七、视频录制

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


  • 设置视频编码格式等参数(使用MediaRecorder)

    • 首先创建MediaRecorder对象,并进行相关设置。
    1. MediaRecorder mediaRecorder = new MediaRecorder();
    2. mCamera.unlock();
    3. mediaRecorder.setCamera(mCamera);
    4. mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
    5. mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
    6. mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    7. mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
    8. mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
    复制代码

  • 设置输出文件路径

    • 同样需要创建一个合适的文件用于保存视频。
    1. File videoFile = getOutputMediaFileForVideo();
    2. mediaRecorder.setOutputFile(videoFile.getAbsolutePath());
    复制代码

  • 开始和制止录制

    • 开始录制:
    1. try {
    2.     mediaRecorder.prepare();
    3.     mediaRecorder.start();
    4. } catch (IOException e) {
    5.     e.printStackTrace();
    6. }
    复制代码
      

    • 制止录制:
    1. mediaRecorder.stop();
    2. mediaRecorder.reset();
    3. mediaRecorder.release();
    4. mCamera.lock();
    复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

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

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

花瓣小跑

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表