微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从Android USB附件读取数据的更好方法

如何解决从Android USB附件读取数据的更好方法

我正在用Java编写一个Android应用程序,该应用程序使用Android附件API与USB附件通信。

google documentation并没有提供实际读写数据的示例,仅提供了如何打开附件进行通信的示例。

它也陈述了两件事:

  1. 通信应在后台线程中进行,而不是在UI线程中进行。
  2. 读取缓冲区的长度至少应为16384字节,因为这是Android Open Accessory协议的最大消息长度。

我实现了这样的阅读方式:

/** boiler plate from example docs: **/
fileDescriptor = usbManager.openAccessory(accessory);

if (fileDescriptor != null) {
    FileDescriptor fd = fileDescriptor.getFileDescriptor();
    inputStream = new FileInputStream(fd);
    readBuffer = new byte[16384];
    // ... some more code that is not relevant for reading data ... //
}

/** my code in separate thread: **/

int read;

while ((read = inputStream.read(readBuffer)) >= 0) {
    // ... parse message and do stuff with it ... //
}

代码有效,并且我从附件中获取了正确的数据,但它为我的应用程序逻辑带来了问题:

  1. 读取功能可以无限期地阻止等待更多数据。
  2. 它有时会在缓冲区中背对背返回多个消息,因此我不知道何时或如何确定附件已完成发送,应该返回累积的字节。
  3. 我还需要将数据发送到附件,但是从两个单独的线程读取和写入USB会导致错误

我无法控制附件上运行的代码,它是封闭产品,但是我知道它的协议:它发送带有2个字节的前缀消息,指示消息的大小。

所以,我尝试了:

read = inputStream.read(readBuffer,2);

if (read == 2) {
    int size = (readBuffer[0] & 0xff) + ((readBuffer[1] & 0xff) << 8);
    read = inputStream.read(readBuffer,2,size);
}

第一次读取返回预期的消息大小,但是第二次读取始终抛出java.io.IOException: read Failed: EIO (I/O error)

我还尝试使用available()方法,然后再调用read尝试找出可以读取多少字节,但这会引发IllegalArgumentException异常。

所以我的问题是:

除了盲目地给read函数提供最大缓冲区并等待其返回之外,还有其他方法可以从Android附件读取数据吗?

如果不是,是否至少有一种方法可以使read函数超时,如果在指定的时间范围内未收到任何字节?

是否有一种方法可以直接使用Android配件上的批量传输API(Android USB Host API允许的方式)?

如果不可能,那么确保对附件的读写操作不会互相干扰的正确逻辑是什么?

我正在使用的协议不能保证一对一的来回发送和接收。 附件可以随时接收用户输入并将其发送到Android设备,即使没有从附件接收到数据,Android设备也需要将数据发送到附件,因此简单的互斥体将无法使用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?