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();

}

}

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/551057.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

移除apt源_apt提示处理归档 (--unpack)时出错的解决办法

#apt##Ubuntu##Debian#1、问题现象今天在升级软件的时候遇到一个错误,如下:rootx:~# apt --fix-broken install正在读取软件包列表... 完成正在分析软件包的依赖关系树 正在读取状态信息... 完成 正在修复依赖关系... 完成下列软件包是自动安装的并且现…

英雄无敌3高清 Android,安卓TOP10:《英雄无敌3》高清重制版上架

安卓TOP10:TOP.5《人体保卫战(Defend Your Life!)》《人体保卫战(Defend Your Life!)》是一款策略塔防游戏。游戏中,玩家压迫扮演保护人体健康的哨兵总指挥,保护体内极为重要的免疫系统,与各种细菌和病毒展开对垒攻防,…

mysql 重启_mysql重启的问题

一.问题描述今天直接重启了用户中心库的mysql进程,数据库起来后,一直报错Too many connections。机器负载飙升到100了。登陆到mysql中,发现很多连接的状态都是logging slow query,分析慢查询日志,发现那段时间内慢查询有7万多。二…

android 滑动接听源码,android仿摩拜单车APP、炫酷RecyclerView、卡片滑动、仿饿了么点餐、自定义索引等源码...

Android精选源码Android优质博客前言permissions4m 最初的设计是仅仅做成一个编译器注解框架,在1.0.0版本时,它纯粹地实现了原生 Android 请求流程,关于它的设计思路可以查看这篇如何打造一个 Android 编译时注解框架。但是当投入笔者自己项目…

zip版mysql5.6_mysql 5.6 压缩包版安装方法

Mysql安装的时候可以有msi安装和zip解压缩两种安装方式。zip压缩包解压到目录,要使用它还需对它进行一定的配置。下面对Mysql压缩包版的安装方法进行详细的描述,要是此文有不正确的认识,希望大家指正,非常感谢。一、下载mysql压缩…

鸿蒙系统 产品,华为首款鸿蒙系统产品成行业公敌!只因开机无广告:遭十大品牌批评...

【4月6日讯】随着荣耀30s手机正式发布,全新的麒麟820处理器也是再次给我们带来了巨大惊喜,毫无疑问,麒麟820处理器将会继续继承麒麟810处理器的“神U”特质,成为5G网络时代的新一代中端“神U”,但在荣耀30s发布会上&am…

行列转换的帖子mysql_[转载]mysql行列转换方法总结  (转)

数据样本:create tabletx(id int primary key,c1 char(2),c2 char(2),c3 int);insert into txvalues(1 ,A1,B1,9),(2 ,A2,B1,7),(3 ,A3,B1,4),(4 ,A4,B1,2),(5 ,A1,B2,2),(6 ,A2,B2,9),(7 ,A3,B2,8),(8 ,A4,B2,5),(9 ,A1,B3,1),(10 ,A2,B3,8),(11 ,A3,B3,8),(12 ,A4…

mysql 查询一个月的时间_mysql日期查询sql语句总结(查询一天,查询一周,查询一个月的数据)...

我的日期首先我们获取到的日期格式是这样的:2009-2-12或者2009-3-3或者2009-10-12,我们在组合sql语句的时候可以这样:(分了三个例子)代码如下1select * from user where birthday>2009-2-3 and birthday这样我们能够查到所有包括2009-2-3并…

html在线摄像头,在HTML里加载摄像头的方法

效果图: 整体效果:视频加载:拍照:第一步:创建HTML元素首先,我们要创建一个HTML5的文档。无标题文档然后在插入以下代码:截图第二步:创建JavaScript首先,要在里创建一个JavaScript&am…

node mysql 跨库查询_nodejs 在mongodb在跨数据库之中如何进行关联起来查询,并且支持筛选关联表的条件进行查询...

"班级数据库": "mongodb://192.168.3.17/xxx"学生数据库": "mongodb://192.168.3.99/xxx (只读)使用 mongoose.createConnection 进行链接2个数据库classId 是唯一并且不会重复的。学生数据库是只读的,并且数量非常大,并随…

html5群组选择器,css选择器

基本选择器通配选择器选择器:*类型:通配选择器含义:选择文档中所有的HTML元素元素选择器选择器:E类型:元素选择器含义:选择指定类型的HTML元素ID选择器选择器:#ID类型:ID选择器含义&…

html风车相册代码,Css Html 大风车(示例代码)

简介这篇文章主要介绍了Css Html 大风车(示例代码)以及相关的经验技巧,文章约3675字,浏览量138,点赞数2,值得参考!div{ border-radius: 50%;position: absolute; }.red{border-top:100px solid red;border-right: 100p…

mysql 视图 教程_MySQL视图简介及基本操作教程

前言视图是数据库系统中一种非常有用的数据库对象。MySQL 5.0 之后的版本添加了对视图的支持。认识视图视图是一个虚拟表,其内容由查询定义。同真实表一样,视图包含一系列带有名称的列和行数据,但视图并不是数据库真实存储的数据表。视图是从…

计算机科学导论考试A卷试题,09级计算机科学导论A卷答案

《计算机科学导论》试卷A参考答案一、单选题:(每题1分,共30分)1~5 CBCCD 6~10 ABABC 11~15 DCCDD 16~20 BBBAC 21~25 DDCDC 26~30 ACABC二、填空题:(每空1分,共20分) 1.322.ROM RAM 3.地址4&…

java中连接mysql数据库_java中怎么连接mysql数据库

展开全部import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.text.SimpleDateFormat;import java.util.Date;public class JDBCMySQL {// 驱动程序就是之前在classpath中配置的jdbc的驱动程序的jar包中public static fi…

html文件打开多出很多数字,【求助】页面上显示几个数字,打开html的时候希望能滚动起来...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼*{padding: 0;margin: 0;}div{width:60px;height:50px;border:1px solid red;overflow: hidden;position: relative;margin: 200px 400px;}ul{width:200px;height:20px;float:left;position: absolute;}li{width:10px;height:20px;…

word 转 html cms,Java 将Word文件转换为HTML格式文件

前言:在很多时候我们都需要到项目中导入word文档,但是后期再次在前段显示这个文档的时候前端往往需要的是html格式的,所以这个时候就会提出一个需求: 你们存文档的时候能不能存成html格式的? 于是这篇文章的内容就可以…

mysql 中函数如何转存_mysql 导入导出数据库以及函数、存储过程 【转】

MySQL常用导出数据命令:1.mysql导出整个数据库mysqldump -hhostname -uusername -ppassword databasename > backupfile.sqlmysqldump -hlocalhost -uroot hqgr> hqgr.sql (如果root用户没用密码可以不写-p,当然导出的sql文件你可以制定一个路…

1500度的近视能学计算机吗,1500度近视考驾照,近视多少度不能考驾照

情人眼里出西施,所以眼睛的地位真的无可替代,让我们认识了这个五彩缤纷的世界。但是也有一批深度近视的人群,他们也想像常人一样考取驾照,掌握这个社会的基本技能。有的人说近视1500度不能考取驾照,真的是这样吗&#…

mysql怎样实现先判断后联合_MYSQ创建联合索引,字段的先后顺序,对查询的影响分析...

MYSQ创建联合索引,字段的先后顺序,对查询的影响分析前言对于联合索引我们知道,在使用的时候有一个最左前缀的原则,除了这些呢,比如字段放置的位置,会不会对索引的效率产生影响呢?最左匹配原则联…