多个摄像头在一个Activity里显示

virtual camera 敲下标题的这一刻,内心还是有点儿小激动的。毕竟虚拟摄像头,也做了几个星期了,硬生生的在android原生系统不支持的情况下,绕过重重限制,完美的实现了这一功能。接下来几天,终于可以睡个好觉了。 好了,闲话少说,我们先来分析下虚拟摄像头。一说到虚拟摄像头,大家印象里,肯定首先想到的是这么一个情景:某个猥琐男在网上正兴致勃勃的撩妹,看着视频里美女漂亮的容颜,不仅春心大动,口水流了一地。而实际上,在网络的另一端,和这猥琐男聊天视频的,根本就不是视频里的美女,而是一位一边抠着脚一边... 阅读详情

首先:系统需要支持对多摄像头的显示

然后上代码:

第一步,是View代码:

<?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.csht.three.MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <SurfaceView
            android:id="@+id/surfaceview1"
            android:layout_width="match_parent"
            android:layout_weight="1"
            android:layout_marginTop="5dp"
            android:layout_height="0dp"
            />
        <SurfaceView
            android:id="@+id/surfaceview2"
            android:layout_width="fill_parent"
            android:layout_weight="1"
            android:layout_marginTop="5dp"
            android:layout_height="0dp"
            />
        <SurfaceView
            android:id="@+id/surfaceview3"
            android:layout_width="fill_parent"
            android:layout_weight="1"
            android:layout_marginTop="5dp"
            android:layout_height="0dp"
            android:layout_marginBottom="5dp"
            />
    </LinearLayout>
</LinearLayout>
第二步:
private int cameraCount;
private void DoIt() {
    cameraCount = Camera.getNumberOfCameras();
    for (int i = 0; i<cameraCount; i++){
        getSurfaceholder(i);
    }
}
private SurfaceHolder getSurfaceholder(int i){
    SurfaceHolder surfaceHolder = null;
    if (i==0){
        surfaceHolder = surfaceview1.getHolder();
        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        surfaceHolder.addCallback(new surfaceholderCallbackBack(i,getApplicationContext()));
    }
    if (i==1){
        surfaceHolder = surfaceview2.getHolder();
        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        surfaceHolder.addCallback(new surfaceholderCallbackBack(i,getApplicationContext()));
    }
    if (i==2){
        surfaceHolder = surfaceview3.getHolder();
        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        surfaceHolder.addCallback(new surfaceholderCallbackBack(i,getApplicationContext()));
    }
    return surfaceHolder;
}
第三步:
/**
 * Created by Administrator on 2017/7/17.
 */

public class surfaceholderCallbackBack implements SurfaceHolder.Callback {
    private Camera camera = null;
    private int cameraNum;
    private Context context;

    public surfaceholderCallbackBack(int cameraNum,Context context){
        this.cameraNum = cameraNum;
        this.context = context;
    }
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        // 获取camera对象
        //int cameraCount = Camera.getNumberOfCameras();
            camera = Camera.open(cameraNum);
           try {
                // 设置预览监听
                camera.setPreviewDisplay(holder);
                Camera.Parameters parameters = camera.getParameters();
                if (context.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) {
                    parameters.set("orientation", "portrait");
                    camera.setDisplayOrientation(90);
                    parameters.setRotation(90);
                } else {
                    parameters.set("orientation", "landscape");
                    camera.setDisplayOrientation(0);
                    parameters.setRotation(0);
                }
                camera.setParameters(parameters);
                // 启动摄像头预览
                camera.startPreview();
                System.out.println("camera.startpreview");

           } catch (IOException e) {
                e.printStackTrace();
                camera.release();
                System.out.println("camera.release");
            }
        
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        camera.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() {
        Camera.Parameters parameters = camera.getParameters();
        parameters.setPictureFormat(PixelFormat.JPEG);
        parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);// 1连续对焦
        setDispaly(parameters, camera);
        camera.setParameters(parameters);
        camera.startPreview();
        camera.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", "图像出错");
        }
    }
}



Android两个SurfaceView叠加显示 最近一段时间一直在做智能后视镜产品(Android平台)里的相机模块,目前已经告一段落了。现在空闲的时候可以把一些技术点记录下来。其中有一个需求就是显示前、后两个摄像头的预览画面,并且可以相互切换显示。类似下面这个样子: 在Android里常用来显示相机预览的就是SurfaceView,因为不需要在UI线程刷新。那这里我们考虑的就是将两个SurfaceView叠加在一起显示。布局xml(部分):< 阅读详情

相关推荐

android 多屏幕显示activity,副屏,无线投屏

多屏支持:是一个设备有多个屏幕,怎么让不同的屏幕显示不同的app,或者是一个app同时用两个屏幕来显示不同的页面内容。2.3 方式,如果把用户的输入信息都加入进来,结合上无线投屏就是 多屏协作了,在电脑端独立使用手机的应用...

Canok 1万+

SurfaceView调用camera进行显示与拍照

1、首先继承SurfaceView并实现SurfaceHolder.Callback接口使用接口的原因:因为使用SurfaceView 有一个原则,所有的绘图工作必须得在Surface 被创建之后才能开始(Surface—表面,这个概念在图形编程中常常被提到。基本上我们可以把它当作显存的一个映射,写入到Surface 的内容...

weixin_33984032的博客 397

Android调用摄像头后系统回收activity造成数据丢失

在做聊天模块时,有发送拍照的功能,奇葩的是别的手机都没问题,唯独红米note调用摄像头后返回页面没有任何响应,调试中发现返回的图片路径为空,返回的路径怎么能为空呢?后来发现是系统把activity回收掉了,返回来的时候,activity重新加载了,所有返回的图片路径已经不存在了,所以只能想办法恢复图片路径的数据,如下代码是开启摄像头和返回的信息: Intent intent = new In

风口的碟 2944

Android中SurfaceView和TextureView的区别,以及各自的使用方法

SurfaceView通过创建一个叫做Surface的窗口来实现图像的显示,这个Surface可以在一个新的线程中进行绘制操作,从而避免了主线程被占用而导致的UI卡顿。以上代码示例分别使用了SurfaceView和TextureView来显示一张图片,通过重写相应的回调方法,在Surface创建或者SurfaceTexture可用时进行绘制操作。SurfaceView的使用相对复杂,需要手动管理Surface的生命周期,需要适时地锁定和解锁Canvas对象,并处理Surface创建、改变和销毁等事件。

m0_46368082的博客 7889

Andriod开发——打开手机摄像头拍照并显示

Andriod开发,打开手机摄像头并拍照显示。

weixin_45354197的博客 1625

AndroidStudio安卓原生开发_启动系统的activity_短信发送activity_摄像头activity_电话拨打activity---Android原生开发工作笔记94

直接运行就可以了,不用配置权限. 点击按钮启动摄像头

添柴程序猿的专栏 479

谈谈Android中的SurfaceTexture

2015.7.2更新 由于很多人要代码,我把代码下载链接放在这里了。不过还是要说一下,surfaceTexture和OpenGL ES结合才能发挥出它最大的效果,我这种写法只是我自己的想法,还有很多种解决方法,如果大家学习一下OpenGL ES,会发现更多有意思的东西。 SurfaceTexture是从Android3.0(API 11)加入的一个新类。这个类跟SurfaceView很像,可以...

weixin_33851429的博客 602

android 连接多个usb camera的demo

这个项目最好运行在平板上,项目中写了6个usb摄像头,具体能带起几个摄像头得根据实际情况来定,一般两三个应该是没有问题。这里面有代码和apk,可以先运行看下效果。

android开发摄像头开发,在自己的SurfaceView里预览,并且解决摄像头预览变形问题--懒人笔记02

本来想只贴设置预览尺寸的部分了,后来想想就直接写个最简单的完整的demo吧 先在mainfeast中加入权限 然后是anctivity_main文件中的代码 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_widt

qiguangyaolove的博客 1万+

Android外接两个USB摄像头切换调用 demo APK源码

Android外接两个USB摄像头切换调用 demo APK源码

STM32 LwIP协议栈优化:从TCP延迟10ms降至1ms的内存配置手册

摘要: 本文针对STM32嵌入式开发中LwIP TCP通信的高延迟问题(默认配置下延迟达10~20ms),提出纯软件优化方案,通过调整内存配置与TCP参数将延迟降至1ms。核心问题包括内存池不足、pbuf分配低效及Nagle算法拖累,优化步骤包括: 内存池扩容:增大MEMP_NUM_TCP_PCB至10、PBUF_POOL_SIZE至32,避免资源竞争; pbuf静态池分配:采用2048字节大块缓冲区匹配DMA传输,减少分块与拷贝; 关闭Nagle算法:设置TCP_NODELAY=1,禁用延迟确认以加速小包

weixin_42212753的博客 1712

Android中实现调用摄像头拍照并显示在ImageView中

场景 点击拍照按钮调用系统摄像机进行拍照,并将拍的照片显示在ImageView中。 注: 博客:https://blog.youkuaiyun.com/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书、教程推送与免费下载。 实现 新建一个Activity,设计其布局如下 布局xml文件为 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http..

BADAO_LIUMANG_QIZHI的博客 2170

在Cursor中集成Ollama与Qwen2.5‑Coder:零成本本地AI开发环境搭建

本文详细介绍了如何零成本搭建本地AI开发环境,通过将Cursor IDE与本地运行的Ollama及Qwen2.5-Coder模型集成,实现数据不出本地的智能编程辅助。教程涵盖Ollama安装、模型拉取、ngrok内网穿透配置及Cursor设置等核心步骤,并提供了实战测试与常见问题排错指南,为注重隐私与成本的开发者提供安全高效的解决方案。

weixin_29296241的博客 1075

Android之调用本地摄像头

做应用可能有时候需要调用本地的摄像头,所以这里就记录意下如何调用。 摄像头预览需要在布局文件添加surfaceview, 这里需要注意,其实用FrameLayout也可以,大家可以参考 http://www.cnblogs.com/over140/archive/2011/11/16/2251344.html   1、布局 <SurfaceView android:layo

金融行业从业者/C/JavaWeb 2万+

倍加福(P+F)R2000修改雷达IP

在调试车子的时候,用到了倍加福R2000的一款雷达,设备启动建图时发现建不了图,于是查看/scan发现话题无数据,尝试ping雷达接口发现ping不通,应该是IP地址与上位机端口的IP地址不对。首先查看雷达的IP地址,这个在雷达上有两个按键,按下后可以显示IP: 按两下右边的键再按一下左边的键雷达上会显示出IP号,这里拍的不是很清楚。查看到开始时雷达IP地址为192.168.111.10,而上位机ping的IP地址为192.168.188.50.与实际不同,所以需要对雷达进行配置。一台windows笔记本

YiYeZhiNian的博客 5892

华为OD机试真题 新系统2026-04-15 Java&Go 实现【小猫钓鱼纸牌游戏】

有两名玩家甲和乙,他们玩一种“小猫钓鱼”扑克牌游戏。扑克牌为A、2、3、....J、Q、K,不考虑花色都用1-13来表示,然后给甲,乙两人各发n张牌,按给定顺序排成队列,这些牌背面朝上,正面朝下放置,队列的第一个元素是背面的第一张牌。 游戏规则如下:

MISAYAONE的博客 357

双屏异显实现主副屏共享一个摄像头,又能显示不同的布局(Camera2.0)

1、activity.main布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"

qq_25330791的博客 2750

论文必备 - YOLOv11热力图可视化,支持指定模型,指定显示层,设置置信度,以及10种可视化实现方式

本文带来的是YOLOv11热力图可视化功能,支持,以及。我们经常看到一些论文里绘制了不同的热力图,一方面能够直观的感受其模型的有效性,另一方面也丰富了论文内容。特别是在使用了注意力模块的网络中,热力图就可以验证注意力机制是否真正聚焦到了预期的重要特征上,以便对模型的有效性和合理性进行评估。例如这篇文章中展示的,就很能够表达作者改进后的模型相比之前模型的优越性。

Limiiiing的博客 5506

Android开启双摄像头

开启双目摄像头的需求大部分都会出现在人脸识别的设备上,所以这里的方法仅作为参考。 之前写过一篇双目摄像头的文章,但是说的非常笼统,重点的问题都没有提到,今天咱们就来好好说道说道 先在activity_main.xml里撸一个布局,两个SurfaceView用来分别显示两个摄像头获取的图像: <?xml version="1.0" encoding="utf-8"?> <a...

Charleyszc的博客 3241

Claude Code Agents 进阶:多代理协作与任务委托

Agent 是一个独立运行的 Claude 实例,它有自己的上下文和任务焦点。│ 主 Claude ││ (协调者) ││ │ │▼ ▼ ▼│ 代码审查 │ │ 测试生成 │ │ 文档编写 ││ │ ││▼汇总结果,完成任务并行处理:多个 Agent 同时工作,提高效率任务隔离:每个 Agent 有独立的上下文专业分工:不同类型的 Agent 擅长不同任务灵活控制:可以指定运行模式、超时等参数。

gaoxiang_120的专栏 336

人员行为规范检测:YOLOv8+C#实现工厂车间安全监控,违规即报警零延迟

该方案通过YOLOv8的装备检测与姿态估计的动作识别,结合C#的实时管控能力,实现了从“被动巡检”到“主动预警”的转变。相比传统人工,违规响应速度提升10倍,全年可减少90%以上的安全隐患。方案已在3家制造企业落地,支持自定义违规规则(如新增“吸烟”“未系安全带”),可根据车间场景灵活扩展。需要完整的模型训练配置文件(含数据集增强脚本)或C#系统源码(视频处理+报警模块)的,评论区扣“SafetyDetect”,可直接获取部署版本~

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1178

Android 摄像头预览悬浮窗,可拖动,可显示在其他app上方

市面上常见的摄像头悬浮窗,如微信、手机QQ的视频通话功能,有如下特点: 整屏页面能切换到一个小的悬浮窗 悬浮窗能运行在其他app上方 悬浮窗能跳回整屏页面,并且悬浮窗消失 我们探讨过用CameraX打开摄像头预览,结合可改变大小和浮动的activity,实现了应用内摄像头预览悬浮Activity。这个悬浮Activity是在应用内使用的。要让悬浮窗在其他app上,需要结合悬浮窗 System Alert Window。 本文用CameraX实现摄像头预览悬浮窗,能显示在其他app上方,可拖动,可跳回ac

铁手渔夫 3969

ProcessingJoy —— 最简单的实时流体模拟【JAVA】

实现基于非常非常经典的 Paper ——Jos Stam 的Real-Time Fluid Dynamics for Games 代码和注释 float visc = 0.0f; float diff = 0.0f; int N = 250; int size = (N + 2) * (N + 2); float[] u = new float[size]; // 速度, 水平/竖直 float[] v = new float[size]; float[] u_prev = new fl...

ShaderJoy 的兴趣技术杂货铺 2816

Camera开发系列之一 显示摄像头实时画面

最近一直在做安卓摄像头方面的功能,不得不说这里面的坑简直多的一批,要注意的地方简直不要太多,可以说是从入门到入土系列。总之,这玩意儿差点要我的老命。本系列文章使用的都是使用android.hardware.Camera包下面的api,并没有使用Camer2。主要是考虑到兼容性问题,另外一个很重要的原因是我还没看camera2的文档,啥都不会=_=。本片文章主要分为以下几个小点讲解:如何调用手机摄像...

qq_41145352的博客 7536

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

AndroidUSBCamera多摄像头开发实战:同时控制多个USB设备

AndroidUSBCamera是一款功能强大的Android UVC摄像头引擎,支持同时控制多个USB摄像头设备,无需复杂的系统权限,只需确保您的Android设备支持OTG功能即可轻松使用。本文将详细介绍如何利用AndroidUSBCamera实现多摄像头开发,帮助开发者快速掌握多USB设备控制的核心技巧。 [![AndroidUSBCamera多摄像头应用界面](https://raw.g

gitblog_00319的博客 526

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

开启双目摄像头实时预览

先上布局: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <Butto

weixin_45419833的博客 738
上一篇: 6.0权限问题
下一篇: jni小结(Android studio版)
LFCrossFile
博客等级 码龄10年 5粉丝 42原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值