3

Galaxy Nexus (4.2.2) と ADK Board (Microchip Co.のPIC24F) を使って Android Open Accessories を使ったアプリケーションを作っています。

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