android camera2
1、camera2api的部分描述: |
api地址:https://developer.android.com/reference/android/hardware/camera2/package-summary.html 用于捕捉相机图像或从相机中捕捉到的图像的摄像机的配置捕捉会话 |
CameraCaptureSession.CaptureCallback |
用于跟踪提交给相机设备的CaptureRequest进程的回调对象。 |
CameraCaptureSession.StateCallback | 一个回调对象,用于接收关于摄像机捕获会话状态的更新。 |
CameraCharacteristics |
描述一个摄像机的属性。 |
CameraCharacteristics.Key<T> | 相机特性 |
CameraConstrainedHighSpeedCaptureSession | 一种受限的高速捕获通道,用于捕捉高速视频记录用例的高速图像。 |
CameraDevice |
这款相机是一款与Android设备相连的单机相机,可以在高帧率下对图像捕捉和后处理进行精细控制 |
CameraDevice.StateCallback | 一个回调对象,用于接收有关相机设备状态的更新。 |
CameraManager |
|
CameraManager.AvailabilityCallback | 于摄像机设备的回调,描述相机可用或无法打开. |
CameraManager.TorchCallback | 摄像机闪光灯模式的回调,即不可用、禁用或启用。 |
CameraMetadata<TKey> | 相机控制和信息的基类 |
CaptureFailure | 图像传感器捕获单个图像捕获失败. |
CaptureRequest |
一个不可变的设置和输出包,需要从摄像机设备中捕获一个图像 |
CaptureRequest.Builder | 构建器捕获请求 |
CaptureRequest.Key<T> | 个键用于捕获请求字段查找 get(CaptureResult.Key) 或设置 set(Key, Object) . |
CaptureResult |
从图像传感器中捕获的单个图像的子集 |
CaptureResult.Key<T> | 捕获结果字段 |
DngCreator | dng主类提供了将原始像素数据写入DNG文件的功能。 |
TotalCaptureResult |
从图像传感器中捕获的单个图像的总聚集结果 |
2、详见代码:
package com.admin.smartcam.androidcamera.camera2; import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.graphics.SurfaceTexture;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CameraDevice;
import android.hardware.camera2.CameraManager;
import android.hardware.camera2.CaptureRequest;
import android.media.CamcorderProfile;
import android.media.MediaRecorder;
import android.os.Build;
import android.os.Environment;
import android.support.annotation.RequiresApi;
import android.support.v4.app.ActivityCompat;
import android.view.Surface;
import android.view.TextureView;
import android.widget.Toast; import com.admin.smartcam.service.SmartCamService; import java.io.File;
import java.io.IOException;
import java.util.Arrays; import static android.content.Context.CAMERA_SERVICE;
import static com.admin.smartcam.service.SmartCamService.handler; /**
* Created by Admin on 2017/6/2 0002.
*/ @RequiresApi(api = Build.VERSION_CODES.ICE_CREAM_SANDWICH)
public class TextureViewPreview extends TextureView implements TextureView.SurfaceTextureListener {
private Context context;
private CameraManager cameraManager;
private CameraDevice cameraDevice;
public static CaptureRequest.Builder mPreviewBuilder;
public static MediaRecorder mMediaRecorder;
public TextureViewPreview(Context context) {
super(context);
this.context = context;
setSurfaceTextureListener(this);
} @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int i, int i1) {
openCamera();
} @Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int i, int i1) { } @Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {
return true;
} @Override
public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) { } /**
* 第一步
*/
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
private boolean openCamera() {
cameraManager = (CameraManager) context.getSystemService(CAMERA_SERVICE);//获得相机服务
try {
String[] CameraIdList = cameraManager.getCameraIdList();
//获取可用相机设备列表
CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(CameraIdList[0]);
//在这里可以通过CameraCharacteristics设置相机的功能,须检查是否支持
characteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL);
//就像这样
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
return false;
}
try {
cameraManager.openCamera(CameraIdList[0], new CameraDevice.StateCallback() { @Override
public void onOpened(CameraDevice cameraDevice) {
startView(cameraDevice);
} @Override
public void onDisconnected(CameraDevice cameraDevice) {
cameraDevice.close();
} @Override
public void onError(CameraDevice cameraDevice, int i) {
cameraDevice.close();
}
}, handler); } catch (CameraAccessException e) {
e.printStackTrace();
}
return true;
} catch (CameraAccessException e) {
e.printStackTrace();
}
return true;
} /**
* 第二步
* 启动预览
*/
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
private void startView(CameraDevice cameraDevice) {
//setUpMediaRecorder();
SurfaceTexture surfaceTexture=this.getSurfaceTexture();
if (surfaceTexture!=null) {
Surface surface = new Surface(surfaceTexture);
try {
//预览请求
mPreviewBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
} catch (CameraAccessException e) {
e.printStackTrace();
}
mPreviewBuilder.addTarget(surface);
//mPreviewBuilder.addTarget(mMediaRecorder.getSurface());
try { cameraDevice.createCaptureSession(Arrays.asList(surface),
new AandroidCaptureSessionCallBack(), SmartCamService.handler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}else Toast.makeText(context,"那个为空我也很无奈啊!", Toast.LENGTH_SHORT).show();
} /**
* 设置录像
**/
private void setUpMediaRecorder() {
mMediaRecorder = new MediaRecorder();
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
mMediaRecorder.setProfile(CamcorderProfile.get(6));//设置分辨率为1080
mMediaRecorder.setOutputFile(initPath(getDate()).getAbsolutePath());
try {
mMediaRecorder.prepare();
//mMediaRecorder.start();
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 获取系统当前时间
*
* @return
*/
private String getDate() {
String savedate = null;
savedate = System.currentTimeMillis() + ".mp4";
return savedate;
} /**
* 初始化保存路径
*/
private static File initPath(String saverPath) {
File filesd = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES), saverPath);//在SD
File file=Environment.getDataDirectory();//获取手机内存目录
if (saverPath.equals("")) {
if (!filesd.exists()) {
filesd.mkdirs();
}
}
return file;
}
}
package com.admin.smartcam.androidcamera.camera2; import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraCaptureSession;
import android.hardware.camera2.CaptureRequest;
import android.os.Build;
import android.support.annotation.RequiresApi;
import android.widget.Toast; import com.admin.smartcam.main.MainActivity;
import com.admin.smartcam.service.SmartCamService; import static com.admin.smartcam.androidcamera.camera2.TextureViewPreview.mPreviewBuilder;
import static com.admin.smartcam.main.MainActivity.count; /**
* 第三步
* Created by Admin on 2017/4/23 0023.
* 将处理预览和拍照图片的工作
* 摄像头采集状态回调
*/ @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public class AandroidCaptureSessionCallBack extends CameraCaptureSession.StateCallback {
@Override
public void onConfigured(CameraCaptureSession cameraCaptureSession) {
try { mPreviewBuilder.set(CaptureRequest.CONTROL_AF_MODE,
CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
mPreviewBuilder.set(CaptureRequest.CONTROL_AE_MODE,
CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH); //cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
Toast.makeText(MainActivity.context,"AandroidCaptureSessionCallBack:>>>:"+count++, Toast.LENGTH_SHORT).show();
cameraCaptureSession.capture(mPreviewBuilder.build(),
new AndroidCaptureCallback(), SmartCamService.handler);//数据回掉接口
} catch (CameraAccessException e) {
e.printStackTrace();
}
} @RequiresApi(api = Build.VERSION_CODES.M)
@Override
public void onConfigureFailed(CameraCaptureSession cameraCaptureSession) {
// cameraCaptureSession.getInputSurface().lockCanvas(new Rect(1,1,1,11));
}
}
package com.admin.smartcam.androidcamera.camera2; import android.graphics.Bitmap;
import android.hardware.camera2.CameraCaptureSession;
import android.hardware.camera2.CaptureRequest;
import android.hardware.camera2.CaptureResult;
import android.hardware.camera2.TotalCaptureResult;
import android.os.Build;
import android.support.annotation.RequiresApi;
import android.util.Log; /**
* 第四步
* Created by Admin on 2017/4/23 0023.
* 包含两个状态,采集进行,采集完成
可以在这里面去做处理,
*数据回掉接口
*摄像头采集回话采集状态的回调
*/ @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public class AndroidCaptureCallback extends CameraCaptureSession.CaptureCallback {
//在onCaptureCompleted中处理数据
@Override
public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request,
TotalCaptureResult result) { int afState = result.get(CaptureResult.CONTROL_AF_STATE);
if (CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED == afState ||
CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED == afState
|| CaptureResult.CONTROL_AF_STATE_PASSIVE_FOCUSED == afState
|| CaptureResult.CONTROL_AF_STATE_PASSIVE_UNFOCUSED == afState) {
//do something like save picture
Bitmap bitmap=(Bitmap) request.getTag();
Log.d("数据处理》》", String.valueOf(bitmap.getHeight()));
for (CaptureResult rs : result.getPartialResults())
{
rs.getFrameNumber();
}
}
} @Override
public void onCaptureProgressed(CameraCaptureSession session, CaptureRequest request,
CaptureResult partialResult) { } }
MainActivity.java
frameLayout = (FrameLayout) findViewById(R.id.camera_FrameLayout);
textureViewPreview = new TextureViewPreview(this);
//textureViewPreview.setAlpha(0.5f);//设置透明度 frameLayout.addView(textureViewPreview); 布局:
<FrameLayout
android:id="@+id/camera_FrameLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"> </FrameLayout>
android camera2的更多相关文章
- Android Camera2采集摄像头原始数据并手动预览
Android Camera2采集摄像头原始数据并手动预览 最近研究了一下android摄像头开发相关的技术,也看了Google提供的Camera2Basic调用示例,以及网上一部分代码,但都是在Te ...
- Android Camera2 拍照(三)——切换摄像头,延时拍摄和闪光模式
原文:Android Camera2 拍照(三)--切换摄像头,延时拍摄和闪光模式 一.切换摄像头 在前后摄像头之间切换,首先需要关闭之前打开的摄像头,关闭preview,之后重新打开新的摄像头,重新 ...
- Android Camera2 拍照(四)——对焦模式
原文:Android Camera2 拍照(四)--对焦模式 本篇将重点介绍使用Camera2 API进行手动对焦的设置,以及在手动对焦与自动对焦模式之间切换. 一.手动对焦响应事件 首先我们要实现点 ...
- Android Camera2拍照(一)——使用SurfaceView
原文:Android Camera2拍照(一)--使用SurfaceView Camera2 API简介 Android 从5.0(21)开始,引入了新的Camera API Camera2,原来的a ...
- Android Camera2 拍照(二)——使用TextureView
原文:Android Camera2 拍照(二)--使用TextureView 上一篇博文简单介绍了使用Camera2 API拍摄照片,并使用SurfaceView作为预览界面.实际上,相对于Surf ...
- android Camera2 API使用详解
原文:android Camera2 API使用详解 由于最近需要使用相机拍照等功能,鉴于老旧的相机API问题多多,而且新的设备都是基于安卓5.0以上的,于是本人决定研究一下安卓5.0新引入的Came ...
- Android Camera2 拍照入门学习
原文:Android Camera2 拍照入门学习 学习资料: 肾虚将军android camera2 详解说明 极客学院android.hardware.camera2 使用指南 Android 5 ...
- Android Camera2/HAL3
Android : Camera2/HAL3 框架分析 https://www.cnblogs.com/blogs-of-lxl/p/10651611.html Android : Camera之ca ...
- Android Camera2 预览功能实现
1. 概述 最近在做一些关于人脸识别的项目,需要用到 Android 相机的预览功能.网上查阅相关资料后,发现 Android 5.0 及以后的版本中,原有的 Camera API 已经被 Camer ...
- Android : Camera2/HAL3 框架分析
一.Android O上的Treble机制: 在 Android O 中,系统启动时,会启动一个 CameraProvider 服务,它是从 cameraserver 进程中分离出来,作为一个独立进程 ...
随机推荐
- 【Codeforces Round #493 (Div. 2) B】Cutting
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 显然只有在前i个位置奇数偶数出现次数都相同的地方才能切. (且不管前面怎么切,这里都能切的. 那么就相当于有n个物品,每个物品的代价 ...
- redis 参数配置总结
redis.conf 配置项说明如下 1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程 daemonize no 2. 当Redis以守护进程方式运行时, ...
- OA项目知识总结
struts文件配置 --------------------------------------------------------- 配置c3po链接池 --------------------- ...
- substring类型题目的解题模板
https://discuss.leetcode.com/topic/30941/here-is-a-10-line-template-that-can-solve-most-substring-pr ...
- Android 自己定义View学习(2)
上一篇学习了基本使用方法,今天学一下略微复杂一点的.先看一下效果图 为了完毕上面的效果还是要用到上一期开头的四步 1,属性应该要有颜色,要有速度 <?xml version="1.0& ...
- hdu 4888 2014多校第三场1002 Redraw Beautiful Drawings 网络流
思路:一開始以为是高斯消元什么的.想让队友搞,结果队友说不好搞,可能是网络流.我恍然,思路立刻就有了. 我们建一个二部图.左边是行,右边是列,建个源点与行建边,容量是该行的和.列与新建的汇点建边.容量 ...
- hdu 4603 Color the Tree
这道题细节真的非常多 首先能够想到a和b的最优策略一定是沿着a和b在树上的链走,走到某个点停止,然后再依次占据和这个点邻接的边 所以,解决这道题的过程例如以下: 预处理阶段: step 1:取随意一个 ...
- 常用的Linux 命令
来源于面试 求一条linux命令:查找当前目录下所有含有字符串type="json",文件名以.xml的所有文件 find . -name "*.xml"|xa ...
- JAVA Excel API学习案例
先贴代码吧,执行一下.看看效果,然后看看凝视,再看看代码后面的基础介绍 创建一个新excel并写入数据: public static void myExcel2() throws IOExceptio ...
- When Cyber Security Meets Machine Learning 机器学习 安全分析 对于安全领域的总结很有用 看未来演进方向
链接:http://ucys.ugr.es/jnic2016/docs/MachineLearning_LiorRokachJNIC2016.pdf https://people.eecs.berke ...