Android USB通信 UsbDeviceConnection.bulkTransfer=
如何通过耳机接口判断Android手机的真伪 #生活技巧# #数码产品使用技巧# #二手数码产品鉴定#
项目场景:
最近一直在做Android USB通信的项目,注意是USB通信,非USB转串口。USB通信有数据的写入和数据读取,碰到了一个问题,数据写入一直有问题,无法正常写入数据。
问题描述:
int ret = usbDeviceConnection.bulkTransfer(usbEpOut, writeBuffer, writeLength, 1
在其准备工作都做好后,调用方法写入数据,结果总是rer=-1,如果通信正常,会返回写入数据的长度,即ret=writeLenth。
现已排除其他因数:
UsbEndpoint usbEpOut和UsbEndpoint usbEpIn没有弄混写入数据长度很小,不会超范围原因分析:
通过各种排查,一定是哪个地方有代码缺陷。我一开始做这个是在网上找的资料,可能网上的案例代码也不全。
最终找到缺失代码
usbDeviceConnection.claimInterface(mInterface, true) 1
我们来查看claimInterface这个方法的源码
/** * Claims exclusive access to a {@link android.hardware.usb.UsbInterface}. * This must be done before sending or receiving data on any * {@link android.hardware.usb.UsbEndpoint}s belonging to the interface. * 声明对{@link android.hardware.usb.UsbInterface}的专有访问权。 * 必须在属于该接口的任何{@link android.hardware.usb.UsbEndpoint}上发送或接收数据之前完成此操作。 * @param intf the interface to claim * @param force true to disconnect kernel driver if necessary 必要时为true,以断开内核驱动程序 * @return true if the interface was successfully claimed 如果接口已成功声明,则为true */ public boolean claimInterface(UsbInterface intf, boolean force) { return native_claim_interface(intf.getId(), force); } 12345678910111213
方法的意思就是,在使用UsbInterface进行数据的写入写出之前,要申明对其的专有访问权限,防止通信混乱。
解决方案:
在usbManager.openDevice(device)创建连接成功后,检查UsbInterface的专有访问权限,有权限了就能进行正常通信,一般设备都是可以通过的。
usbDeviceConnection = usbManager.openDevice(device); if (usbDeviceConnection != null) { if (usbDeviceConnection.claimInterface(mInterface, true)) { //初始化成功,可用了 return; } else {//无通信权限 usbDeviceConnection.close(); } } 12345678910
网址:Android USB通信 UsbDeviceConnection.bulkTransfer= https://www.yuejiaxmz.com/news/view/538364
相关内容
STM32F407 USB通信与虚拟串口CDC类开发实战Android与物联网设备通信
轻松上手,Android TV电视安装全攻略:告别繁琐,享受智能生活
udevadm命令查看usb设备信息
快速清理:在 Android 上删除文件的 3 种超简单方法
android 使用手机调试问题 荣耀9青春版USB无法授权
快速清理Android垃圾文件【5个实用方法】
Android 数据永久删除:确保隐私安全
Antivirus & cyber security for Windows, Android or Mac
解锁科技新篇章:一招教你轻松远程启动Android手机,告别等待,尽享便捷生活!