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 からアプリにデータを送信していますが、問題なく動作しています。
ただし、上記の問題が発生します。
回避策があれば教えていただけますか?
ありがとう。