gpt4 book ai didi

安卓 ADK : IO Exception (ENODEV)

转载 作者:搜寻专家 更新时间:2023-11-01 08:56:25 26 4
gpt4 key购买 nike

我正在使用 Galaxy Nexus (4.2.2) 和 ADK Board(Microchip Co. 的 PIC24F)制作一个使用 Android Open Accessory 的应用程序。

在与 USB 通信时发生以下事件后,如果它再次启动我的应用程序,每当它尝试将数据传输到 ADK 板时,OutputStream.write() 都会抛出 IOException(ENODEV)。

・App被Android系统强行杀掉(如内存不足、任务 killer 等)
・应用程序已更新为新版本。

USB detach一次就成功了。

代码:

    public void openAccessory(UsbAccessory accessory) {

ParcelFileDescriptor p = mUsbManager.openAccessory(accessory);
if (p == null) { return;}
else {mFileDescriptor = p;}

FileDescriptor fd = mFileDescriptor.getFileDescriptor();
if (fd == null) {return;}

mOutputStream = new FileOutputStream(fd);
if (isSendSuccess()) {
mInputStream = new FileInputStream(fd);
}
}


private boolean isSendSuccess() {
final byte[] test = new byte[]{0x01,02};

for (int i=0; i<2; i++) { //send test
try {
mOutputStream.write(test);
return true;
} catch (IOException e) {
e.printStackTrace(); //throw ENODEV after app is forced kill.
}
}
return false;
}


错误日志:

    W/System.err(17198): java.io.IOException: write failed: ENODEV (No such device)
W/System.err(17198): at libcore.io.IoBridge.write(IoBridge.java:462)
W/System.err(17198): at java.io.FileOutputStream.write(FileOutputStream.java:187)
・・・・・・
W/System.err(17198): Caused by: libcore.io.ErrnoException: write failed: ENODEV (No such device)
W/System.err(17198): at libcore.io.Posix.writeBytes(Native Method)
W/System.err(17198): at libcore.io.Posix.write(Posix.java:178)
W/System.err(17198): at libcore.io.BlockGuardOs.write(BlockGuardOs.java:191)
W/System.err(17198): at libcore.io.IoBridge.write(IoBridge.java:457)
W/System.err(17198): ... 23 more

附录:
我知道存在一个问题,例如:
http://code.google.com/p/android/issues/detail?id=20545

因此,我定期将数据从 ADK Board 发送到我的应用程序,并且运行良好。
但是,出现了上面的问题。

您能否建议是否有解决方法?
谢谢。

最佳答案

这是多年以来 UsbManager 中的一个已知错误: Issue 20545: Unable to cleanly close USB accessory FileInputStream

已开发但尚未合并到 Android 主干中的修复程序: Issue 61390: Potential source code fixes for UsbAccessory not unbinding cleanly

你也可能想看看这个讨论:Proper way to close a USB accessory connection解决某些用例中的想法。

我正在使用自定义的 Android ROM (CyanogenMod),所以我可能会尝试应用 61390 的修复程序。我做了很多测试试图自己解决这个问题,但我无法获得稳定的解决方案.我正在考虑改用 libusb 端口:https://github.com/OpenNI/OpenNI2/tree/master/ThirdParty/PSCommon/XnLib/ThirdParty/libusb-1.0.9-Android (来自 https://stackoverflow.com/a/16234205/1028256,你可以在那里投票),它被告知即使在没有 root 权限的手机上也能工作(我自己没试过),它支持异步模式,所以可以避免阻塞 Java 中的线程。但是您将不得不使用 JNI,它仍然比任何不稳定的解决方案恕我直言要好得多。

关于安卓 ADK : IO Exception (ENODEV),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18583555/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com