3

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

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

・应用程序被Android OS强行杀死(例如内存不足,任务杀手应用程序等)
・应用程序已更新为新版本。

拔掉USB一次就成功了。

代码:

    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

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

所以,我定期将数据从 ADK Board 发送到我的应用程序,它工作正常。
但是,会出现上述问题。

您能否告知是否有解决方法?
谢谢。

4

1 回答 1

3

这是 UsbManager 中的一个已知错误,已经有好几年了: 问题 20545:无法彻底关闭 USB 附件 FileInputStream

已开发但尚未合并到 Android 主干的修复程序: 问题 61390:UsbAccessory 的潜在源代码修复程序未完全解除绑定

此外,您可能希望查看此讨论:在某些用例中关闭 USB 附件连接以解决解决方法的正确方法。

我正在使用定制的 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,它仍然比任何不稳定的解决方案恕我直言要好得多。

于 2013-12-16T17:34:57.670 回答