android textureview camera,textureview_learn

Android TextureView和Camera的基本用法

1. 简介

该工程采用TextureView和Camera实时显示手机前置相机的预览图像,通过该工程,可以学会TextureView和Camera的基本用法,如:

TextureView常用函数有哪些,怎么与Camera关联起来

Camera接口的基本使用方式

TextureView和Camera的相关知识点

2. TextureView基本用法

Android的TextureView可以将内容流直接投影到View中,可以用于实现LivePreview等功能,和SurfaceView不同,它不会在WMS中

单独创建窗口,而是作为View hierachy中的一个普通View,因此可以和其它普通View一样进行移动,旋转,缩放,动画等变化。

关键代码

获取实例

m_textureView = findViewById(R.id.texture_view);

实现SurfaceTextureListener

m_textureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() {

@Override

public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int i, int i1) {

Log.d(TAG, "onSurfaceTextureAvailable: ");

m_surface = new Surface(surfaceTexture);

m_surface_lsit.add(m_surface);

}

@Override

public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int i, int i1) {

Log.d(TAG, "onSurfaceTextureSizeChanged: ");

}

@Override

public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {//画面退出时调用(onDestroy)

Log.d(TAG, "onSurfaceTextureDestroyed: ");

return false;

}

@Override

public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) {

Log.d(TAG, "onSurfaceTextureUpdated: ");

}

});

3 Camera基本用法(Camera2 API)

关键代码

获取CameraManager实例,并实现AvailabilityCallback回调

private CameraManager.AvailabilityCallback m_availabilityCallback = new CameraManager.AvailabilityCallback() {

@Override

public void onCameraAvailable(String cameraId) {//"0" 代表后置摄像头, "1" 代表前置摄像头

Log.d(TAG, "onCameraAvailable cameraId : " + cameraId);

}

@Override

public void onCameraUnavailable(String cameraId) {

Log.d(TAG, "onCameraUnavailable cameraId : " + cameraId);

}

};

m_handlerThread = new HandlerThread("CameraBackground");

m_handlerThread.start();

m_handler = new Handler(m_handlerThread.getLooper());

m_cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);

m_cameraManager.registerAvailabilityCallback(m_availabilityCallback, m_handler);

```java

打开手机前置摄像头

```java

if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {//Camera权限验证

return;

}

try {

Log.d(TAG, "onClick: m_cameraID : " + m_cameraID);

m_cameraManager.openCamera("0", m_stateCallback, m_handler);//强制设置为:后置摄像头

} catch (CameraAccessException e) {

e.printStackTrace();

}

```java

设置预览请求

```java

private CameraDevice.StateCallback m_stateCallback = new CameraDevice.StateCallback() {

@Override

public void onOpened(CameraDevice cameraDevice) {//Camrea打开成功时回调

Log.d(TAG, "onOpened: ");

m_cameraDevice = cameraDevice;

try {//设置预览请求

m_captureRequestBuilder = m_cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);

m_captureRequestBuilder.addTarget(m_surface);//与TextureView的Surface与Camera请求关联

m_cameraDevice.createCaptureSession(m_surface_lsit, m_cameraCaptureStateCallback, m_handler);

} catch (CameraAccessException e) {

e.printStackTrace();

}

}

@Override

public void onDisconnected(CameraDevice cameraDevice) {

Log.d(TAG, "onDisconnected: ");

}

@Override

public void onError(CameraDevice cameraDevice, int i) {

Log.d(TAG, "onError: ");

}

@Override

public void onClosed(CameraDevice camera) {

super.onClosed(camera);

Log.d(TAG, "onClosed: ");

}

};

开始预览

private CameraCaptureSession.StateCallback m_cameraCaptureStateCallback = new CameraCaptureSession.StateCallback() {

@Override

public void onConfigured(CameraCaptureSession cameraCaptureSession) {

Log.d(TAG, "onConfigured: ");

m_cameraCaptureSession = cameraCaptureSession;

try {

// 设置连续自动对焦

m_captureRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);

// 设置关闭闪光灯

m_captureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.FLASH_MODE_OFF);

// 生成一个预览的请求

m_captureRequest = m_captureRequestBuilder.build();

// 开始预览,即设置反复请求

m_cameraCaptureSession.setRepeatingRequest(m_captureRequest, null, m_handler);

} catch (CameraAccessException e) {

e.printStackTrace();

}

}

@Override

public void onConfigureFailed(CameraCaptureSession cameraCaptureSession) {

Log.d(TAG, "onConfigureFailed: ");

}

};

4. 相关知识点

TextureView知识点

必须开启硬件加速(这个默认就是开启的)

可以像常规视图(View)那样使用它,包括进行平移、缩放等操作

实现SurfaceTextureListener接口,监控SurfaceTexture 的各种状态

调用TextureView的draw方法时,如果还没有初始化SurfaceTexture,那么就会初始化它,初始化好时,就会回调onSurfaceTextureAvailable,表示可以接收外界的绘制指令了,然后SurfaceTexture会以GL纹理信息更新到TextureView对应的HardwareLayer中

接收外界的绘制指令的方式通常有两种,Surface提供dequeueBuffer/queueBuffer等硬件渲染接口和lockCanvas/unlockCanvasAndPost等软件渲染接口,使内容流的源可以往BufferQueue中填graphic buffer

接收视频流的对象是SurfaceTexture,本质上是Surface,而不是textureView,textureView只是作为一个硬件加速层来展示

textureView的接口setSurfaceTexture可以设置SurfaceTexture,达到复用的目的

Camera知识点

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值