控件:

import android.view.TextureView;

这个是代码:

https://github.com/plumcot/Camera2Demo/blob/master/src/com/example/camera2demo/Camera2Demo.java

获取图片数据不对,应该是:

private void setupImageReader() {//前三个参数分别是需要的尺寸和格式,最后一个参数代表每次最多获取几帧数据,本例的2代表ImageReader中最多可以获取两帧图像流mImageReader = ImageReader.newInstance(mPreviewSize.getWidth(), mPreviewSize.getHeight(),ImageFormat.JPEG, 2);//监听ImageReader的事件,当有图像流数据可用时会回调onImageAvailable方法,它的参数就是预览帧数据,可以对这帧数据进行处理mImageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() {@Overridepublic void onImageAvailable(ImageReader reader) {Image image = reader.acquireLatestImage();//我们可以将这帧数据转成字节数组,类似于Camera1的PreviewCallback回调的预览帧数据ByteBuffer buffer = image.getPlanes()[0].getBuffer();byte[] data = new byte[buffer.remaining()];buffer.get(data);image.close();}}, null);
}
package com.mtcnn_as;import java.nio.ByteBuffer;
import java.util.Arrays;import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.ImageFormat;
import android.graphics.Matrix;
import android.graphics.SurfaceTexture;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraCaptureSession;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CameraDevice;
import android.hardware.camera2.CameraManager;
import android.hardware.camera2.CaptureRequest;
import android.hardware.camera2.params.StreamConfigurationMap;
import android.media.Image;
import android.media.ImageReader;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.util.Log;
import android.util.Size;
import android.view.Surface;
import android.view.TextureView;
import static com.mtcnn_as.ImageUtils.saveBitmap;
public class Camera2Demo extends Activity implementsTextureView.SurfaceTextureListener {private CameraDevice mCamera;private String mCameraID = "1";private TextureView mPreviewView;private Size mPreviewSize;private CaptureRequest.Builder mPreviewBuilder;private ImageReader mImageReader;private Handler mHandler;private HandlerThread mThreadHandler;// 这里定义的是ImageReader回调的图片的大小private int mImageWidth = 1920;private int mImageHeight = 1080;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_texture);initView();initLooper();}// 很多过程都变成了异步的了,所以这里需要一个子线程的looperprivate void initLooper() {mThreadHandler = new HandlerThread("CAMERA2");mThreadHandler.start();mHandler = new Handler(mThreadHandler.getLooper());}// 可以通过TextureView或者SurfaceViewprivate void initView() {mPreviewView = (TextureView) findViewById(R.id.textureView);mPreviewView.setSurfaceTextureListener(this);}@Overridepublic void onSurfaceTextureAvailable(SurfaceTexture surface, int width,int height) {try {// 获得所有摄像头的管理者CameraManagerCameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);// 获得某个摄像头的特征,支持的参数CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(mCameraID);// 支持的STREAM CONFIGURATIONStreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);// 摄像头支持的预览Size数组mPreviewSize = map.getOutputSizes(SurfaceTexture.class)[0];if (ContextCompat.checkSelfPermission(Camera2Demo.this,Manifest.permission.CAMERA)!= PackageManager.PERMISSION_GRANTED ||ContextCompat.checkSelfPermission(Camera2Demo.this,Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(Camera2Demo.this,new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE},1);}// 打开相机if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {// TODO: Consider calling//    ActivityCompat#requestPermissions// here to request the missing permissions, and then overriding//   public void onRequestPermissionsResult(int requestCode, String[] permissions,//                                          int[] grantResults)// to handle the case where the user grants the permission. See the documentation// for ActivityCompat#requestPermissions for more details.return;}cameraManager.openCamera(mCameraID, mCameraDeviceStateCallback, mHandler);} catch (CameraAccessException e) {e.printStackTrace();}}@Overridepublic void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width,int height) {}@Overridepublic boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {return false;}// 这个方法要注意一下,因为每有一帧画面,都会回调一次此方法@Overridepublic void onSurfaceTextureUpdated(SurfaceTexture surface) {}private CameraDevice.StateCallback mCameraDeviceStateCallback = new CameraDevice.StateCallback() {@Overridepublic void onOpened(CameraDevice camera) {try {mCamera = camera;startPreview(mCamera);} catch (CameraAccessException e) {e.printStackTrace();}}@Overridepublic void onDisconnected(CameraDevice camera) {}@Overridepublic void onError(CameraDevice camera, int error) {}};// 开始预览,主要是camera.createCaptureSession这段代码很重要,创建会话private void startPreview(CameraDevice camera) throws CameraAccessException {SurfaceTexture texture = mPreviewView.getSurfaceTexture();// 这里设置的就是预览大小texture.setDefaultBufferSize(mPreviewSize.getWidth(),mPreviewSize.getHeight());Surface surface = new Surface(texture);try {// 设置捕获请求为预览,这里还有拍照啊,录像等mPreviewBuilder = camera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);} catch (CameraAccessException e) {e.printStackTrace();}// 就是在这里,通过这个set(key,value)方法,设置曝光啊,自动聚焦等参数!! 如下举例:// mPreviewBuilder.set(CaptureRequest.CONTROL_AE_MODE,CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);mImageReader = ImageReader.newInstance(mImageWidth, mImageHeight,ImageFormat.JPEG/* 此处还有很多格式,比如我所用到YUV等 */, 2/** 最大的图片数,* mImageReader里能获取到图片数* ,* 但是实际中是2+1张图片,就是多一张*/);mImageReader.setOnImageAvailableListener(mOnImageAvailableListener,mHandler);// 这里一定分别add两个surface,一个Textureview的,一个ImageReader的,如果没add,会造成没摄像头预览,或者没有ImageReader的那个回调!!mPreviewBuilder.addTarget(surface);mPreviewBuilder.addTarget(mImageReader.getSurface());camera.createCaptureSession(Arrays.asList(surface, mImageReader.getSurface()),mSessionStateCallback, mHandler);}private CameraCaptureSession.StateCallback mSessionStateCallback = new CameraCaptureSession.StateCallback() {@Overridepublic void onConfigured(CameraCaptureSession session) {try {updatePreview(session);} catch (CameraAccessException e) {e.printStackTrace();}}@Overridepublic void onConfigureFailed(CameraCaptureSession session) {}};private void updatePreview(CameraCaptureSession session)throws CameraAccessException {session.setRepeatingRequest(mPreviewBuilder.build(), null, mHandler);}private ImageReader.OnImageAvailableListener mOnImageAvailableListener = new ImageReader.OnImageAvailableListener() {/*** 当有一张图片可用时会回调此方法,但有一点一定要注意: 一定要调用* reader.acquireNextImage()和close()方法,否则画面就会卡住!!!!!我被这个坑坑了好久!!!* 很多人可能写Demo就在这里打一个Log,结果卡住了,或者方法不能一直被回调。**/@Overridepublic void onImageAvailable(ImageReader reader) {long startTime = System.currentTimeMillis(); //起始时间Image img = reader.acquireNextImage();/*** 因为Camera2并没有Camera1的Priview回调!!!所以该怎么能到预览图像的byte[]呢?就是在这里了!!!* 我找了好久的办法!!!**/ByteBuffer buffer = img.getPlanes()[0].getBuffer();// 这里就是图片的byte数组了byte[] bytes = new byte[buffer.remaining()];buffer.get(bytes);img.close();Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);Matrix matrix = new Matrix();matrix.postRotate(270);
//                        matrix.postScale( 1/2,  1/2); // 长和宽放大缩小的比例Bitmap bimap1 = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);int faceInfo[] = null;Bitmap rgba = bimap1.copy(Bitmap.Config.ARGB_8888, true);long endTime = System.currentTimeMillis(); //结束时间int width = rgba.getWidth();int height = rgba.getHeight();byte[] imageDate = getPixelsRGBA(rgba);long endTime2 = System.currentTimeMillis(); //结束时间saveBitmap(getApplicationContext(),rgba);Log.e("test", String.format("方法使用时间 %d %d ms", endTime - startTime,endTime2-startTime));}};//提取像素点private byte[] getPixelsRGBA(Bitmap image) {// calculate how many bytes our image consists ofint bytes = image.getByteCount();ByteBuffer buffer = ByteBuffer.allocate(bytes); // Create a new bufferimage.copyPixelsToBuffer(buffer); // Move the byte data to the bufferbyte[] temp = buffer.array(); // Get the underlying array containing thereturn temp;}protected void onPause() {if (null != mCamera) {mCamera.close();mCamera = null;}if (null != mImageReader) {mImageReader.close();mImageReader = null;}super.onPause();}
}

android Camera2相关推荐

  1. android camera2获取摄像头支持的分辨率

    android camera2 获取摄像头支持的分辨率 41的for循环我注释了,代码是获取最匹配的分辨率. private Size getMatchingSize2(){Size selectSi ...

  2. Android Camera2 拍照(四)——对焦模式

    原文:Android Camera2 拍照(四)--对焦模式 本篇将重点介绍使用Camera2 API进行手动对焦的设置,以及在手动对焦与自动对焦模式之间切换. 一.手动对焦响应事件 首先我们要实现点 ...

  3. android camera捕捉,通过android camera2 API捕捉4:3相机图片与16:9传感器阵列相机

    我想从使用Camera2 API(Android 5.0版本中添加)的Android fron-facing相机以4:3的宽高比捕捉视频.它工作正常,除非相机有16:9传感器阵列(作为三星Galaxy ...

  4. 如何实现RTMP推送Android Camera2数据

    Camera2简介 在Google 推出Android 5.0的时候, Android Camera API 版本升级到了API2(android.hardware.camera2), 之前使用的AP ...

  5. android Camera2 API使用详解

    原文:android Camera2 API使用详解 由于最近需要使用相机拍照等功能,鉴于老旧的相机API问题多多,而且新的设备都是基于安卓5.0以上的,于是本人决定研究一下安卓5.0新引入的Came ...

  6. Android Camera2 教程 · 第三章 · 预览

    Android Camera2 教程 · 第三章 · 预览 DarylGo关注 Android Camera 上一章<Camera2 开启相机>我们学习了如何开启和关闭相机,接下来我们来学 ...

  7. 【Android Camera2】玩转图像数据 -- NV21图像旋转,镜像,转rgba代码分析,性能优化

    [Android Camera2]玩转图像数据 业务场景介绍 NV21数据旋转 逐像素遍历法 NV21数据镜像 逐像素遍历法 中心翻转法 NV21转RGB/RGBA数据 逐像素遍历法 NV21组合操作 ...

  8. Android camera2对焦设置

    在android camera2 api 开始,提供了对焦距值(非zoom值)的设置,大概步骤如下: (1)先关闭自动焦距模式    mPreviewBuilder.set(CaptureReques ...

  9. android camera2 API流程分析

    Android camera2 API流程分析 Android5.0之后,新推出来了一个类,android.hardware.camera2,与原来的camera的类实现照相和拍视频的流程有所不同,原 ...

  10. android camera 对焦大小,Android camera2对焦设置

    在android camera2 api 开始,提供了对焦距值(非zoom值)的设置,大概步骤如下: (1)先关闭自动焦距模式    mPreviewBuilder.set(CaptureReques ...

最新文章

  1. python的kite下载安装及使用_Kite下载|Kite Python编程工具 V1.2020.1203.0 最新版下载 - 下载银行...
  2. epoll原理_Epoll源码阅读手札
  3. 设计企业网站大纲_深圳企业网站设计公司|品牌网站设计【尼高网站设计】
  4. Glib2之dbus用法(五)
  5. lua 面向对象入门
  6. 数字孪生智慧城市信息化平台建设
  7. 台电平板teclast X16HD碎屏拆机更换日志
  8. 你不一定知道这个用 Python 快速设置 Excel 表格边框的技巧
  9. 弹指间,网页灰飞烟灭——Google灭霸彩蛋实现
  10. java中左移运算符解释_java左移右移运算符
  11. 思岚科技—SLAMTEC将自家研发技术应用到更多行业中
  12. c语言如何标志置1与置0,c语言对于文本的基本操作
  13. MSSQL数据库安全实验
  14. windowsthinpc虚拟内存_瘦身版Win7:WinTPC深入体验
  15. Oracle 11g RAC 搭建详细步骤
  16. intellij 关闭自动保存和标志修改文件为星号
  17. 行业洞察 | 爱聊天的虚拟人
  18. 带通 带阻滤波器 幅频响应_一文带你通俗理解幅频响应和相频响应
  19. Linux下scp命令加强版 优化scp命令 批量对多个Linux主机传输文件
  20. java 匿名类 构造方法_Java中接口式的匿名内部类的构造方法

热门文章

  1. malloc,calloc,realloc,free函数
  2. PCA--主成分分析(Principal components analysis)-最大方差解释
  3. OpenStack使用neutron agent-list缺少组件
  4. 模块加载过程代码分析1
  5. java远程桌面图片压缩问题_java用Socket实现的远程桌面浏览 内存溢出问题
  6. coco数据集大小分类_如何处理不平衡数据集的分类任务
  7. upgrade mysql client_The mysql_upgrade client is now deprecated(mysql_upgrade客户机现在已经弃用)...
  8. 半连接队列 全连接队列??
  9. char* p = 123,字符串在内存中的哪个位置?
  10. 利用Mininet进行VxLAN验证实验