Android调用前后摄像头同时工作实例代码
发布时间 - 2026-01-11 02:13:53 点击率:次硬件环境:小米4

Android版本:6.0
咱们先看效果图:
我把代码贴出来:
AndroidMainfest.xml文件(需要新增camera权限):
<uses-permission android:name="android.permission.CAMERA" />
activity_main.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.bihu.qdemopush.MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="200dp"
android:orientation="horizontal">
<SurfaceView
android:id="@+id/surfaceview1"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="fill_parent" />
<SurfaceView
android:id="@+id/surfaceview2"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_marginLeft="5dp"
android:layout_height="fill_parent" />
</LinearLayout>
</LinearLayout>
MainActivity.java文件:主要是对2个surfaceView的显示渲染
public class MainActivity extends AppCompatActivity {
SurfaceView surfaceview1, surfaceview2;
SurfaceHolder surfaceholder1, surfaceholder2;
String TAG = "MainActivity";
private Camera camera1 = null, camera2;
Camera.Parameters parameters;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
surfaceview1 = (SurfaceView) findViewById(R.id.surfaceview1);
surfaceview2 = (SurfaceView) findViewById(R.id.surfaceview2);
surfaceholder1 = surfaceview1.getHolder();
surfaceholder1.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
surfaceholder1.addCallback(new surfaceholderCallbackBack());
surfaceholder2 = surfaceview2.getHolder();
surfaceholder2.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
surfaceholder2.addCallback(new surfaceholderCallbackFont());
}
@Override
protected void onDestroy() {
Log.e(TAG, "onDestroy");
super.onDestroy();
}
/**
* 后置摄像头回调
*/
class surfaceholderCallbackBack implements SurfaceHolder.Callback {
@Override
public void surfaceCreated(SurfaceHolder holder) {
// 获取camera对象
int cameraCount = Camera.getNumberOfCameras();
if (cameraCount > 0) {
camera1 = Camera.open(0);
try {
// 设置预览监听
camera1.setPreviewDisplay(holder);
Camera.Parameters parameters = camera1.getParameters();
if (MainActivity.this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) {
parameters.set("orientation", "portrait");
camera1.setDisplayOrientation(90);
parameters.setRotation(90);
} else {
parameters.set("orientation", "landscape");
camera1.setDisplayOrientation(0);
parameters.setRotation(0);
}
camera1.setParameters(parameters);
// 启动摄像头预览
camera1.startPreview();
System.out.println("camera.startpreview");
} catch (IOException e) {
e.printStackTrace();
camera1.release();
System.out.println("camera.release");
}
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
camera1.autoFocus(new Camera.AutoFocusCallback() {
@Override
public void onAutoFocus(boolean success, Camera camera) {
if (success) {
initCamera();// 实现相机的参数初始化
camera.cancelAutoFocus();// 只有加上了这一句,才会自动对焦。
}
}
});
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
// 相机参数的初始化设置
private void initCamera() {
parameters = camera1.getParameters();
parameters.setPictureFormat(PixelFormat.JPEG);
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);// 1连续对焦
setDispaly(parameters, camera1);
camera1.setParameters(parameters);
camera1.startPreview();
camera1.cancelAutoFocus();// 2如果要实现连续的自动对焦,这一句必须加上
}
// 控制图像的正确显示方向
private void setDispaly(Camera.Parameters parameters, Camera camera) {
if (Integer.parseInt(Build.VERSION.SDK) >= 8) {
setDisplayOrientation(camera, 90);
} else {
parameters.setRotation(90);
}
}
// 实现的图像的正确显示
private void setDisplayOrientation(Camera camera, int i) {
Method downPolymorphic;
try {
downPolymorphic = camera.getClass().getMethod("setDisplayOrientation", new Class[]{int.class});
if (downPolymorphic != null) {
downPolymorphic.invoke(camera, new Object[]{i});
}
} catch (Exception e) {
Log.e("Came_e", "图像出错");
}
}
}
class surfaceholderCallbackFont implements SurfaceHolder.Callback {
@Override
public void surfaceCreated(SurfaceHolder holder) {
// 获取camera对象
int cameraCount = Camera.getNumberOfCameras();
if (cameraCount == 2) {
camera2 = Camera.open(1);
}
try {
// 设置预览监听
camera2.setPreviewDisplay(holder);
Camera.Parameters parameters = camera2.getParameters();
if (MainActivity.this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) {
parameters.set("orientation", "portrait");
camera2.setDisplayOrientation(90);
parameters.setRotation(90);
} else {
parameters.set("orientation", "landscape");
camera2.setDisplayOrientation(0);
parameters.setRotation(0);
}
camera2.setParameters(parameters);
// 启动摄像头预览
camera2.startPreview();
System.out.println("camera.startpreview");
} catch (IOException e) {
e.printStackTrace();
camera2.release();
System.out.println("camera.release");
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
camera2.autoFocus(new Camera.AutoFocusCallback() {
@Override
public void onAutoFocus(boolean success, Camera camera) {
if (success) {
parameters = camera2.getParameters();
parameters.setPictureFormat(PixelFormat.JPEG);
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);// 1连续对焦
setDispaly(parameters, camera2);
camera2.setParameters(parameters);
camera2.startPreview();
camera2.cancelAutoFocus();// 2如果要实现连续的自动对焦,这一句必须加上
camera.cancelAutoFocus();// 只有加上了这一句,才会自动对焦。
}
}
});
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
// 控制图像的正确显示方向
private void setDispaly(Camera.Parameters parameters, Camera camera) {
if (Integer.parseInt(Build.VERSION.SDK) >= 8) {
setDisplayOrientation(camera, 90);
} else {
parameters.setRotation(90);
}
}
// 实现的图像的正确显示
private void setDisplayOrientation(Camera camera, int i) {
Method downPolymorphic;
try {
downPolymorphic = camera.getClass().getMethod("setDisplayOrientation", new Class[]{int.class});
if (downPolymorphic != null) {
downPolymorphic.invoke(camera, new Object[]{i});
}
} catch (Exception e) {
Log.e("Came_e", "图像出错");
}
}
}
}
可能出现的问题:
1、没有权限,需要手动打开,代码里由于追求简便,没有主动申请,只在mainfest中注册了
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# Android调用前后摄像头
# android调用摄像头
# Android调用外置摄像头的方法
# Android调用手机摄像头拍照和录音功能
# Android实现调用手机摄像头录像限制录像时长
# Android调用手机摄像头的方法
# Android实现调用摄像头拍照并存储照片
# Android实现调用摄像头拍照与视频功能
# Android实现调用摄像头进行拍照功能
# Android开发教程之调用摄像头功能的方法详解
# android开发之调用手机的摄像头使用MediaRecorder录像并播放
# Androidstudio调用摄像头拍照并保存照片
# 这一
# 自动对焦
# 才会
# 对焦
# 我把
# 只在
# 可能出现
# 贴出
# 没有权限
# 回调
# 先看
# 大家多多
# 主要是
# layout_marginLeft
# java
# bihu
# context
# vertical
# SurfaceView
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践
如何快速搭建个人网站并优化SEO?
Win11怎么开启自动HDR画质_Windows11显示设置HDR选项
如何用搬瓦工VPS快速搭建个人网站?
如何自定义建站之星模板颜色并下载新样式?
如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环
,网页ppt怎么弄成自己的ppt?
Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制
个人摄影网站制作流程,摄影爱好者都去什么网站?
Laravel如何生成URL和重定向?(路由助手函数)
Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用
历史网站制作软件,华为如何找回被删除的网站?
如何确认建站备案号应放置的具体位置?
如何在建站主机中优化服务器配置?
Laravel如何操作JSON类型的数据库字段?(Eloquent示例)
韩国服务器如何优化跨境访问实现高效连接?
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
如何在不使用负向后查找的情况下匹配特定条件前的换行符
Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道
悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音
微信h5制作网站有哪些,免费微信H5页面制作工具?
Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践
Python企业级消息系统教程_KafkaRabbitMQ高并发应用
如何在Tomcat中配置并部署网站项目?
网站建设要注意的标准 促进网站用户好感度!
JavaScript如何实现音频处理_Web Audio API如何工作?
HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】
Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】
再谈Python中的字符串与字符编码(推荐)
如何在阿里云香港服务器快速搭建网站?
常州企业网站制作公司,全国继续教育网怎么登录?
Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权
进行网站优化必须要坚持的四大原则
Android自定义listview布局实现上拉加载下拉刷新功能
Laravel怎么生成URL_Laravel路由命名与URL生成函数详解
如何解决hover在ie6中的兼容性问题
清除minerd进程的简单方法
详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点
Python自然语言搜索引擎项目教程_倒排索引查询优化案例
Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南
Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧
Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】
教你用AI将一段旋律扩展成一首完整的曲子
原生JS实现图片轮播切换效果
javascript读取文本节点方法小结
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
Laravel如何处理表单验证?(Requests代码示例)
Python自动化办公教程_ExcelWordPDF批量处理案例
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧

