安卓摄像头的详细使用

安卓摄像头的详细使用

    • 一、引言
    • 二、权限设置
    • 三、打开摄像头
    • 四、摄像头的属性设置
      • (一)预览尺寸
      • (二)图片格式
      • (三)对焦模式
    • 五、摄像头预览
    • 六、拍照功能
    • 七、视频录制

一、引言

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


二、权限设置

在使用安卓摄像头之前,首先需要在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;@Overrideprotected 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
    <SurfaceViewandroid: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() {@Overridepublic void surfaceCreated(SurfaceHolder holder) {try {mCamera.setPreviewDisplay(holder);mCamera.startPreview();} catch (IOException e) {e.printStackTrace();}}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {// 如果SurfaceView的大小发生变化,可以在这里重新设置预览参数}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {mCamera.stopPreview();mCamera.release();}
    });
    

六、拍照功能

在这里插入图片描述

  1. 创建拍照回调接口
    • 当调用mCamera.takePicture()方法拍照时,需要传入三个回调接口,分别用于处理拍照前的准备、拍摄的原始数据(一般不常用)和最终的JPEG格式照片数据。
    Camera.PictureCallback jpegCallback = new Camera.PictureCallback() {@Overridepublic 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();
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/3898.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

服务器的配置复杂,租用时该如何选择参数?

对于互联网企业来说&#xff0c;开发一套可以接入互联网的产品&#xff0c;并利用它来盈利是终极目的。但互联网产品必须有服务器才能运行&#xff0c;对于很多公司来说&#xff0c;托管服务器成本太高&#xff0c;而租用服务器才算得上是最好的选择&#xff0c;但面对配置参数…

10min本地安装Qwen1.5-0.5B-Chat

大模型系列文章 本地电脑离线部署大模型 配置&#xff1a;MAC-M1-8GB 10min本地安装Qwen1.5-0.5B-Chat 大模型系列文章前言一、下载Qwen1.5-0.5B-Chat二、构造函数chatBot.py三、启动命令1、放置脚本2、启动命令3、效果图 前言 在人工智能领域&#xff0c;大模型无疑是最炙手…

90%会展主办方都会用的6款数字化工具

在会展行业&#xff0c;数字化转型已成为提升竞争力的关键。面对日益增长的运营成本和收入增长的瓶颈&#xff0c;主办方需要借助数字化工具来实现效率提升和成本控制。 今天介绍几种常见的数字化工具和应用方式。 一、线上展览平台 构建线上展览平台是会展主办方拓展线上销…

弃用 RestTemplate,来了解一下官方推荐的 WebClient !

在 Spring Framework 5.0 及更高版本中&#xff0c;RestTemplate 已被弃用&#xff0c;取而代之的是较新的 WebClient。这意味着虽然 RestTemplate 仍然可用&#xff0c;但鼓励 Spring 开发人员迁移到新项目的 WebClient。 WebClient 优于 RestTemplate 的原因有几个&#xff…

SpringBoot+Thymeleaf电商系统

> 这是一个基于SpringBootThymeleafBootstrap实现的简单电商系统。 > 实现了用户浏览、添加购物车、商品管理等功能&#xff0c;并支持响应式布局。 > 本项目适合JAVA初学者作为入门学习项目 一、部分界面演示 二、技术栈 技术栈中文描述Spring Boot快速开发框架…

02-Dubbo特性及工作原理

02-Dubbo特性及工作原理 Dubbo 的特性 这里说一下 Dubbo 最主要的特性&#xff0c;从这些特性中&#xff0c;就可以看出来我们为什么要选用 Dubbo&#xff0c;也可以将 Dubbo 和 Spring Cloud 进行对比&#xff0c;比如我们搭建一套微服务系统&#xff0c;出于什么考虑选用 Dub…

20241102在荣品PRO-RK3566开发板的预置Android13下适配宸芯的数传模块CX6603N

20241102在荣品PRO-RK3566开发板的预置Android13下适配宸芯的数传模块CX6603N 2024/11/2 18:04 在WIN10使用程序&#xff1a;ViewLink-4.0.7_0708-windows-x64.exe 在荣品PRO-RK3566开发板的预置Android13下使用&#xff1a;ViewLink-2023_12_21-release-0.2.6.apk adb install…

Oracle OCP认证考试考点详解082系列12

题记&#xff1a; 本系列主要讲解Oracle OCP认证考试考点&#xff08;题目&#xff09;&#xff0c;适用于19C/21C,跟着学OCP考试必过。 56. 第56题&#xff1a; 题目 解析及答案&#xff1a; 关于企业管理器&#xff08;EM&#xff09;Express&#xff0c;以下哪两个陈述是…

AutoCAD2020

链接: https://pan.baidu.com/s/1Gvp3lQtMJxP0e_Fs5E_kIg提取码: jvuf 简介&#xff1a;一键安装&#xff0c;已经破解。支持W7-w10-w11系统64位

源鲁杯 2024 web(部分)

[Round 1] Disal F12查看: f1ag_is_here.php 又F12可以发现图片提到了robots 访问robots.txt 得到flag.php<?php show_source(__FILE__); include("flag_is_so_beautiful.php"); $a$_POST[a]; $keypreg_match(/[a-zA-Z]{6}/,$a); $b$_REQUEST[b];if($a>99999…

《高频电子线路》—— 调频方法

文章内容来源于【中国大学MOOC 华中科技大学通信&#xff08;高频&#xff09;电子线路精品公开课】&#xff0c;此篇文章仅作为笔记分享。 目录 调频方法 分类 调频技术指标 小结 直接调频方法与电路 直接调频方法 变容二极管直接调频电路 优缺点以及提升稳定性的方法…

使用onnxruntime-web 运行yolov8-nano推理

ONNX&#xff08;Open Neural Network Exchange&#xff09;模型具有以下两个特点促成了我们可以使用onnxruntime-web 直接在web端上运行推理模型&#xff0c;为了让这个推理更直观&#xff0c;我选择了试验下yolov8 识别预览图片&#xff1a; 1. 跨平台兼容性 ONNX 是一种开…

软件测试学习笔记丨测试平台的价值与体系

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/23405 测试平台的价值与体系 开发测试平台的前提&#xff1a; 已有的开源测试平台不能满足需要&#xff0c;不要轻易造轮子公司的测试体系健全当体系、测试技术等游刃有余&#xff0c;构建平台…

练习LabVIEW第四十题

学习目标&#xff1a; 用labvIEW做一个循环闪烁指示灯&#xff0c;要能够在前面板调节周期和占空比。 开始编写&#xff1a; 前面板 一个布尔指示灯一维数组&#xff0c;两个数值输入控件&#xff1b; 程序框图 添加一个while循环&#xff0c;循环内添加初始化数组&…

基于TRIZ理论的便携式光伏手机充电装置创新

随着智能手机功能的日益强大&#xff0c;电量消耗问题也日益凸显&#xff0c;尤其是在户外活动时&#xff0c;电量告急常常让人措手不及。面对这一挑战&#xff0c;基于TRIZ&#xff08;发明问题解决理论&#xff09;的创新思维&#xff0c;一款全新的便携式光伏手机充电装置应…

OpenOCD之flash write_image和program命令的区别

OpenOCD&#xff1a;Open On-Chip Debugger&#xff0c;自由开源的片上调试和编程工具。 OpenOCD所有的命令索引链接&#xff1a;请点击这里 OpenOCD官方使用手册&#xff1a;https://openocd.org/doc-release/pdf/openocd.pdf [flash write_image]命令 Command: flash write…

无需懂代码!用AI工具Bolt一键生成网站的入门指南!

​ ​ 随着AI技术的不断发展&#xff0c;许多原本需要技术门槛的操作正在被大大简化&#xff0c;甚至零基础的用户也可以轻松实现。 例如&#xff0c;AI生成网站工具Bolt就是这样一个可以帮助我们快速创建、实时预览并自动部署网站的平台。接下来&#xff0c;本文将带你深入了…

作为一名测试人,快来恶补F12的用法!

浏览器都内嵌了一个神奇的开发助手&#xff0c;只需轻敲 F12&#xff0c;它就能即刻现身&#xff0c;这就是我们常说的F12调试工具。 无论你是前端开发还是测试工程师&#xff0c;F12工具都是不可或缺的伙伴。 F12调试工具&#xff0c;简单、轻量&#xff0c;却功能强大。 一…

开源AI智能语音转写系统,提升法庭效率与透明度:精准记录庭审,助力智能司法

一、系统概述 在司法领域&#xff0c;庭审记录的精准度和完整性直接影响案件处理的公平公正。法庭实时语音转写系统通过思通数科AI多模态平台&#xff0c;结合尖端的语音识别技术和自然语言处理&#xff08;NLP&#xff09;&#xff0c;实现实时记录和精准转写&#xff0c;为司…

Linux上部署DNS服务器

1.搭建dns服务器能够对自定义的正向或者反向域完成数据解析查询。 2.配置从DNS服务器&#xff0c;对主dns服务器进行数据备份。 一&#xff0c;正反向解析&#xff1a; 关闭防火墙和selinux [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 在…