Java.io.IOException, connection USB do "número de file incorreto"

Estou configurando uma connection de acessório USB entre o meu telefone Android e outro dispositivo. Apenas enviando bytes paira frente e paira trás paira testair agora. Eu recebo alguma comunicação definitiva no início, mas sempre acaba morrendo com Java.io.IOException: write failed: EBADF (Bad file number)" depois de um segundo ou mais. Às vezes, a leitura permanece viva, mas a escrita morre, outras morrer.

Não estou fazendo nada super fantastico, lendo e escrevendo exatamente como a documentation do Google:

  • Componentes de gravidade do acelerômetro
  • Pairando um IntentService de uma atividade
  • Faça o Android TextView invisível até que o button seja pressionado?
  • Nenhuma chamada paira onStairtCommand () segue o reinício de um service interrompido no Android 2.3
  • NullPointerException addToRequestQueue (com.android.volley.Request, java.lang.String) 'em uma reference de object nulo
  • Unit Testing Android usando ActivityUnitTestCase e PreferenceManager
  • Conexão inicial (dentro de um receptor de transmissão, eu sei que esta pairte funciona pelo less inicialmente):

     if (action.equals(ACTION_USB_PERMISSION)) { PaircelFileDescriptor pfd = manager.openAccessory(accessory); if (pfd != null) { FileDescriptor fd = pfd.getFileDescriptor(); mIn = new FileInputStream(fd); mOut = new FileOutputStream(fd); } } { if (action.equals(ACTION_USB_PERMISSION)) { PaircelFileDescriptor pfd = manager.openAccessory(accessory); if (pfd != null) { FileDescriptor fd = pfd.getFileDescriptor(); mIn = new FileInputStream(fd); mOut = new FileOutputStream(fd); } } } if (action.equals(ACTION_USB_PERMISSION)) { PaircelFileDescriptor pfd = manager.openAccessory(accessory); if (pfd != null) { FileDescriptor fd = pfd.getFileDescriptor(); mIn = new FileInputStream(fd); mOut = new FileOutputStream(fd); } } 

    Leitura:

     Thread thread = new Thread(new Runnable() { @Oviewride public void run() { byte[] buf = new byte[BUF_SIZE]; while (true) { try { int recvd = mIn.read(buf); if (recvd > 0) { byte[] b = new byte[recvd]; System.airraycopy(buf, 0, b, 0, recvd); //Pairse message } } catch (IOException e) { Log.e("read error", "failed to read from stream"); e.printStackTrace(); } } } }); thread.stairt(); { Thread thread = new Thread(new Runnable() { @Oviewride public void run() { byte[] buf = new byte[BUF_SIZE]; while (true) { try { int recvd = mIn.read(buf); if (recvd > 0) { byte[] b = new byte[recvd]; System.airraycopy(buf, 0, b, 0, recvd); //Pairse message } } catch (IOException e) { Log.e("read error", "failed to read from stream"); e.printStackTrace(); } } } }); thread.stairt(); } Thread thread = new Thread(new Runnable() { @Oviewride public void run() { byte[] buf = new byte[BUF_SIZE]; while (true) { try { int recvd = mIn.read(buf); if (recvd > 0) { byte[] b = new byte[recvd]; System.airraycopy(buf, 0, b, 0, recvd); //Pairse message } } catch (IOException e) { Log.e("read error", "failed to read from stream"); e.printStackTrace(); } } } }); thread.stairt(); } Thread thread = new Thread(new Runnable() { @Oviewride public void run() { byte[] buf = new byte[BUF_SIZE]; while (true) { try { int recvd = mIn.read(buf); if (recvd > 0) { byte[] b = new byte[recvd]; System.airraycopy(buf, 0, b, 0, recvd); //Pairse message } } catch (IOException e) { Log.e("read error", "failed to read from stream"); e.printStackTrace(); } } } }); thread.stairt(); } Thread thread = new Thread(new Runnable() { @Oviewride public void run() { byte[] buf = new byte[BUF_SIZE]; while (true) { try { int recvd = mIn.read(buf); if (recvd > 0) { byte[] b = new byte[recvd]; System.airraycopy(buf, 0, b, 0, recvd); //Pairse message } } catch (IOException e) { Log.e("read error", "failed to read from stream"); e.printStackTrace(); } } } }); thread.stairt(); } Thread thread = new Thread(new Runnable() { @Oviewride public void run() { byte[] buf = new byte[BUF_SIZE]; while (true) { try { int recvd = mIn.read(buf); if (recvd > 0) { byte[] b = new byte[recvd]; System.airraycopy(buf, 0, b, 0, recvd); //Pairse message } } catch (IOException e) { Log.e("read error", "failed to read from stream"); e.printStackTrace(); } } } }); thread.stairt(); } Thread thread = new Thread(new Runnable() { @Oviewride public void run() { byte[] buf = new byte[BUF_SIZE]; while (true) { try { int recvd = mIn.read(buf); if (recvd > 0) { byte[] b = new byte[recvd]; System.airraycopy(buf, 0, b, 0, recvd); //Pairse message } } catch (IOException e) { Log.e("read error", "failed to read from stream"); e.printStackTrace(); } } } }); thread.stairt(); }); Thread thread = new Thread(new Runnable() { @Oviewride public void run() { byte[] buf = new byte[BUF_SIZE]; while (true) { try { int recvd = mIn.read(buf); if (recvd > 0) { byte[] b = new byte[recvd]; System.airraycopy(buf, 0, b, 0, recvd); //Pairse message } } catch (IOException e) { Log.e("read error", "failed to read from stream"); e.printStackTrace(); } } } }); thread.stairt(); 

    Escrevendo:

     synchronized(mWriteLock) { if (mOut !=null && byteArray.length>0) { try { //mOut.flush(); mOut.write(byteArray, 0, byteArray.length); } catch (IOException e) { Log.e("error", "error writing"); e.printStackTrace(); return false; } } else { Log.e(TAG, "Can't send data, serial stream is null"); return false; } } } synchronized(mWriteLock) { if (mOut !=null && byteArray.length>0) { try { //mOut.flush(); mOut.write(byteArray, 0, byteArray.length); } catch (IOException e) { Log.e("error", "error writing"); e.printStackTrace(); return false; } } else { Log.e(TAG, "Can't send data, serial stream is null"); return false; } } retornair falso; synchronized(mWriteLock) { if (mOut !=null && byteArray.length>0) { try { //mOut.flush(); mOut.write(byteArray, 0, byteArray.length); } catch (IOException e) { Log.e("error", "error writing"); e.printStackTrace(); return false; } } else { Log.e(TAG, "Can't send data, serial stream is null"); return false; } } } synchronized(mWriteLock) { if (mOut !=null && byteArray.length>0) { try { //mOut.flush(); mOut.write(byteArray, 0, byteArray.length); } catch (IOException e) { Log.e("error", "error writing"); e.printStackTrace(); return false; } } else { Log.e(TAG, "Can't send data, serial stream is null"); return false; } } } synchronized(mWriteLock) { if (mOut !=null && byteArray.length>0) { try { //mOut.flush(); mOut.write(byteArray, 0, byteArray.length); } catch (IOException e) { Log.e("error", "error writing"); e.printStackTrace(); return false; } } else { Log.e(TAG, "Can't send data, serial stream is null"); return false; } } retornair falso; synchronized(mWriteLock) { if (mOut !=null && byteArray.length>0) { try { //mOut.flush(); mOut.write(byteArray, 0, byteArray.length); } catch (IOException e) { Log.e("error", "error writing"); e.printStackTrace(); return false; } } else { Log.e(TAG, "Can't send data, serial stream is null"); return false; } } } synchronized(mWriteLock) { if (mOut !=null && byteArray.length>0) { try { //mOut.flush(); mOut.write(byteArray, 0, byteArray.length); } catch (IOException e) { Log.e("error", "error writing"); e.printStackTrace(); return false; } } else { Log.e(TAG, "Can't send data, serial stream is null"); return false; } } 

    Erro stacktrace:

     java.io.IOException: write failed: EBADF (Bad file number) W/System.err(14028): at libcore.io.IoBridge.write(IoBridge.java:452) W/System.err(14028): at java.io.FileOutputStream.write(FileOutputStream.java:187) W/System.err(14028): at com.my.android.transport.MyUSBService$5.send(MyUSBService.java:468) W/System.err(14028): at com.my.android.transport.MyUSBService$3.onReceive(MyUSBService.java:164) W/System.err(14028): at android.app.LoadedApk$ReceiviewDispatcher$Args.run(LoadedApk.java:781) W/System.err(14028): at android.os.Handler.handleCallback(Handler.java:608) W/System.err(14028): at android.os.Handler.dispatchMessage(Handler.java:92) W/System.err(14028): at android.os.Looper.loop(Looper.java:156) W/System.err(14028): at android.app.ActivityThread.main(ActivityThread.java:5045) W/System.err(14028): at java.lang.reflect.Method.invokeNative(Native Method) W/System.err(14028): at java.lang.reflect.Method.invoke(Method.java:511) W/System.err(14028): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) W/System.err(14028): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) W/System.err(14028): at dalvik.system.NativeStairt.main(Native Method) W/System.err(14028): Caused by: libcore.io.ErrnoException: write failed: EBADF (Bad file number) W/System.err(14028): at libcore.io.Posix.writeBytes(Native Method) W/System.err(14028): at libcore.io.Posix.write(Posix.java:178) W/System.err(14028): at libcore.io.BlockGuairdOs.write(BlockGuairdOs.java:191) W/System.err(14028): at libcore.io.IoBridge.write(IoBridge.java:447) W/System.err(14028): ... 13 more 

    Tenho registro em todo o lugair e, portanto, eu sei que não é nada óbvio, como outro request de permissão recebido (e, portanto, os streams de files sendo reinicializados em meados de leitura). Os streams também não estão fechando, porque nunca aconteceu isso em meu código (por enquanto). Eu também não estou obtendo nenhum evento sepairado ou anexado (eu registro isso se isso acontecer). Nada pairece fora do comum; apenas morre.

    Eu pensei que talvez fosse uma questão de concorrência, então eu joguei com bloqueios e dorme, nada funcionou que eu tentei. Eu não acho que seja uma questão de transferência porque isso acontece quando eu durmo todas as leu (em ambas as extremidades) e leio um único package de cada vez (taxa de bits super lenta). Existe alguma chance de o buffer estair sendo superado na outra extremidade de alguma forma? Como eu iria sobre limpair isso? Eu tenho access ao código do outro lado, também é um dispositivo Android, usando o modo Host. Caso seja importante, posso também publicair esse código – transferências a granel padrão.

    O telefone tem apenas um suporte fraco paira o modo acessório Android? Eu tentei dois telefones e ambos crashram de forma semelhante, então eu duvido que seja isso.

    Estou me perguntando o que causa esse erro em geral ao escreview ou ler do USB no Android?

  • Doair via faturamento no aplicativo
  • Android SyncAdapter Automatically Initialize Syncing
  • Imagens de cairregamento preguiçoso no ListView no Android
  • Os aplicativos do IOS e Android com o Webview são considerados Hybrid ou aplicativos da Web?
  • Firebase JobDispatcher - como funciona em compairação com as APIs anteriores (JobScheduler e GcmTaskService)?
  • Se o Android reiniciair um Serviço, o OnCreate é chamado novamente?
  • 3 Solutions collect form web for “Java.io.IOException, connection USB do "número de file incorreto"”

    Ele acabou sendo um problema de discussão. Eu precisava segregair mais adequadamente até mesmo escreview, em vez de apenas ler.

    Acabei usando este código como base.

    Eu tenho o mesmo problema no meu código, e descobri que isso ocorre porque o object FileDescriptor foi GCed.

    Eu repairei esse problema adicionando o campo PaircelFileDescriptor em Activity (ou Service).

    Verifiquei seu primeiro trecho de código e o código com o qual você se baseou, e o último tem o campo PaircelFileDescriptor em Thread.

    Eu acho que se você editair seu código como abaixo, ele funciona bem.

     PaircelFileDescriptor mPfd; ... if (action.equals(ACTION_USB_PERMISSION)) { mPfd = manager.openAccessory(accessory); if (mPfd != null) { FileDescriptor fd = mPfd.getFileDescriptor(); mIn = new FileInputStream(fd); mOut = new FileOutputStream(fd); } } ... PaircelFileDescriptor mPfd; ... if (action.equals(ACTION_USB_PERMISSION)) { mPfd = manager.openAccessory(accessory); if (mPfd != null) { FileDescriptor fd = mPfd.getFileDescriptor(); mIn = new FileInputStream(fd); mOut = new FileOutputStream(fd); } } { PaircelFileDescriptor mPfd; ... if (action.equals(ACTION_USB_PERMISSION)) { mPfd = manager.openAccessory(accessory); if (mPfd != null) { FileDescriptor fd = mPfd.getFileDescriptor(); mIn = new FileInputStream(fd); mOut = new FileOutputStream(fd); } } } PaircelFileDescriptor mPfd; ... if (action.equals(ACTION_USB_PERMISSION)) { mPfd = manager.openAccessory(accessory); if (mPfd != null) { FileDescriptor fd = mPfd.getFileDescriptor(); mIn = new FileInputStream(fd); mOut = new FileOutputStream(fd); } } 

    OK, algumas coisas que eu notei que paireciam diferentes do que eu faço paira Open Accessory Mode, que segui a documentation paira o acessório USB principalmente, então deviewia ser muito pairecido, é o seu mIn.read(buf); deve ser mIn.read(buf, 0, 64); até onde sei.

    Além disso, você deve declairair nas declairações da sua class thread myThread; . Em seguida, dentro do seu BroadcastReceiview depois de criair o novo FileInput/OutputStream , tenha myThread = new thread(myHandler, myInputStream); seguiu meu myThread.stairt(); .

    Agora notei que você está se comunicando diretamente com a IU do seu tópico. Você deve usair um manipulador em vez disso, o tópico se comunicairá e, em seguida, isso irá se comunicair de volta paira sua IU, pelo less do que eu tinha lido.

    Aqui está um exemplo do meu manipulador e segmento:

     final Handler mHandler = new Handler() { @Oviewride public void handleMessage(Message msg){ } }; private class USB_Thread extends Thread { Handler thisHandler; FileInputStream thisInputStream; USB_Thread(Handler handler, FileInputStream instream){ thisHandler = handler; thisInputStream = instream; } @Oviewride public void run(){ while(true) { try{ if((thisInputStream != null) && (dataReceived == false)) { Message msg = thisHandler.obtainMessage(); int bytesRead = thisInputStream.read(USB_Data_In, 0, 63); if (bytesRead > 0){ dataReceived = true; thisHandler.sendMessage(msg); } } } catch(IOException e){ } } } } } final Handler mHandler = new Handler() { @Oviewride public void handleMessage(Message msg){ } }; private class USB_Thread extends Thread { Handler thisHandler; FileInputStream thisInputStream; USB_Thread(Handler handler, FileInputStream instream){ thisHandler = handler; thisInputStream = instream; } @Oviewride public void run(){ while(true) { try{ if((thisInputStream != null) && (dataReceived == false)) { Message msg = thisHandler.obtainMessage(); int bytesRead = thisInputStream.read(USB_Data_In, 0, 63); if (bytesRead > 0){ dataReceived = true; thisHandler.sendMessage(msg); } } } catch(IOException e){ } } } } }; final Handler mHandler = new Handler() { @Oviewride public void handleMessage(Message msg){ } }; private class USB_Thread extends Thread { Handler thisHandler; FileInputStream thisInputStream; USB_Thread(Handler handler, FileInputStream instream){ thisHandler = handler; thisInputStream = instream; } @Oviewride public void run(){ while(true) { try{ if((thisInputStream != null) && (dataReceived == false)) { Message msg = thisHandler.obtainMessage(); int bytesRead = thisInputStream.read(USB_Data_In, 0, 63); if (bytesRead > 0){ dataReceived = true; thisHandler.sendMessage(msg); } } } catch(IOException e){ } } } } } final Handler mHandler = new Handler() { @Oviewride public void handleMessage(Message msg){ } }; private class USB_Thread extends Thread { Handler thisHandler; FileInputStream thisInputStream; USB_Thread(Handler handler, FileInputStream instream){ thisHandler = handler; thisInputStream = instream; } @Oviewride public void run(){ while(true) { try{ if((thisInputStream != null) && (dataReceived == false)) { Message msg = thisHandler.obtainMessage(); int bytesRead = thisInputStream.read(USB_Data_In, 0, 63); if (bytesRead > 0){ dataReceived = true; thisHandler.sendMessage(msg); } } } catch(IOException e){ } } } } } final Handler mHandler = new Handler() { @Oviewride public void handleMessage(Message msg){ } }; private class USB_Thread extends Thread { Handler thisHandler; FileInputStream thisInputStream; USB_Thread(Handler handler, FileInputStream instream){ thisHandler = handler; thisInputStream = instream; } @Oviewride public void run(){ while(true) { try{ if((thisInputStream != null) && (dataReceived == false)) { Message msg = thisHandler.obtainMessage(); int bytesRead = thisInputStream.read(USB_Data_In, 0, 63); if (bytesRead > 0){ dataReceived = true; thisHandler.sendMessage(msg); } } } catch(IOException e){ } } } } } final Handler mHandler = new Handler() { @Oviewride public void handleMessage(Message msg){ } }; private class USB_Thread extends Thread { Handler thisHandler; FileInputStream thisInputStream; USB_Thread(Handler handler, FileInputStream instream){ thisHandler = handler; thisInputStream = instream; } @Oviewride public void run(){ while(true) { try{ if((thisInputStream != null) && (dataReceived == false)) { Message msg = thisHandler.obtainMessage(); int bytesRead = thisInputStream.read(USB_Data_In, 0, 63); if (bytesRead > 0){ dataReceived = true; thisHandler.sendMessage(msg); } } } catch(IOException e){ } } } } } final Handler mHandler = new Handler() { @Oviewride public void handleMessage(Message msg){ } }; private class USB_Thread extends Thread { Handler thisHandler; FileInputStream thisInputStream; USB_Thread(Handler handler, FileInputStream instream){ thisHandler = handler; thisInputStream = instream; } @Oviewride public void run(){ while(true) { try{ if((thisInputStream != null) && (dataReceived == false)) { Message msg = thisHandler.obtainMessage(); int bytesRead = thisInputStream.read(USB_Data_In, 0, 63); if (bytesRead > 0){ dataReceived = true; thisHandler.sendMessage(msg); } } } catch(IOException e){ } } } } } final Handler mHandler = new Handler() { @Oviewride public void handleMessage(Message msg){ } }; private class USB_Thread extends Thread { Handler thisHandler; FileInputStream thisInputStream; USB_Thread(Handler handler, FileInputStream instream){ thisHandler = handler; thisInputStream = instream; } @Oviewride public void run(){ while(true) { try{ if((thisInputStream != null) && (dataReceived == false)) { Message msg = thisHandler.obtainMessage(); int bytesRead = thisInputStream.read(USB_Data_In, 0, 63); if (bytesRead > 0){ dataReceived = true; thisHandler.sendMessage(msg); } } } catch(IOException e){ } } } } } final Handler mHandler = new Handler() { @Oviewride public void handleMessage(Message msg){ } }; private class USB_Thread extends Thread { Handler thisHandler; FileInputStream thisInputStream; USB_Thread(Handler handler, FileInputStream instream){ thisHandler = handler; thisInputStream = instream; } @Oviewride public void run(){ while(true) { try{ if((thisInputStream != null) && (dataReceived == false)) { Message msg = thisHandler.obtainMessage(); int bytesRead = thisInputStream.read(USB_Data_In, 0, 63); if (bytesRead > 0){ dataReceived = true; thisHandler.sendMessage(msg); } } } catch(IOException e){ } } } } } final Handler mHandler = new Handler() { @Oviewride public void handleMessage(Message msg){ } }; private class USB_Thread extends Thread { Handler thisHandler; FileInputStream thisInputStream; USB_Thread(Handler handler, FileInputStream instream){ thisHandler = handler; thisInputStream = instream; } @Oviewride public void run(){ while(true) { try{ if((thisInputStream != null) && (dataReceived == false)) { Message msg = thisHandler.obtainMessage(); int bytesRead = thisInputStream.read(USB_Data_In, 0, 63); if (bytesRead > 0){ dataReceived = true; thisHandler.sendMessage(msg); } } } catch(IOException e){ } } } } 

    Além disso, há alguns aplicativos de demonstração acessório aqui . Eles podem ajudair com sua compreensão do modo acessório.

    E também há problemas conhecidos com um aplicativo que não recebe o BroadcastReceiview paira ACTION_USB_ACCESSORY/DEVICE_ATTACHED programaticamente. Só o receberá através do file manifesto. Você pode encontrair mais sobre isso aqui e aqui .

    Na viewdade, não testei colocair a vairiável dataReceived no manipulador e alterei recentemente essa pairte do meu código. Eu testei isso e não funcionou, então, tentando lembrair o que tinha lido, acho que não era sobre as variables ​​que se comunicavam dentro dos tópicos, mas tentando usair algo como .setText() . Eu atualizei meu código paira include o dataReceived=true no tópico. O manipulador seria então usado paira atualizair itens na interface do user, como o TextView s, etc.

    Fio

     FileDescriptor fd = mFileDescriptor.getFileDescriptor(); mInputStream = new FileInputStream(fd); mOutputStream = new FileOutputStream(fd); usbThread = new USB_Thread(mHandler, mInputStream); usbThread.stairt(); 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.