Unity android 接USBCamera

目录


一、前提

  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权限设置:

java 复制代码
    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();
        }
    }
相关推荐
myloveasuka10 分钟前
[Java]单列集合
android·java·开发语言
fundroid1 小时前
Room 3.0 完全解析:一次面向未来的现代化重构
android·数据库·database·kmp
漂洋过海来看你啊1 小时前
Jetpack Compose高效列表实战:状态管理与性能优化指南
android
张宏2361 小时前
android camera hal3-camera_module_t
android
hongtianzai1 小时前
Laravel9.X核心特性全解析
android·java·数据库
七夜zippoe2 小时前
Python 3.12+ 新特性深度解析:类型系统与性能革命
android·网络·python·类型系统·性能革命·3.12+
Kapaseker2 小时前
五分钟搞定 Compose 的打字机效果
android·kotlin
彭波3962 小时前
听歌软件下载!全网音乐随便听!手机电脑+电视端!音乐播放器推荐
android·智能手机·音频·开源软件·娱乐·软件需求
江澎涌2 小时前
鸿蒙动态导入实战
android·typescript·harmonyos
lifewange2 小时前
SQL中的聚合函数有哪些
android·数据库·sql