当前位置: 首页 > 知识库问答 >
问题:

android:外部设备与android应用之间的USB通信

公羊浩阔
2023-03-14

我想通过USB线实现android应用程序与外部设备之间的音频数据通信。

我看过android USB文档&它是示例代码。我能够在android应用程序中成功地检测和连接外部设备。

编辑:

让我解释一下我到目前为止所做的事情。

我找到了设备和它的接口下面的代码。

UsbManager mManager = (UsbManager) getSystemService(Context.USB_SERVICE);

// check for existing devices
for (UsbDevice device :  mManager.getDeviceList().values()) {
    ArrayList<UsbInterface> intf = findInterface(device);   
}

// searches for an interface on the given USB device
static private  ArrayList<UsbInterface> findInterface(UsbDevice device) {
    ArrayList<UsbInterface> usbIntf = new ArrayList<UsbInterface>();

    int count = device.getInterfaceCount();
    for (int i = 0; i < count; i++) {
        UsbInterface intf = device.getInterface(i);

        if( intf.getEndpointCount() > 0 ) {
            for( int j = 0; j < intf.getEndpointCount(); j++ ) {                
                if( intf.getEndpoint(j).getType() == UsbConstants.USB_ENDPOINT_XFER_ISOC ) {
                    usbIntf.add(intf);
                }
            }               
        }    
    }
    return usbIntf;
}
// open device connection
UsbDeviceConnection connection = mManager.openDevice(device);

boolean isSuccess = false;
if (connection != null) {       
    for (int i = 0; i < usbIntf.size(); i++) {
        UsbInterface intf = usbIntf.get(i); 
        isSuccess = connection.claimInterface(intf, false);
    }          
}
 for( int i = 0; i < usbIntf.size(); i++ ) {
    UsbInterface intf = usbIntf.get(i); 

    for (int j = 0; j < intf.getEndpointCount(); j++) {
        UsbEndpoint ep = intf.getEndpoint(j);
        if( ep.getType() == UsbConstants.USB_ENDPOINT_XFER_ISOC ) {
            if( ep.getDirection() == UsbConstants.USB_DIR_OUT ) {
                epOut = ep;
            } 
            else if ( ep.getDirection() == UsbConstants.USB_DIR_IN ) {
                epIn = ep;
            }
        }
    }           
}
Device Class : 0, Subclass : 0, Protocol : 0, 
Device ID : 2002, Device Name : /dev/bus/usb/002/002, 
Interface Count : 6, Product Id : 316, Vendor ID : 3468

Intarface&它的终点细节:

1. Interface Class : 1, Subclass : 1, Protocol : 0, EndpointCount : 0, ID : 0

2. Interface Class : 1, Subclass : 2, Protocol : 0, EndpointCount : 0, ID : 1

3. Interface Class : 1, Subclass : 2, Protocol : 0, EndpointCount : 1, ID : 1
Endpoint : 0 : Type : 1, Direction : 0, 
Details : UsbEndpoint[mAddress=1,mAttributes=9,mMaxPacketSize=200,mInterval=1]

4. Interface Class : 1, Subclass : 2, Protocol : 0, EndpointCount : 0, ID : 2

5. Interface Class : 1, Subclass : 2, Protocol : 0, EndpointCount : 1, ID : 2
Endpoint : 0 : Type : 1, Direction : 128, 
Details : UsbEndpoint[mAddress=130,mAttributes=9,mMaxPacketSize=100,mInterval=1]

6. Interface Class : 3, Subclass : 0, Protocol : 0, EndpointCount : 1, ID : 3
Endpoint : 0 : Type : 3, Direction : 128, 
Details : UsbEndpoint[mAddress=135,mAttributes=3,mMaxPacketSize=4,mInterval=2]

共有1个答案

杨海
2023-03-14

用于传输http://developer.android.com/reference/android/hardware/usb/usbdeviceconnection.html#bulktransfer(android.hardware.usb.usbendpoint,byte[],int,int,int,int)

 类似资料:
  • 我正在使用以下代码获取通过OTG连接的所有外部存储设备(SDCard或USB)的列表 它读取所有设备中的sdcard,但在某些设备中检测到USB 我该用什么?

  • 我正在尝试从连接到主机模式下的Android手机的USB设备中获取一些数据。我可以发送数据到它,但读取失败。 我一直从方法获得,它指示某种错误,它总是超时。也许问题来自于连接配置,我试了几次(读作:试错),没有一次奏效,令人惊讶的是,我不需要任何配置来发送数据到设备。 编辑 还必须注意的是,我使用的电缆是micro-USB到micro-USB的,它只能以一种方式工作,即只有当插头A连接到电话和插头

  • 我正在考虑构建一个Android应用程序,允许通过蓝牙将音频流式传输到Android手机。我以前在Stackoverflow上读过类似的问题,根据我的理解,A2DP不能用,因为Android不能成为A2DP接收器。 理论上,我认为HFP或HFP AG等配置文件应允许双向音频流。在Android API中,有没有办法强制蓝牙配对遵循此配置文件,或者操作系统是否决定使用哪种配置文件(例如仅当有电话呼叫

  • 我创建了一个android应用程序,它必须设置设备的时间,因为设备不能记住时间。不知道如何设置设备的时间。

  • 我更新了我的SDK,播放服务等等,最近。当我在带有Lollipop前Android的设备/模拟器上运行我的应用程序时,它会立即出现以下错误: 我连火力点都不用!以下是我的分级:

  • 问题内容: 我创建了一个包含Android SDK的Docker映像,并试图将我的Android手机暴露在运行该映像的容器中。因此,我使用该标志并按如下所示安装USB设备: 但是,当我运行ADB设备时,它不会显示USB设备: 容器内的lsusb列出了设备: 但是,该设备在主机上可见: 主机操作系统 Docker版本 可能是什么问题? 问题答案: 我认为设备上运行的ADB守护程序无法连接到两个ADB