android surfaceview camera,android – 如何在SurfaceView上显示相机预览?
要使用Camera2 API从相机显示预览,您应该执行以下步骤:
>获得使用相机设备的权限
>使用CameraManager打开与相机的连接
准备表面预览
>使用打开的相机设备和所需的曲面(它不仅可以包括预览曲面)创建CaptureSession
> CaptureSession创建后,您需要创建并配置CaptureRequest并将其提交给CaptureSession
需要注意的是,准备表面和打开连接到相机是独立的过程,所以您需要确保它们都是在创建CaptureSession之前完成的.
以下是在屏幕上显示相机预览的活动示例:
public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback,Handler.Callback {
static final String TAG = "CamTest";
static final int MY_PERMISSIONS_REQUEST_CAMERA = 1242;
private static final int MSG_CAMERA_OPENED = 1;
private static final int MSG_SURFACE_READY = 2;
private final Handler mHandler = new Handler(this);
SurfaceView mSurfaceView;
SurfaceHolder mSurfaceHolder;
CameraManager mCameraManager;
String[] mCameraIDsList;
CameraDevice.StateCallback mCameraStateCB;
CameraDevice mCameraDevice;
CameraCaptureSession mCaptureSession;
boolean mSurfaceCreated = true;
boolean mIsCameraConfigured = false;
private Surface mCameraSurface = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.mSurfaceView = (SurfaceView) findViewById(R.id.SurfaceViewPreview);
this.mSurfaceHolder = this.mSurfaceView.getHolder();
this.mSurfaceHolder.addCallback(this);
this.mCameraManager = (CameraManager) this.getSystemService(Context.CAMERA_SERVICE);
try {
mCameraIDsList = this.mCameraManager.getCameraIdList();
for (String id : mCameraIDsList) {
Log.v(TAG,"CameraID: " + id);
}
} catch (CameraAccessException e) {
e.printStackTrace();
}
mCameraStateCB = new CameraDevice.StateCallback() {
@Override
public void onOpened(CameraDevice camera) {
Toast.makeText(getApplicationContext(),Toast.LENGTH_SHORT).show();
mCameraDevice = camera;
mHandler.sendEmptyMessage(MSG_CAMERA_OPENED);
}
@Override
public void onDisconnected(CameraDevice camera) {
Toast.makeText(getApplicationContext(),Toast.LENGTH_SHORT).show();
}
@Override
public void onError(CameraDevice camera,int error) {
Toast.makeText(getApplicationContext(),Toast.LENGTH_SHORT).show();
}
};
}
@Override
protected void onStart() {
super.onStart();
//requesting permission
int permissionCheck = ContextCompat.checkSelfPermission(this,Manifest.permission.CAMERA);
if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.CAMERA)) {
} else {
ActivityCompat.requestPermissions(this,MY_PERMISSIONS_REQUEST_CAMERA);
Toast.makeText(getApplicationContext(),Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(getApplicationContext(),Toast.LENGTH_SHORT).show();
try {
mCameraManager.openCamera(mCameraIDsList[1],mCameraStateCB,new Handler());
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
}
@Override
protected void onStop() {
super.onStop();
try {
if (mCaptureSession != null) {
mCaptureSession.stopRepeating();
mCaptureSession.close();
mCaptureSession = null;
}
mIsCameraConfigured = false;
} catch (final CameraAccessException e) {
// Doesn't matter,cloising device anyway
e.printStackTrace();
} catch (final IllegalStateException e2) {
// Doesn't matter,cloising device anyway
e2.printStackTrace();
} finally {
if (mCameraDevice != null) {
mCameraDevice.close();
mCameraDevice = null;
mCaptureSession = null;
}
}
}
@Override
public boolean handleMessage(Message msg) {
switch (msg.what) {
case MSG_CAMERA_OPENED:
case MSG_SURFACE_READY:
// if both surface is created and camera device is opened
// - ready to set up preview and other things
if (mSurfaceCreated && (mCameraDevice != null)
&& !mIsCameraConfigured) {
configureCamera();
}
break;
}
return true;
}
private void configureCamera() {
// prepare list of surfaces to be used in capture requests
List sfl = new ArrayList();
sfl.add(mCameraSurface); // surface for viewfinder preview
// configure camera with all the surfaces to be ever used
try {
mCameraDevice.createCaptureSession(sfl,new CaptureSessionListener(),null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
mIsCameraConfigured = true;
}
@Override
public void onRequestPermissionsResult(int requestCode,@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode,grantResults);
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_CAMERA:
if (ActivityCompat.checkSelfPermission(this,Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED)
try {
mCameraManager.openCamera(mCameraIDsList[1],new Handler());
} catch (CameraAccessException e) {
e.printStackTrace();
}
break;
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
mCameraSurface = holder.getSurface();
}
@Override
public void surfaceChanged(SurfaceHolder holder,int height) {
mCameraSurface = holder.getSurface();
mSurfaceCreated = true;
mHandler.sendEmptyMessage(MSG_SURFACE_READY);
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
mSurfaceCreated = false;
}
private class CaptureSessionListener extends
CameraCaptureSession.StateCallback {
@Override
public void onConfigureFailed(final CameraCaptureSession session) {
Log.d(TAG,"CaptureSessionConfigure Failed");
}
@Override
public void onConfigured(final CameraCaptureSession session) {
Log.d(TAG,"CaptureSessionConfigure onConfigured");
mCaptureSession = session;
try {
CaptureRequest.Builder previewRequestBuilder = mCameraDevice
.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
previewRequestBuilder.addTarget(mCameraSurface);
mCaptureSession.setRepeatingRequest(previewRequestBuilder.build(),null,null);
} catch (CameraAccessException e) {
Log.d(TAG,"setting up preview Failed");
e.printStackTrace();
}
}
}
}
android surfaceview camera,android – 如何在SurfaceView上显示相机预览?相关推荐
- Android openGl开发详解(二)——通过SurfaceView,TextureView,GlSurfaceView显示相机预览(附Demo)
最近公司在做自定义相机这一块,之前使用的是第三方,后来需求变更,第三方不支持添加动态贴纸,所以只能自己扩展.当然网上有很多例子,但是关于添加动态贴纸的例子几乎找不到,反正我是没找到(欲哭无泪).当然, ...
- 关于SurfaceView相机预览获取Bitmap的方法
为什么80%的码农都做不了架构师?>>> 昨天在网上找了很久SurfaceView截屏方法,canvas转bitmap方法...... 发现国内网站上太多坑了!!!Google ...
- Android Camera2 相机预览、获取数据
Camera2简要说明 在Google 推出Android 5.0的时候, Android Camera API 版本升级到了API2(android.hardware.camera2),大幅提高了A ...
- 2022-07-21 Android 相机预览数据转Bitmap优化
背景 在Android开发中我们有时候会需要拿到相机预览数据转成bitmap自己做处理. 常用方式 在Android API中提供了 一套转换方式: private Bitmap convertBit ...
- Android Camera API/Camera2 API 相机预览及滤镜、贴纸等处理
Android Lollipop 增加了Camera2 API,并将原来的Camera API标记为废弃了.相对原来的Camera API来说,Camera2是重新定义的相机 API,也重构了相机 A ...
- android拍照保存照片方向,Android:Camera2开发详解(上):实现预览、拍照、保存照片等功能...
android.jpg 前言 在前几篇文章中介绍了如何调用系统相机拍照和使用Camera1的实现自定义相机拍照.人脸检测等功能 文章传送门: 接下来的几篇文章中,我将给大家介绍如何使用Camera2实 ...
- android预览摄像头,Android上的摄像头预览处理
我正在Android上为我的机器人制作线路跟随者(学习Java/Android编程),目前我正面临图像处理问题:摄像头预览返回一个名为YUV的图像格式,I想要将其转换为阈值以便知道线路的位置,那么该怎 ...
- android开发自动拍照,Android:Camera2开发详解(上):实现预览、拍照、保存照片等功能...
android.jpg 前言 在前几篇文章中介绍了如何调用系统相机拍照和使用Camera1的实现自定义相机拍照.人脸检测等功能 文章传送门: 接下来的几篇文章中,我将给大家介绍如何使用Camera2实 ...
- Android相机预览设置适配及显示方式
Android相机的部分工作原理. 预览流程 相机预览是Android Camera最常用的功能之一,它是很多功能重要的输入,例如扫码.AR等. 一般而言,相机预览的整体流程,可以通过下图表示: 其中 ...
最新文章
- Java正则入门(1)——去除字符串头尾空格
- 下列关于python字典变量的定义中错误的是_python练习题-day14
- grpc_模型服务:流处理与使用Java,gRPC,Apache Kafka,TensorFlow的RPC / REST
- 后端服务不得不了解之限流
- 重载-运算符(感觉怪怪的)
- Flutter升级到1.12填坑指南
- python脚本编程100例_python100例,python经典例题
- javascript学习笔记_function
- master分支 合并到main_10 月 1 日后,GitHub 默认分支不再叫master!
- php栏目树,php生成无限栏目树的代码实例分享
- JAVA 程序员需要用到 10 个测试框架和库
- 极简代码(六)—— 返回 0/1 构成的布尔向量
- 【渝粤教育】国家开放大学2018年春季 3717-22T天然气管道长输技术 参考试题
- linux计算机网络一般需要配置哪几部分,计算机网络技术 知识及应用第4章Linux操作系统和常用服务器配置.ppt...
- 游戏公司2022秋招记录
- 数字信号处理常见知识点汇总
- window双网卡上网
- Zemax自学--2(Zemax软件总览)
- response设置token
- WKWebView加载txt文档乱码
热门文章
- 快速傅里叶变换应用之二 hdu 4609 3-idiots
- java简单自定义Annotation
- gridview获取选中行数据_Word转Excel,不想熬夜加班,那就掌握这个数据清洗方法...
- vs设计窗口不见了_碳纤维的巅峰:VS沛纳海616V3
- 什么样的项目是成功的?
- Mysql 使用正则表达式
- 什么是mybatis,mybatis有什么特点
- 使用循环链表实现一个通讯录的管理程序_【LeetCode链表题型总结】
- Java Vector setElementAt()方法与示例
- 非你莫属 java全球排名_TIOBE:2018年5月全球编程语言排行榜