批量传输和 Android USB API

2024-02-05

我有一个程序,我尝试通过 USB 将我的 Android 设备连接到网络摄像头。我在一些事情上遇到了麻烦,即正确传输数据。我尝试过使用bulkTransfer,但似乎无法识别它的使用情况。我一直在尝试寻找可能对我有帮助的例子,例如here https://stackoverflow.com/questions/13982264/usb-bulktransfer-between-android-tablet-and-camera但没有人能帮助我 - 他们的结构似乎比我的更好,但每当我切换时,我的程序就会在加载时崩溃。

我相当有信心我的字节声明也是不正确的,我应该以某种方式将我的数据转发到那里,但我不确定如何。任何有关如何数据传输和如何构建我的代码方面的帮助将不胜感激。

一些声明:

private byte[] bytes = {1,2};
private static int TIMEOUT = 0;
private boolean forceClaim = true;

在创建时:

UsbDevice device = (UsbDevice) getIntent().getParcelableExtra(UsbManager.EXTRA_DEVICE);
    UsbManager mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
    HashMap<String, UsbDevice> deviceList = mUsbManager.getDeviceList();
    Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();
    while(deviceIterator.hasNext()) {
        device = deviceIterator.next();
        PendingIntent mPermissionIntent = PendingIntent.getBroadcast(this,0,new Intent(ACTION_USB_PERMISSION), 0);
        IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
        registerReceiver(mUsbReceiver, filter);
        mUsbManager.requestPermission(device, mPermissionIntent);
        UsbDeviceConnection connection = mUsbManager.openDevice(device);
        Log.d("CAM Connection", " " + connection);
        Log.d("CAM UsbManager", " " + mUsbManager);
        Log.d("CAM Device", " " + device);



        UsbInterface intf = device.getInterface(0);
        Log.d("CAM_INTF Interface!!!!", " " +  intf );
        UsbEndpoint endpoint = intf.getEndpoint(0);
        Log.d("CAM_END Endpoint", " " +  endpoint );

        connection.claimInterface(intf, forceClaim);
        StringBuilder sb = new StringBuilder();
        if(connection.bulkTransfer(endpoint,bytes,bytes.length,TIMEOUT) < 2)
            Log.d("test", "");
       //Log.d("BULK", ""+ connection.bulkTransfer(endpoint, bytes, bytes.length, TIMEOUT)); //do in another thread
    }

附加相关代码:

 private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {

    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (ACTION_USB_PERMISSION.equals(action)) {
            synchronized (this) {
                UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);

                if (intent.getBooleanExtra(EXTRA_PERMISSION_GRANTED, false)) {
                    if(device != null){



                        //call method to set up device communication
                    }
                }
                else {
                    Log.d("Deny:", "permission denied for device " + device);
                }
            }
        }
    }
};

你的问题之一是寻找端点。 endpoint0 用于控制任务,您应该在代码中找到适当的 IN 和 OUT 端点。

 UsbInterface usbInterfaceTemp = null;
        usbInterface = null;
        endpointIN = null;
        endpointOUT = null;
        for (int i = 0; i < usbGotPermiDVC.getInterfaceCount(); i++) {

            usbInterfaceTemp = usbGotPermiDVC.getInterface(i);
            if (usbInterfaceTemp.getEndpointCount() >= 2) {

                for (int j = 0; j < usbInterfaceTemp.getEndpointCount(); j++) {

                    UsbEndpoint usbEndpointTemp = usbInterfaceTemp.getEndpoint(j);

                    if (usbEndpointTemp.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) {

                        if (usbEndpointTemp.getDirection() == UsbConstants.USB_DIR_IN) {

                            endpointIN = usbEndpointTemp;

                        } else if (usbEndpointTemp.getDirection() == UsbConstants.USB_DIR_OUT) {

                            endpointOUT = usbEndpointTemp;

                        }
                    }
                }
            }
        }

        if (endpointIN != null && endpointOUT != null) {
            usbInterface = usbInterfaceTemp;
        }

        if (usbInterface == null) {
            return;
        }


        usbDeviceConnection = usbManager.openDevice(usbSelectedDevice);

        if (!(usbDeviceConnection != null && usbDeviceConnection.claimInterface(usbInterface, true))) {
            usbDeviceConnection = null;
            return;
        }

        usbDeviceConnection.controlTransfer(0x21, 34, 0, 0, null, 0, 0);
        usbDeviceConnection.controlTransfer(0x21, 32, 0, 0, new byte[]{(byte) 0x80,
                0x25, 0x00, 0x00, 0x00, 0x00, 0x08}, 7, 0);

        Toast.makeText(getApplicationContext(), "Device opened and Interface claimed!", Toast.LENGTH_SHORT).show();

其中usbGotPermiDVC为获得USB访问权限的设备。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

批量传输和 Android USB API 的相关文章

随机推荐

  • Qt moc.exe 不生成 *.moc 文件

    我正在尝试建立qtestlib tutorial1 示例 但是testqstring moc当我运行时没有生成文件nmake 我在 Windows XP SP3 上运行 Qt 4 5 2 我复制了测试qstring cpp从教程目录到我的构
  • XSRF - 如何设置跨域 cookie

    我开发了 REST API 和两个 JavaScript 客户端 单页应用程序和本机应用程序 基于电子 在这两个客户端中 我的用户都通过 OAuth2 流程进行身份验证 将用户密码发送到服务器 获取访问令牌 以纯文本形式 和刷新令牌 以 h
  • 仅将边框添加到换行文本的底部

    我试图在一些换行文本上实现下划线 该下划线适合底行文本的宽度 同时仅出现在该底线下方 图1说明了期望的效果 Figure 1 使用这个 HTML h2 span class inline block optatur volendit inu
  • 加载TextureAtlas的状态

    我在基于 LibGdx 的游戏中使用TextureAtlas 随着图集大小的增加 加载时间也会增加 因此显示我在游戏中设置的动画会出现延迟 因此我希望获得纹理图集加载过程的状态 1 无论如何要获得状态吗 2 有听众吗 您可以以已使用此方法加
  • 如何在 swift ios 中刷新选项卡栏项目

    我做的应用程序就像Instagram与选项卡栏项目 在应用程序中我有simple user and company user 我有主视图控制器 MainTabBarController UITabBarController 有 5 个选项卡
  • 当从 super() 运行方法时,为什么字段不初始化为非默认值?

    我一定花了一个多小时试图找出一些意外行为的原因 我最终意识到字段没有按我的预期设置 在耸耸肩并继续之前 我想了解为什么会这样 在运行下面的示例时 我希望输出为 true 但它是 false 其他测试表明我总是得到该类型的默认值 public
  • 获取 OAuth 会话的过期时间

    为了授予或撤销对我的 webapi 的访问权限 我使用 OAuth 密码和令牌刷新工作流程 如果我理解正确的话 工作流程应该是这样的 使用用户名 密码 客户端 ID 进行身份验证 检索 accesstoken refreshtoken 和到
  • Swift:如何请求带有自签名证书的 URL?

    我正在打开 SSL 连接以在 Swift 中检索 JSON 但正在使用自签名证书对我自己的服务器进行测试 以下是 URL 请求的片段 var urlPath https myhost com get json var url NSURL N
  • 将 NSMutableArray 保存到 NSUserDefaults 的最佳方法是什么?

    我有一个名为 Occasion 的自定义对象 定义如下 import
  • 在 Highcharts 中动态附加加载或重绘事件函数

    我需要在 Highcharts 中动态附加 onload 或 redraw 事件函数 我知道在配置步骤中进行此操作 例如 container highcharts chart events load function event funct
  • 优化期间 Java 会内联方法吗?

    我想知道 JVM javac 是否足够聪明来转动 This line string a foo string foo return bar string bar return some complicated string computat
  • 使用 if(1 || !Foo()) 有什么理由吗?

    我读了一些遗留代码 if 1 Foo 是否有任何不写的理由 if Foo 两者是not相同 第一个永远不会评价Foo 因为1短路 为什么这样做 可能有人想强行进入then出于调试目的分支并将其留在那里 也可能是这是在源代码控制之前编写的 因
  • 如何指定编辑器打开crontab文件? “export EDITOR=vi”不起作用

    我使用的是 Red Hat Enterprise Linux 5 我想设置 vim 编辑器来编辑 crontab 文件 如果我跑echo EDITOR 我得到了活力 但当我跑步时crontab e 我得到了不同的编辑器 很可能你的VISUA
  • 使用 data.table 包进行条件二进制连接和引用更新

    这是我现实生活中的问题 我觉得可以很容易地解决 但我在这里遗漏了一些明显的东西 我有两个大数据集TK and DFT library data table set seed 123 TK lt data table venue id rep
  • 如何使用 Python 获取触发我的 Azure 函数的 inputBlob 的名称

    我有一个天蓝色的函数 它是由放入 blob 存储的文件触发的 我想知道如何 如果可能 获取触发该函数的 blob 文件 的名称 我尝试这样做 fileObject os environ inputBlob message Python sc
  • 尝试启动 Atom/Nuclide 时未找到流

    我正在研究react native我正在使用的应用程序AtomIDE 我在打开时遇到错误Atom 我安装了babel cli and babel preset flow使用 npm 命令 npm install save dev babel
  • 将 MS Access 表单和类/模块递归导出到文本文件?

    我在一个古老的留言板上发现了一些代码 它很好地从类 模块和表单中导出了所有 VBA 代码 见下文 Option Explicit Option Compare Database Function SaveToFile Save the co
  • Java 8 流式添加两个或多个列表中的值

    我试图进入 Java 8 并了解流和 lambda 来解决各种问题 但陷入了这个特定的问题 我通常使用 forEach 并将值存储在 Map 中来解决 您将如何编写代码来使用 Java 8 中的新功能获取预期列表 List
  • 具有选择条件的 pandas 数据框中的高效最大选择

    我有一个带有列的 pandas 数据框 除其他外 user id and start time 我想高效且易读地找到与每个用户的最大值关联的所有行start time 例如 如果这是我的数据 user id start time A B C
  • 批量传输和 Android USB API

    我有一个程序 我尝试通过 USB 将我的 Android 设备连接到网络摄像头 我在一些事情上遇到了麻烦 即正确传输数据 我尝试过使用bulkTransfer 但似乎无法识别它的使用情况 我一直在尝试寻找可能对我有帮助的例子 例如here