Unity android 接USBCamera

news2024/11/19 4:24:37

目录


一、前提

1. unity打包android后,链接USB摄像头,需要USB权限。

二、流程

1.Unity导出android工程,Player配置如图:

2.导出android工程

3.在android工程中找到AndroidManifest.xml加入usb权限相关

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
  <application android:extractNativeLibs="true">
    <activity android:name="com.unity3d.player.UnityPlayerActivity" android:theme="@style/UnityThemeSelector" android:screenOrientation="fullSensor" android:launchMode="singleTask" android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale|layoutDirection|density" android:resizeableActivity="false" android:hardwareAccelerated="false">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
        //此处
        <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
      </intent-filter>

      <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
      <meta-data android:name="android.notch_support" android:value="true" />
    </activity>
    <meta-data android:name="unity.splash-mode" android:value="0" />
    <meta-data android:name="unity.splash-enable" android:value="True" />
    <meta-data android:name="unity.launch-fullscreen" android:value="True" />
    <meta-data android:name="unity.allow-resizable-window" android:value="False" />
    <meta-data android:name="notch.config" android:value="portrait|landscape" />
  </application>
  <uses-feature android:glEsVersion="0x00020000" />
  <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission android:name="android.permission.CAMERA" />
  //此处
  <uses-feature android:name="android.hardware.usb.host" />
 //此处
  <uses-permission android:name="android.permission.USB_PERMISSION" />
  <uses-feature android:name="android.hardware.camera" android:required="false" />
  <uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />
  <uses-feature android:name="android.hardware.camera.front" android:required="false" />
  <uses-feature android:name="android.hardware.touchscreen" android:required="false" />
  <uses-feature android:name="android.hardware.touchscreen.multitouch" android:required="false" />
  <uses-feature android:name="android.hardware.touchscreen.multitouch.distinct" android:required="false" />
</manifest>

备注主要三行如下:

<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
<uses-feature android:name="android.hardware.usb.host" />
<uses-permission android:name="android.permission.USB_PERMISSION" />

4.找到UnityPlayerActivity.java,在unity启动onResume方法里面新增打开USB权限设置:


    private static final String TAG = "unity";

    private static final String ACTION_USB_PERMISSION = "com.android.usb.USB_PERMISSION";
    private UsbManager usbManager;
    private UsbDeviceConnection connection;

    private PendingIntent permissionIntent;
    private boolean permissionGranted = false;

    private BroadcastReceiver usbReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            Log.d(TAG, "USB设备连接有变化,链接到:"+action);
            if (ACTION_USB_PERMISSION.equals(action)) {
                synchronized (this) {
                    unregisterReceiver(usbReceiver);
                    UsbDevice usbDevice = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
                    if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
                        if (usbDevice != null) {
                            // 用户已授权访问USB设备
                            connectUsbDevice(usbDevice);
                        }
                    } else {
                        Log.d(TAG, "用户未授权访问USB设备");
//                        requestPermission(usbDevice);
                    }
                }
            }
        }
    };

    // Resume Unity
    @Override protected void onResume()
    {
        super.onResume();

        if (MultiWindowSupport.getAllowResizableWindow(this))
            return;

        mUnityPlayer.resume();

        openUsbDevice();
    }

    private  void openUsbDevice(){
        //        //获取注册usb
        usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
        IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);

        // 获取已连接的USB设备列表
        HashMap<String, UsbDevice> deviceList = usbManager.getDeviceList();
        Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();
        if (deviceIterator.hasNext()) {
            UsbDevice  device = deviceIterator.next();
            permissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0);
            filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
            filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
            Log.e(TAG, "getDeviceList: " + device.getVendorId()+"=="+device.getProductId());
            ///注册广播
            registerReceiver(usbReceiver, filter);
            usbManager.requestPermission(device, permissionIntent);
        } else {
            Log.d(TAG, "没有找到已连接的USB设备");
            Toast.makeText(this, "没有找到已连接的USB设备", Toast.LENGTH_SHORT).show();
        }
    }

    private void connectUsbDevice(UsbDevice usbDevice) {
        if (usbDevice == null) {
            return;
        }

        connection = usbManager.openDevice(usbDevice);
        if (connection != null) {
            // 在此处执行USB通信操作
            Log.d(TAG, "USB设备已连接");
            Toast.makeText(this, "USB设备已连接", Toast.LENGTH_SHORT).show();
        } else {
            Log.d(TAG, "无法打开USB设备连接");
            Toast.makeText(this, "无法打开USB设备连接", Toast.LENGTH_SHORT).show();
        }
    }

注意:应用需要打开摄像机权限

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

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

相关文章

【Immich部署与访问】自托管媒体文件备份服务 Immich 本地化部署与远程访问存储数据

文章目录 前言1.关于Immich2.安装Docker3.本地部署Immich4.Immich体验5.安装cpolar内网穿透6.创建远程链接公网地址7.使用固定公网地址远程访问 前言 本篇文章介绍如何在本地搭建lmmich图片管理软件&#xff0c;并结合cpolar内网穿透实现公网远程访问到局域网内的lmmich&#…

如何在一个高并发的应用中进行调试和测试

在一个高并发的应用中进行调试和测试是一项挑战性的工作&#xff0c;因为它涉及到了系统性能、资源竞争、同步机制以及潜在的并发编程错误等多个方面。下面我会详细解释如何在高并发环境中进行调试和测试&#xff0c;并提供相应的策略和技术。 1. 单元测试 在多线程环境下&am…

YoloV10改进策略:BackBone改进|PoolFormer赋能YoloV10,视觉检测性能显著提升的创新尝试

摘要 在深度学习的广阔领域中,目标检测作为计算机视觉的基石任务之一,始终吸引着研究者的广泛关注。近期,我们大胆尝试将前沿的PoolFormer主干网络引入经典的目标检测框架YoloV10中,这一创新性融合不仅为YoloV10注入了新的活力,更在检测精度与效率上实现了双重飞跃,成为…

如何使用ssm实现小区物业管理系统

TOC ssm733小区物业管理系统jsp 第一章 绪论 1.1 研究背景 在现在社会&#xff0c;对于信息处理方面&#xff0c;是有很高的要求的&#xff0c;因为信息的产生是无时无刻的&#xff0c;并且信息产生的数量是呈几何形式的增加&#xff0c;而增加的信息如何存储以及短时间分析…

分治(归并排序)

一、基本思路 我们以一个归并排序为例。 . - 力扣&#xff08;LeetCode&#xff09; 归并排序的思想&#xff1a;得到两个有序数组&#xff0c;把两个有序数组合并&#xff0c;传到下一层递归&#xff0c;一直得到两个有序数组&#xff0c;一直合并&#xff0c;最后就能得到有…

汽车信息安全 -- 再谈车规MCU的安全启动

目录 1. 安全启动流程回顾 1.1 TC3xx的安全启动 1.2 RH850的安全启动 1.3 NXP S32K3的安全启动 1.4 小结 2.信任链的问题 3.国产HSM IP的拓展 今天接着 汽车信息安全 -- 存到HSM中的密钥还需包裹吗&#xff1f;-CSDN博客这篇文章深究另一个重要功能-- 安全启动。 该文章…

华为OD机试 - 对称美学(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

深度学习------------------------RNN(循环神经网络)

目录 潜变量自回归模型循环神经网络困惑度梯度剪裁循环神经网络的从零开始实现初始化循环神经网络模型的模型参数初始化隐藏状态创建一个类来包装这些函数该部分总代码 定义预测函数该部分总代码 梯度裁剪定义一个函数在一个迭代周期内训练模型训练函数 循环神经网络的简洁实现…

JS设计模式之观察者模式:观察者与可观察对象的巧妙互动

一. 前言 在前端开发中&#xff0c;我们经常会遇到需要对用户的操作进行响应的场景&#xff0c;例如页面上的按钮点击、输入框内容变化等。为了实现这种响应式的设计&#xff0c;我们可以使用观察者模式来解耦各个组件之间的依赖关系。 本文将详细介绍观察者模式的原理和实现…

【FaceFusion3.0.0】全新升级,重磅发布!

FaceFusion 3.0.0 版本引入了许多新特性和改进&#xff0c;其中包括&#xff1a; 重新设计架构&#xff0c;使所有操作都作为“任务”进行处理。在面部交换功能中引入像素增强(pixel boost)。向面部检测器添加多角度处理功能。引入年龄修正处理器(age modifier processor)。引…

前端学习笔记-JS进阶篇-02

构造函数&数据常用函数 1、深入对象 1.1、创建对象三种方式 1. 利用对象字面量创建对象 2. 利用new Object 创建对象 3. 利用构造函数创建对象 1.2、构造函数 构造函数&#xff1a;是一种特殊的函数&#xff0c;主要用来初始化对象 使用场景&#xff1a;常规的{...} 语…

MES系统实现制造业生产自动化、智能化与透明化

万界星空科技MES系统通过集成硬件和软件&#xff0c;实现对生产过程的实时监控、数据采集、任务调度、资源分配、质量控制、文档管理等功能&#xff0c;旨在优化企业的生产流程&#xff0c;提高生产效率&#xff0c;降低成本&#xff0c;并确保产品质量。涵盖了离散制造、流程制…

RK3588主板PCB设计学习

DCDC电路可以直接参考数据手册&#xff1a; 电源输出3A&#xff0c;回流GND也应该是3A&#xff0c;回流路径和输出路径的电流是一致的&#xff0c;不要输出路径布线很粗&#xff0c;GND回流路径很细&#xff0c;并且应该保证回流面积最小&#xff1a; 这一点讲的很到位&#xf…

一款基于 RBAC 的 Net8 后台管理框架,权限管理,前后台分离,支持多站点单点登录(附源码)

前言 在当今快速发展的互联网时代&#xff0c;一款强大的后台管理系统对于提升工作效率、简化cao作流程具有重要意义。然而&#xff0c;在众多开源项目中&#xff0c;大部分是以Java语言编写的&#xff0c;这对于专注于.NET平台的开发者来说&#xff0c;存在一定的使用门槛。 …

云+AI时代下,Alibaba Cloud Linux 如何进一步演进?

编者按&#xff1a;云AI 浪潮势不可挡&#xff0c;服务器操作系统如何进一步演进&#xff1f;阿里云智能集团高级技术专家张金利在 2024 云栖大会操作系统开源专场上&#xff0c;分享了《Alibaba Cloud Linux 技术路线演进思考》。内容见下&#xff1a; &#xff08;图/张金利&…

MacOS安装MindSpore(2024年最新)

大家好&#xff0c;我是邵奈一&#xff0c;一个不务正业的程序猿、正儿八经的斜杠青年。 1、世人称我为&#xff1a;被代码耽误的诗人、没天赋的书法家、五音不全的歌手、专业跑龙套演员、不合格的运动员… 2、这几年&#xff0c;我整理了很多IT技术相关的教程给大家&#xff0…

项目管理系统中的风险管理:如何识别和应对项目风险?

在现代项目管理中&#xff0c;风险管理是确保项目成功的关键因素之一。无论是技术、资源还是市场的变化&#xff0c;风险无处不在。有效的风险管理能够帮助团队识别潜在问题并制定应对策略&#xff0c;从而避免项目延误和预算超支。项目管理系统在这一过程中扮演着重要角色&…

从 TCP Reno 经 BIC 到 CUBIC

重读 TCP拥塞控制算法-从BIC到CUBIC 以及 cubic 的 tcp friendliness 与拐点控制 这两篇文章&#xff0c;感觉还是啰嗦了&#xff0c;今日重新一气呵成这个话题。 reno 线性逼近管道容量 Wmax&#xff0c;相当于一次查询(capacity-seeking)&#xff0c;但长肥管道从 0.5*Wmax …

试填+组合数学,CF 1648C - Tyler and Strings

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1648C - Tyler and Strings 二、解题报告 1、思路分析 考虑枚举相同前缀…

MySQL约束:外键约束

下面先创建两张表用来作为实验样例 1.创建dept表 create table dept(id int auto_increment comment ID primary key,name varchar(50) not null comment 部门名称 ) comment 部门表;INSERT INTO dept (id, name) VALUES (1, 研发部), (2, 市场部), (3, 财务部), (4, 销售部…