一、弁言
在安卓开发中,摄像头的使用是一个非常常见且紧张的功能。无论是开发拍照应用、视频录制应用还是其他需要获取图像或视频数据的应用,都离不开对摄像头的操作。
二、权限设置
在使用安卓摄像头之前,首先需要在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;
- @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为例进行讲解。
- 处理摄像头异常
- 当设备没有摄像头或者摄像头被其他应用占用时,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);
- }
复制代码
(二)图片格式
- 获取支持的图片格式
- List<Integer> supportedPictureFormats = parameters.getSupportedPictureFormats();
复制代码
- 常见的图片格式有ImageFormat.JPEG(用于拍摄JPEG格式的照片)等。
- 设置图片格式
- parameters.setPictureFormat(ImageFormat.JPEG);
- mCamera.setParameters(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:
- <SurfaceView
- android:id="@+id/surfaceView"
- android:layout_width="match_parent"
- android:layout_height="match_parent"/>
复制代码
- 在代码中设置SurfaceView与摄像头关联
- 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();
- }
- });
复制代码
六、拍照功能
- 创建拍照回调接口
- 当调用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()方法是一个自定义的方法,用于创建一个用于保存照片的文件对象。
- 触发拍照
- 在合适的机会(例如用户点击拍照按钮)调用mCamera.takePicture()方法:
- public void takePhoto() {
- mCamera.takePicture(null, null, jpegCallback);
- }
复制代码
七、视频录制

- 首先创建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();
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |