Android Camera2 拍照(三)——切换摄像头,延时拍摄和闪光模式
原文:Android Camera2 拍照(三)——切换摄像头,延时拍摄和闪光模式
一、切换摄像头
在前后摄像头之间切换,首先需要关闭之前打开的摄像头,关闭preview,之后重新打开新的摄像头,重新打开preview。
public void switchCamera() {
if (mCameraId.equals(CAMERA_FRONT)) {
mCameraId = CAMERA_BACK;
closeCamera();
reopenCamera();
} else if (mCameraId.equals(CAMERA_BACK)) {
mCameraId = CAMERA_FRONT;
closeCamera();
reopenCamera();
}
}
关闭摄像头:
/**
* Closes the current {@link CameraDevice}.
*/
private void closeCamera() {
try {
mCameraOpenCloseLock.acquire();
synchronized (mCameraStateLock) { // Reset state and clean up resources used by the camera.
// Note: After calling this, the ImageReaders will be closed after any background
// tasks saving Images from these readers have been completed.
mPendingUserCaptures = 0;
mState = STATE_CLOSED;
if (null != mCaptureSession) {
mCaptureSession.close();
mCaptureSession = null;
}
if (null != mCameraDevice) {
mCameraDevice.close();
mCameraDevice = null;
}
if (null != mJpegImageReader) {
mJpegImageReader.close();
mJpegImageReader = null;
}
if (null != mRawImageReader) {
mRawImageReader.close();
mRawImageReader = null;
}
}
} catch (InterruptedException e) {
throw new RuntimeException("Interrupted while trying to lock camera closing.", e);
} finally {
mCameraOpenCloseLock.release();
}
}
打开新的摄像头:
public void reopenCamera() {
if (mTextureView.isAvailable()) {
openCamera();
} else {
mTextureView.setSurfaceTextureListener(mSurfaceTextureListener);
}
}
如果TextureView是available的,那么直接调用openCamera()打开camera(openCamera()的代码参考之前的博客);如果|TextureView是unavailable的,那么调用TextureView的setSurfaceTextureListener设置SurfaceTextureListener(参考上一篇博客)。
二、延时拍摄
要实现延时拍摄,核心是实现一个定时器。本例延时分为三种模式:3s延时,10s按时,无延时。可以在三种模式之中自有切换。
private void switchDelayState() {
switch (mDelayState) {
case 0:
mTimer.setImageResource(R.mipmap.ic_3s);
mDelayTime = 3 * 1000;
mDelayState = 1;
break;
case 1:
mTimer.setImageResource(R.mipmap.ic_10s);
mDelayTime = 10 * 1000;
mDelayState = 2;
break;
case 2:
mTimer.setImageResource(R.mipmap.timer);
mDelayTime = 0;
mDelayState = 0;
break;
default:
break;
}
}
变量mDelayTime和mDelaySate的定义:
/*
* Delay state, 0 represents no delay, 1 represents 3s delay, while 2 represents 10s delay
*/
private short mDelayState = 0; // Timer
private short mDelayTime;
当拍摄按钮被点击时:
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.capture: {
if (mDelayState == 0) {
takePicture();
} else {
new CountDownTimer(mDelayTime, TIME_INTERVAL) {
@Override
public void onTick(long millisUntilFinished) {
mTimeText.setVisibility(View.VISIBLE);
mTimeText.setText("" + millisUntilFinished / TIME_INTERVAL);
} @Override
public void onFinish() {
mTimeText.setVisibility(View.GONE);
takePicture();
}
}.start();
}
break;
}
但有3s或10s延时的时候,利用CountDownTimer实现倒计时并每隔一秒更新剩余时间提示,到时候执行拍照功能。
三、切换闪光模式
支持自动,强制,禁止闪光。与闪光模式有关的属性是CaptureRequest.CONTROL_AE_MODE和CaptureRequest.FLASH_MODE。 如果要使用FLASH_MODE属相,闪光灯必须可用,并且,CONTROL_AE_MODE必须设置为on或off,否则,自动曝光属性的ON_AUTO_FLASH,ON_ALWAYS_FLASH,
ON_AUTO_FLASH_REDEYE将会覆盖FLASH_MODE的设置。
private void switchFlashMode() {
switch (mFlashMode) {
case 0:
mFlashMode = 1;
mFlashBtn.setImageResource(R.mipmap.flash_auto);
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
try {
mCaptureSession.setRepeatingRequest(
mPreviewRequestBuilder.build(),
mPreCaptureCallback, mBackgroundHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
return;
}
break;
case 1:
mFlashMode = 2;
mFlashBtn.setImageResource(R.mipmap.flash_on);
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH);
try {
mCaptureSession.setRepeatingRequest(
mPreviewRequestBuilder.build(),
mPreCaptureCallback, mBackgroundHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
return;
}
break;
case 2:
mFlashMode = 0;
mFlashBtn.setImageResource(R.mipmap.flash_off);
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);
mPreviewRequestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF);
try {
mCaptureSession.setRepeatingRequest(
mPreviewRequestBuilder.build(),
mPreCaptureCallback, mBackgroundHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
return;
}
break;
}
}
在takePicture()之前,需要再次设置:
private void setFlashMode() {
switch (mFlashMode) {
case 0:
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);
mPreviewRequestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF);
break;
case 1:
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
break;
case 2:
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH);
break;
}
}
代码参考:https://github.com/gengqifu/361Camera,欢迎fork/star。
Android Camera2 拍照(三)——切换摄像头,延时拍摄和闪光模式的更多相关文章
- Android Camera2 拍照(二)——使用TextureView
原文:Android Camera2 拍照(二)--使用TextureView 上一篇博文简单介绍了使用Camera2 API拍摄照片,并使用SurfaceView作为预览界面.实际上,相对于Surf ...
- Android Camera2 拍照(四)——对焦模式
原文:Android Camera2 拍照(四)--对焦模式 本篇将重点介绍使用Camera2 API进行手动对焦的设置,以及在手动对焦与自动对焦模式之间切换. 一.手动对焦响应事件 首先我们要实现点 ...
- Android Camera2拍照(一)——使用SurfaceView
原文:Android Camera2拍照(一)--使用SurfaceView Camera2 API简介 Android 从5.0(21)开始,引入了新的Camera API Camera2,原来的a ...
- Android Camera2 拍照入门学习
原文:Android Camera2 拍照入门学习 学习资料: 肾虚将军android camera2 详解说明 极客学院android.hardware.camera2 使用指南 Android 5 ...
- android viewpager fragment 优化 切换界面 延时加载
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha 使用 碎片的 设置用户可见暗示visible hint 这个方法来做到. hint 是 ...
- 【Android】自己定义相机的实现(支持连续拍照、前后摄像头切换、连续对焦)
~转载请注明http://blog.csdn.net/u013015161/article/details/46921257 介绍 这几天.写了一个自己定义照相机的demo.支持连续拍照和摄像头切换. ...
- Android Camera2采集摄像头原始数据并手动预览
Android Camera2采集摄像头原始数据并手动预览 最近研究了一下android摄像头开发相关的技术,也看了Google提供的Camera2Basic调用示例,以及网上一部分代码,但都是在Te ...
- Android Camera2 预览,拍照,人脸检测并实时展现
https://www.jianshu.com/p/5414ba2b5508 背景 最近需要做一个人脸检测并实时预览的功能.就是边检测人脸,边在预览界面上框出来. 当然本人并不是专门做 ...
- android实现前置后置摄像头相互切换
首先自定义一个继承自SurfaceView并且实现了SurfaceHolder.Callback接口的组件: public class CameraView extends SurfaceView i ...
随机推荐
- [tmux] Organize your terminal using tmux panes
Learn to organize your workspace using tmux. We'll create a new tmux session and learn how to create ...
- [TypeScript] Catch unsafe use of "this" in TypeScript functions
this is probably the most tricky thing to use in JavaScript and therefore TypeScript. Fortunately th ...
- 基于 Android NDK 的学习之旅-----数据传输(引用数据类型)
接着上篇文章继续讲.主要关于引用类型的数据传输,本文将介绍字符串传输和自定义对象的传输. 1.主要流程 1. String 字符串传输 a) 上层定义一个native的方法,需要一个 ...
- Android 设置alpha值来制作透明与渐变效果的实例
Android系统支持的颜色是由4个值组成的,前3个为RGB,也就是我们常说的三原色(红.绿.蓝),最后一个值是A,也就是Alpha.这4个值都在0~255之间.颜色值越小,表示该颜色越淡,颜色值越大 ...
- 常用binlog日志操作命令
1.查看所有binlog日志列表 mysql> show master logs; 2.查看master状态,即最后(最新)一个binlog日志的编号名称,及其最后一个操作事件pos结束点(Po ...
- SWIFT学习笔记04
1.在实际编译时,Swift 编译器会优化字符串的使用.使实际的复制仅仅发生在绝对必要的情况下,这意味着您将字符串作为值类型的同一时候能够获得极高的性能. 2.for character in &qu ...
- [Ramda] R.project -- Select a Subset of Properties from a Collection of Objects in Ramda
In this lesson we'll take an array of objects and map it to a new array where each object is a subse ...
- android 连接USB按power键锁屏2声锁屏音
alps\frameworks\base\packages\Keyguard\src\com\android\keyguard\KeyguardViewMediator.java #1384 行左右: ...
- 浅谈 Redis 与 MySQL 的耦合性以及利用管道完成 MySQL 到 Redis 的高效迁移
http://blog.csdn.net/dba_waterbin/article/details/8996872 ㈠ Redis 与 MySQL 的耦合性 在业务架构早期.我们 ...
- Role-based access control modeling and auditing system
A role-based access control (RBAC) modeling and auditing system is described that enables a user to ...