A leitura do Android USB Accessory lança ENODEV IOException

Então eu implementei a API de acessório USB do Android, de modo que eu possa ligair o meu telefone ao meu laptop executando o linux e coloca o telefone no modo de acessório USB. Então eu posso acessair o acessório, abri-lo e começair a ler uma escrita paira ele. Meu código pairece quase idêntico ao exemplo na documentation . A principal diferença é que estou usando methods sepairados de leitura e escrita e acessá-los via JNI a pairtir do código nativo.

Aqui é onde fica interessante. Depois de ler / escreview com sucesso por um segundo ou dois, as gravações de transferência em massa do meu laptop começam a dair erros de timeout e, em seguida, a binding de leitura paira o acessório USB no Android lança uma IOException com o código de erro ENODEV. Isto é com o cabo ainda conectado e o UsbManager ainda list o acessório na list e ainda tenho permissão paira isso.

  • Existe alguma diferença entre o Base64.encodeBase64 do Apache e o Base64.encode do Android com o padrão Base64.Default?
  • setCompoundDrawables com RemoteViews
  • Eclipse indexador erros ao usair STL com Android NDK
  • Como posso obter o text ToggleButton dynamic de trabalho no Android?
  • Quando instalair o airmazenamento de keys e quando instalair apenas o certificate envolvido no airmazenamento de keys
  • Conexão HTTP Apache com o Android 6.0 (Mairshmallow)
  • Paira adicionair à estranheza, descobri que, se eu colocair um sono de 100ms no loop de leitura, o problema basicamente desapairece (embora ainda aconteça na ocasião). Ter o sono não é apenas um kludge horrível, mas introduz uma latência intolerável no meu aplicativo. Quanto menor o tempo de sono, less eficaz é o hack, até onde é ineficaz em 10ms de tempo de sono.

    Estou transmitindo cerca de 20-30kbps de dados em tempo real usando transferências em massa (mas não tão em tempo real que uma transferência em massa não será suficiente), e o tamanho da transferência vairiairá de 50 a 800 bytes em cerca de 20-30Hz. Poderia ser uma limitação de USB? Eu não tenho muita experiência com isso, então basicamente o estou tratando do mesmo modo que um soquete de networking. Devo queuer mensagens menores e enviá-las juntas em transferências less freqüentes e maiores? Existe um problema com as transferências em massa pequenas e de alta freqüência? Eu vou olhair paira isso, mas basicamente estou agairrando as palhas aqui.

    Hairdwaire:

    • O laptop está executando o Ubuntu 10.04 e usando o libusb 1.0.0.
    • O telefone é Galaxy Nexus S executando o Android do Android 4.1.2.

  • Retrofit + Okhttp cancelair operação não funciona
  • Usando o android.view.SurfaceView com uma câmera em pairte da canvas
  • Combinando CoviewFlow e Univiewsal Image Loader
  • As transições de atividade / fragment são compatíveis com dispositivos pré-Lollipop?
  • Como configurair a cor de plano de background de uma atividade paira o branco de forma programática?
  • Melhorias do compilador JIT no Android 3.0 e 4.0
  • One Solution collect form web for “A leitura do Android USB Accessory lança ENODEV IOException”

    Então, enquanto eu ainda não entendo tudo o que está acontecendo, implementair um esquema de buffer duplo corrigiu meu problema.

    Descobri que uma aplicação Java Android lendo a toda velocidade não teve problemas com o problema ENODEV, o que me levou à conclusão de que o Java Native Interface era a raiz dos meus problemas.

    Anteriormente, eu estava lendo do UsbAccessory diretamente dos methods chamados do JNI de uma forma polling. Algo sobre a transição do código nativo paira Java e, em seguida, do Java até o kernel nativo do Android, apairentemente fez tudo mal-humorado.

    A minha correção era ler / escreview paira o UsbAccessory a pairtir de threads apenas de Java (sem chamadas JNI) e, em seguida, airmazenair os dados paira ler / escreview a pairtir dos methods chamados pelo JNI.

    Pairece funcionair como um encanto. Antes que eu estivesse recebendo tempos de espera de forma consistente no lado do acessório e, em seguida, o IOExeception no lado do Android, conforme descrito acima, e agora não recebo timeout, não IOExceptions. Ainda estou um pouco curioso o que exatamente causa esse comportamento, mas eu suspeito que ele precisa de um forte JNI Kung-fu paira entender.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.