Android修行手册-多路USB外接摄像头

news2024/11/16 11:36:00
  • 点击跳转=>Unity3D特效百例
  • 点击跳转=>案例项目实战源码
  • 点击跳转=>游戏脚本-辅助自动化
  • 点击跳转=>Android控件全解手册
  • 点击跳转=>Scratch编程案例
  • 点击跳转=>软考全系列

👉关于作者

专注于Android/Unity和各种游戏开发技巧,以及各种资源分享(网站、工具、素材、源码、游戏等)
有什么需要欢迎底部卡片私我,交流让学习不再孤单

在这里插入图片描述

👉实践过程

公司最近有个Android产品是这样的:

  1. 需要多路摄像头摄像,且摄像头是USB外接的,并且需要支持扫码功能。
  2. 需要支持多显示器异屏显示或同屏显示。

本篇文章主要介绍USB摄像头的思路,显示器的可看另一篇文章。

😜简介

Android系统已经支持uvc设备,全称为USB Video Class。就如字面意思,USB视频类是专门为USB视频捕获设备定义的协议标准。由Microsoft与另外几家设备厂商联合推出的为USB视频捕获设备定义的协议标准,已经成为USB org标准之一。

我们用到了开源库AndroidUSBCamera:https://github.com/jiangdongguo/AndroidUSBCamera
而AndroidUSBCamera开源库的底层用到了UVCCamera开源库。是基于UVCCamera的高度封装。

Android Studio 是2021系列,Android设备是基于3588开发板做的,普通的手机平板设备可没那么多接口。
开发板详情请看:http://www.rock-chips.com/a/cn/product/RK35xilie/2022/0926/1656.html

😜开始集成

如果你是在我发文后面开始集成的AndroidUSBCamera,那么恭喜你,这时候的框架已经整体打包好aar了,省略了很多步骤。
方式一:
项目的 build.gradle文件中添加

allprojects {
    repositories {
        google()
        jcenter()
        maven { url "https://jitpack.io" }
    }
}

想要使用框架的module中在线引入即可。

dependencies {
    implementation 'com.github.jiangdongguo.AndroidUSBCamera:libausbc:改为版本号'
}

如果你写demo或者集成到超简单的项目里,上面一般都会成功,但如果你的实际项目复杂,集成了很多三方框架就会有其他问题。推荐方式二。

方式二:

从github上下载了项目后,首先你的项目集成 libausbc 包,接着你找到 libnative libuvc libuvccommon 下的三个aar,拷贝的libausbc的libs下,没有文件夹就创建一个,然后在 build.gradle 中添加 aar依赖。
在这里插入图片描述

dependencies {
    implementation 'androidx.appcompat:appcompat:1.5.1'
    implementation "androidx.constraintlayout:constraintlayout:2.0.4"
    implementation 'com.google.android.material:material:1.6.1'
    api 'com.elvishew:xlog:1.11.0'
    implementation files('libs/libnative-3.2.9.aar')
    implementation files('libs/libuvc-3.2.9.aar')
    implementation files('libs/libuvccommon-3.2.9.aar')
}

然后你自己的主项目依赖这个 libausbc 包即可。

这就可以了?并不一定,在部分架构的设备上运行没事,有的则不行,这是因为so不全以及so合并导致的问题。
你还需要找到开源项目中的 libuvc-3.2.9.aar 然后修改后缀为zip。
在这里插入图片描述
然后复制下 armeabi-v7a 改为 你应该用的架构的即可。然后再将后缀名改为 aar。
再之后你的主项目app的如果集成了其他的so,需要jniLibs下有以下几个文件夹,至此,集成就完事了。基本市面上的设备都可以用。
在这里插入图片描述

😜操作代码

要想使用,首先你得需要权限

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-feature android:name="android.hardware.usb.host" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />

布局也很简单

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <FrameLayout
        android:id="@+id/viewfinderView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:inner_scan_speed="20" />
 </RelativeLayout>

可以继承CameraFragment也可以继承CameraActivity使用。继承后会有4个回调方法

class DemoFragment: CameraFragment() {
	override fun getRootView(inflater: LayoutInflater, container: ViewGroup?): View? {
    	//找到布局id,进行设置	
        return mViewBinding?.root
    }
    override fun getCameraView(): IAspectRatio? {
        return AspectRatioTextureView(requireContext())
    }
    override fun getCameraViewContainer(): ViewGroup? {
	    // 对应的布局里控件id即可
        return mViewBinding?.viewfinderView
    }
    override fun onCameraState(self:ICamera, code:ICameraStateCallBack.State, msg:String?) {
	    //返回的摄像头状态
        when (code) {
            ICameraStateCallBack.State.OPENED -> handleCameraOpened()
            ICameraStateCallBack.State.CLOSED -> handleCameraClosed()
            ICameraStateCallBack.State.ERROR -> handleCameraError()
        }
    }
    override fun getGravity(): Int = Gravity.TOP
}

上面是简单的一路摄像头,而多路摄像头就需要你继承MultiCameraActivity或者MultiCameraFragment
之后会实现6个方法

public class MyTest  extends MultiCameraActivity {
   @Nullable
   @Override
   protected View getRootView(@NonNull LayoutInflater layoutInflater) {
	  //返回设置根布局
      return null;
   }

   @NonNull
   @Override
   public MultiCameraClient.ICamera generateCamera(@NonNull Context ctx, @NonNull UsbDevice device) {
     return new CameraUVC(ctx, device); //一般固定这个即可
   }

   @Override
   protected void onCameraConnected(@NonNull MultiCameraClient.ICamera camera) {
	//摄像头连接后的回调,在这一旦连接上就需要绑定上adapter显示画面的view
   }

   @Override
   protected void onCameraDisConnected(@NonNull MultiCameraClient.ICamera camera) {
	//断开链接后的回调
   }

   @Override
   protected void onCameraAttached(@NonNull MultiCameraClient.ICamera camera) {
	//进行摄像头连接时
   }

   @Override
   protected void onCameraDetached(@NonNull MultiCameraClient.ICamera camera) {
	//分离摄像头时
   }
}

更多详情直接看大佬项目的demo即可。也可以留言或下方卡片加好友一起探讨。

👉其他

📢作者:小空和小芝中的小空
📢转载说明-务必注明来源:https://zhima.blog.csdn.net/
📢这位道友请留步☁️,我观你气度不凡,谈吐间隐隐有王者霸气💚,日后定有一番大作为📝!!!旁边有点赞👍收藏🌟今日传你,点了吧,未来你成功☀️,我分文不取,若不成功⚡️,也好回来找我。

温馨提示点击下方卡片获取更多意想不到的资源。
空名先生

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

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

相关文章

CSS3-盒子模型

盒子模型的介绍 盒子概念 盒子组成 盒子内减 拓展 1. 盒子的概念 1 页面中的每一个标签&#xff0c;都可看做是一个 “盒子”&#xff0c;通过盒子的视角更方便的进行布局 2 浏览器在渲染&#xff08;显示&#xff09;网页时&#xff0c;会将网页中的元素看做是一个个的矩形区域…

Selenium详解

Selenium 环境配置好之后&#xff0c;我们就可以使用 Selenium 来操作浏览器&#xff0c;做一些我们想做的事情了。在我们爬取网页过程中&#xff0c;经常发现我们想要获得的数据并不能简单的通过解析 HTML 代码获取&#xff0c;这些数据是通过 AJAX 异步加载方式或经过 JS 渲染…

Python高级系列教程:Python闭包和装饰器

今天我们将继续讲解 Python 中的闭包和装饰器。虽然我们还没有详细学习这两个概念&#xff0c;但在面向对象编程中&#xff0c;我们已经经常使用装饰器了。装饰器可以给函数增加额外的功能&#xff0c;就像语法糖一样甜。在 Python 中&#xff0c;装饰器的格式通常是在函数上方…

三分钟学习一个python小知识1-----------我的对python的基本语法的理解

文章目录 一、变量定义二、数据类型三、条件语句四、循环语句五、函数定义总结 一、变量定义 在Python中&#xff0c;使用等号&#xff08;&#xff09;进行变量的定义&#xff0c;并不需要声明变量的类型&#xff0c;Python会自动根据赋值的数据类型来判断变量的类型&#xf…

算法篇——动态规划 完全和多重背包问题 (js版)

一些分析总结 01 背包 问题和 完全背包 问题的不同点在于&#xff0c;所有的物品只能使用一次&#xff0c;判断 哪些物品 装进背包里 物品价值和 最大&#xff1b;而 完全背包 问题中&#xff0c;所有物品都能使用n次&#xff0c;判断 哪个物品 装 n 个进去 物品价值和 最大。…

Mybatis源码分析_日志模块 (1)

不得不承认&#xff0c;学习MyBatis的时间成本要比学习Spring低很多&#xff0c;Mybatis是我所了解过的代码量最小、整体架构最简单&#xff0c;但是又是最具有学习价值的一个框架。如果&#xff0c;你想快速的阅读一个框架的源码&#xff0c;并且掌握这个框架的精髓&#xff0…

浅析GeoServer CVE-2023-25157 SQL注入

简介 GeoServer是一个开源的地图服务器&#xff0c;它是遵循OpenGIS Web服务器规范的J2EE实现&#xff0c;通过它可以方便的将地图数据发布为地图服务&#xff0c;实现地理空间数据在用户之间的共享。 影响版本 geoserver<2.18.7 2.19.0<geoserver<2.19.7 2.20.0…

国内外八大敏捷开发工具盘点

1、Leangoo领歌&#xff1b;官网&#xff1a;Leangoo领歌 - 高效企业必备的敏捷工具,Scrum工具,SAFe敏捷工具,敏捷项目管理,敏捷研发工具 2、VersionOne&#xff1b;官网&#xff1a;https://www.collab.net/products/versiononehttps://www.collab.net/products/versionone …

Python高级系列教程:Python高级语法与正则表达式

学习目标 1、能够掌握with语句的使用 2、能够知道生成器的两种创建方式 3、能够知道深拷贝和浅拷贝的区别 4、能够掌握Python中的正则表达式编写 一、Python高级语法 1、with语句和上下文管理器 ☆ with语句 Python提供了 with 语句的写法&#xff0c;既简单又安全。文件操…

Vue-scoped(局部)样式

scoped(局部)样式 scoped是在脚手架有一个编写样式的小技巧 作用&#xff1a;让样式在局部生效&#xff0c;防止冲突 1 编写案例 现在有两个组件&#xff0c;一个student,一个school&#xff0c;现在想给组件写点样式 这里只给个背景色 没问题&#xff0c;样式生效 2 样式冲…

docker canal 安装

(373条消息) 使用 Docker 部署 canal 服务_canal docker部署_qq2276031的博客-CSDN博客https://blog.csdn.net/qq2276031/article/details/120234122 docker canal github 网址 Canal Admin Docker alibaba/canal Wiki (github.com)https://github.com/alibaba/canal/wiki/Ca…

璞华产业园区租赁运营平台,助力空间资产管理数字化转型!

{ 产业园区租赁运营平台 } 直面行业痛点 专注技术创新 点击输入图片描述&#xff08;最多30字&#xff09; 产业园区作为产业转型升级的重要载体&#xff0c;产业园区租赁运营也正迎来新的发展机遇。璞华一直关注为客户智能化转型过程中提供的服务&#xff0c;能否将技术方案…

【自监督论文阅读 3】DINOv1

文章目录 一、摘要二、引言三、相关工作3.1 自监督学习3.2 自训练与知识蒸馏 四、方法4.1 SSL with Knowledge Distillation4.2 教师网络4.3 网络架构4.4 避免坍塌 五、实验与评估六、消融实验6.1 不同组合的重要性6.2 教师网络选择的影响6.3 避免坍塌6.4 在小batch上训练 七、…

elk搭建

1、前言 ELK 是一个开源的日志管理解决方案&#xff0c;主要是为了统一收集生产的日志&#xff0c;方便日志的查询&#xff0c;传统的日志都是保存在每个机器上&#xff0c;当要查询的时候&#xff0c;需要到每一台机器上去查询日志&#xff0c;非常麻烦&#xff0c;而elk则使…

阿里巴巴 Java 开发手册部分整理

阿里巴巴 Java 开发手册 一、编程规约(一) 命名风格(二) 常量定义(三) 代码格式(四) OOP 规约(五) 集合处理(六) 并发处理(七) 控制语句(八) 注释规约(九) 其它 二、异常日志(一) 异常处理(二) 日志规约 三、单元测试四、安全规约五、MySQL 数据库(一) 建表规约(二) 索引规约(三…

Java 操作pdf工具类

1、获取pdf页数 添加maven依赖&#xff1a; <!-- java获取Pdf文件页码 --><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>1.8.11</version></dependency>代码实现&#x…

Goby 漏洞发布|电信网关配置管理系统后台 /manager/teletext/material/upload.php 文件上传漏洞

漏洞名称&#xff1a;电信网关配置管理系统后台 /manager/teletext/material/upload.php 文件上传漏洞 English Name&#xff1a;Telecom system /manager/teletext/material/upload.php fileupload vulnerability CVSS core: 9.8 影响资产数&#xff1a;856 漏洞描述&…

不过时的经典层架构

在《设计服务要考虑的7个维度》中讲到设计一定要把不稳定的部分做封装。今天咱们就从这个角度重新审视一下经典的四层架构。 上面是一个经典层架构的示意图。这个架构大多数的公司和项目都在直接用&#xff0c;或者用其变体。 比如&#xff0c;某大厂上层Client客户端可能是电商…

安卓蓝牙GATT协议介绍

前言 现在低功耗蓝牙&#xff08;BLE&#xff09;连接都是建立在 GATT (Generic Attribute Profile) 协议之上。GATT 是一个在蓝牙连接之上的发送和接收很短的数据段的通用规范&#xff0c;这些很短的数据段被称为属性&#xff08;Attribute&#xff09;。 GAP 详细介绍 GAT…

GBASE金融信创优秀解决方案鉴赏 · 核心业务系统数据库解决方案

为此&#xff0c;实验室特别开设金融信创优秀解决方案专栏&#xff0c;集中展示优秀成果。现在&#xff0c;让我们一起来领略下GBASE的优秀解决方案吧~可点击阅读原文 →《金融信创优秀解决方案--核心业务系统数据库解决方案》。 核心业务系统数据库解决方案 方案简介 随着技…