安卓摄像头的详细使用
- 一、引言
- 二、权限设置
- 三、打开摄像头
- 四、摄像头的属性设置
- (一)预览尺寸
- (二)图片格式
- (三)对焦模式
- 五、摄像头预览
- 六、拍照功能
- 七、视频录制
一、引言
在安卓开发中,摄像头的使用是一个非常常见且重要的功能。无论是开发拍照应用、视频录制应用还是其他需要获取图像或视频数据的应用,都离不开对摄像头的操作。
二、权限设置
在使用安卓摄像头之前,首先需要在AndroidManifest.xml文件中添加相关的权限。
- 摄像头权限
- 如果只需要使用摄像头进行拍照或录制视频,需要添加以下权限:
<uses - permission android:name = "android.permission.CAMERA"/>
- 在Android 6.0(API级别23)及以上版本,还需要在运行时动态请求该权限。
- 存储权限(用于保存拍摄的照片或视频)
- 写入外部存储权限:
<uses - permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE"/>
- 读取外部存储权限(如果需要从存储中读取之前拍摄的内容等情况):
<uses - permission android:name = "android.permission.READ_EXTERNAL_STORAGE"/>
三、打开摄像头
-
创建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为例进行讲解。
-
处理摄像头异常
- 当设备没有摄像头或者摄像头被其他应用占用时,
Camera.open()
方法可能会抛出RuntimeException
。所以需要对其进行异常处理:
try {mCamera = Camera.open(0); } catch (RuntimeException e) {e.printStackTrace(); }
- 当设备没有摄像头或者摄像头被其他应用占用时,
四、摄像头的属性设置
(一)预览尺寸
- 获取支持的预览尺寸
- 可以通过
Camera.Parameters
类来获取摄像头支持的预览尺寸。
Camera.Parameters parameters = mCamera.getParameters(); List<Camera.Size> supportedPreviewSizes = parameters.getSupportedPreviewSizes();
- 可以通过
- 设置预览尺寸
- 例如,选择一个合适的预览尺寸(这里简单选择第一个支持的尺寸):
if (supportedPreviewSizes.size() > 0) {Camera.Size previewSize = supportedPreviewSizes.get(0);parameters.setPreviewSize(previewSize.width, previewSize.height);mCamera.setParameters(parameters); }
(二)图片格式
- 获取支持的图片格式
- 同样通过
Camera.Parameters
类:
List<Integer> supportedPictureFormats = parameters.getSupportedPictureFormats();
- 常见的图片格式有
ImageFormat.JPEG
(用于拍摄JPEG格式的照片)等。
- 同样通过
- 设置图片格式
parameters.setPictureFormat(ImageFormat.JPEG); mCamera.setParameters(parameters);
(三)对焦模式
- 获取支持的对焦模式
- 使用
Camera.Parameters
类:
List<String> supportedFocusModes = parameters.getSupportedFocusModes();
- 常见的对焦模式有
Camera.Parameters.FOCUS_MODE_AUTO
(自动对焦)、Camera.Parameters.FOCUS_MODE_MACRO
(微距对焦,适用于近距离拍摄小物体)等。
- 使用
- 设置对焦模式
if (supportedFocusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO)) {parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);mCamera.setParameters(parameters); }
五、摄像头预览
- 创建SurfaceView用于预览
- 在布局文件(例如
activity_main.xml
)中添加SurfaceView
:
<SurfaceViewandroid:id="@+id/surfaceView"android:layout_width="match_parent"android:layout_height="match_parent"/>
- 在布局文件(例如
- 在代码中设置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();} });
- 在
六、拍照功能
- 创建拍照回调接口
- 当调用
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()
方法是一个自定义的方法,用于创建一个用于保存照片的文件对象。
- 当调用
- 触发拍照
- 在合适的时机(例如用户点击拍照按钮)调用
mCamera.takePicture()
方法:
public void takePhoto() {mCamera.takePicture(null, null, jpegCallback); }
- 在合适的时机(例如用户点击拍照按钮)调用
七、视频录制
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/27000514d67a46418c8b016b236403eb.png#pic_cente
- 设置视频编码格式等参数(使用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);
- 首先创建
- 设置输出文件路径
- 同样需要创建一个合适的文件用于保存视频。
File videoFile = getOutputMediaFileForVideo(); mediaRecorder.setOutputFile(videoFile.getAbsolutePath());
- 开始和停止录制
- 开始录制:
try {mediaRecorder.prepare();mediaRecorder.start(); } catch (IOException e) {e.printStackTrace(); }
- 停止录制:
mediaRecorder.stop(); mediaRecorder.reset(); mediaRecorder.release(); mCamera.lock();