在使用android设备的摄像头的时候我们有两种选择:

1.调用intent方法使用摄像头

2.通过camera类使用摄像头

第一种方法非常方便,不过需要跳到新的activity中,这样的用户体验并不是特别好

使用camera能有更大的自定义空间!

使用camera就需要用surfaceview显示摄像头的即时画面

我们这样设置layout:

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:gravity="center"

android:orientation="vertical"

tools:context="com.example.video_activity.MainActivity" >

android:id="@+id/surfaceview"

android:layout_width="320dp"

android:layout_height="240dp" />

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:gravity="center_horizontal"

android:orientation="horizontal" >

android:id="@+id/change"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="change" />

android:id="@+id/textview"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="which camera" />

一个静态的surfaceview、Button和Textview

button是用于后面切换摄像头的

textview用于显示摄像头id

实例化以上控件再声明一个camera对象。

private Camera mCamera;

实例化控件后还要给surfaceview一个holder用于接收camera的内容。

一个layoutParameters用于改变surfaceview尺寸(否则会产生畸变)

lp = surfaceView.getLayoutParams();

sh = surfaceView.getHolder();

选一个摄像头的id(默认可以为0或者1),获取它的信息

private Void OpenCameraAndSetSurfaceviewSize(int cameraId) {

mCamera = Camera.open(cameraId);//id用于选中不同的摄像头,有的相机会有很多的

Camera.Parameters parameters = mCamera.getParameters();

Size pre_size = parameters.getPreviewSize();

Size pic_size = parameters.getPictureSize();//和预览的尺寸不同,这是拍照后实际相片的尺寸,会比较大

android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo();

android.hardware.Camera.getCameraInfo(cameraId, info);//获取选中的摄像头信息

int camera_number = Camera.getNumberOfCameras();//获取摄像头数量

if (info.facing == CameraInfo.CAMERA_FACING_FRONT) {//分辨是否前置摄像头

textview.setText("There are " + camera_number + " camera."

+ "This is the Front Camera!");

} else {

textview.setText("There are " + camera_number + " camera."

+ "This is the Back Camera!");

}

lp.height = pre_size.width * 2;

lp.width = pre_size.height * 2;

return null;

}

我们编写SetAndStartPreview方法实例化camera并将预览加载到surfaceview中

private Void SetAndStartPreview(SurfaceHolder holder) {

try {

mCamera.setPreviewDisplay(holder);

mCamera.setDisplayOrientation(90);

mCamera.startPreview();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return null;

}

切换摄像头的原理就将camera释放掉再重新加载。 为button添加事件监听:

change_Button.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

mCamera.stopPreview();

mCamera.release();

if (cameraId == 0) {

cameraId = 1;

} else {

cameraId = 0;

}

OpenCameraAndSetSurfaceviewSize(cameraId);

// the surfaceview is ready after the first launch

SetAndStartPreview(sh);

}

});

值得一提的是我们将camera和surface holder关联的时候必须确保surfaceview已经建立好,否则camera获取不到surfaceview的信息

我们需要为surfaceholder添加addCallback(this);并在create中调用方法

public void surfaceCreated(SurfaceHolder holder) {

// TODO Auto-generated method stub

SetAndStartPreview(holder);

}

源码在这里⬇️

http://download.csdn.net/detail/edwardwayne/8491597

android摄像头预览功能,android通过camera和surfaceview选择摄像头并即时预览相关推荐

  1. android实现打卡功能,android实现上班打卡记录日历查看功能

    项目地址: https://download.csdn.net/download/jifenglie/12588312 日历实现查看打卡记录功能: 功能: 1.支持农历.节气.常用节假日 2.日期范围 ...

  2. android 实现屏幕录制功能,Android实现屏幕录制功能

    本文实例为大家分享了Android实现屏幕录制功能的具体代码,供大家参考,具体内容如下 1.效果图: 2.添加依赖 dependencies { implementation fileTree(dir ...

  3. Android相册中搜索功能,Android开发从相册中选取照片的示例代码

    最近项目在做一个功能:就是需要从用户选择头像跳转到相册选择图片,这应该是一个很简单的需求,但是在网上搜了一下有好多都讲的很乱,其实用几十行代码就可以实现的为什么要说的那么复杂呢,下面就简单说一下喽. ...

  4. Android实现支付宝AR功能,Android接入支付宝实现支付功能实例

    我本来是想直接讲Android支付这一块的,包括支付宝,微信,其他第三方整合支付等,但是微信开放平台他对我的账号做了限制,所有我今天就先把重心放在支付宝的支付上,也算是写得尽可能详细些吧,毕竟是第三方 ...

  5. android的手势解锁功能,Android应用开发之Android 5秒学会使用手势解锁功能

    本文将带你了解Android应用开发Android 5秒学会使用手势解锁功能,希望本文对大家学Android有所帮助. Android手势解锁 本文讲述的是一个手势解锁的库,可以定制显示隐藏宫格点.路 ...

  6. android如何实现打分功能,Android App中使用RatingBar实现星级打分功能的教程

    RatingBar简单介绍RatingBar是基于SeekBar(拖动条)和ProgressBar(状态条)的扩展,用星形来显示等级评定,在使用默认RatingBar时,用户可以通过触摸/拖动/按键( ...

  7. android 手机录屏功能,Android录屏功能的实现

    最近做一个Android开发的项目用到了录屏的功能,开始查阅了一些资料和博客,基本上都是在讨论ROOT的.直到后来在github上看到一个比较新的代码,才恍然发现,Android 5.0时候开放了一个 ...

  8. android studio发邮件功能,Android发送电子邮件

    电子邮件是通过电子方式从一个系统用户通过网络分发给一个或多个收件人的邮件. 在开始电子邮件活动之前,您必须意图了解电子邮件功能,Intent在应用程序或应用程序外部将数据从一个组件传输到另一个组件. ...

  9. android studio发邮件功能,Android发送邮件的方法实例详解

    本文实例讲述了Android发送邮件的方法.分享给大家供大家参考,具体如下: 在android手机中实现发送邮件的功能也是不可缺少的.如何实现它呢?下面以简单的例子进行说明. 程序如下: import ...

最新文章

  1. 2018年中国高被引学者榜单发布,清华入榜学者数位列高校第一
  2. My first Blog
  3. 《阿里巴巴 Java 开发手册》读书笔记
  4. 深入理解 CAP 定理
  5. Entity Framework with MySQL Provider 更新行数为0的Bug
  6. ssm(Spring+Spring mvc+mybatis)Dao层配置sql的文件——DeptDaoMapper.xml
  7. 如何分割合并ISO文件
  8. Spring Cloud构建微服务架构:Hystrix监控数据聚合【Dalston版】
  9. 如何解决NLP分类任务的11个关键问题:类别不平衡低耗时计算小样本鲁棒性测试检验长文本分类 JayLou娄杰
  10. 通过中序线索二叉树找某节点的后续前驱☆
  11. MySQL高级知识(九)——慢查询日志
  12. 微信小程序图片上传并展示
  13. atitit.sql server2008导出导入数据库大的表格文件... oracle mysql
  14. Android面试题整理
  15. php使用adodb下载,ADODB的使用
  16. python打印网页成pdf_如何使用Python将网页转换为PDF
  17. N卡和A卡有什么区别?A卡和N卡的区别,一个动图秒懂
  18. [BZOJ5470][模拟]FJOI2018:所罗门王的宝藏
  19. iOS组件化方案对比
  20. X264实现H264编码以及MediaMuxer的另类用法「第八章,Android音视频编码那点破事」

热门文章

  1. IT自动化:自动化的网络管理变得很重要
  2. 构建高性能分布式搜索引擎(Memcached-基础篇)一
  3. 组图:1904年圣路易斯奥运会
  4. 博客园首页博问闪存新随笔联系订阅管理 随笔- 252 文章- 0 评论- 45 HashPasswordForStoringInConfigFile中的Md5算法并非常用的Md5算法...
  5. 用户 'sa' 登录失败。 (Microsoft SQL Server,错误: 18456)
  6. Gridview的footer模板中放置控件实现添加功能
  7. 在Spring 中如果Girl要Kiss Boy咋办捏?
  8. idea中查看类中所有方法列表(Alt+7)(亲测)
  9. python算法与数据结构-循环链表
  10. JMeter入门教程(自己做测试了)