KotlinでスマートフォンをホストにしたUSB端末と接続して利用するアプリを開発しています。
その中でandroid.hardware.usb以下のライブラリを利用してバイト列をUSB端末に送受信していますが、
現在使用しているUsbRequest.queue関数がdeprecatedになり
新しい関数での実装を試みていますがうまく動作しません。
エラーが起きている場所はdoResponse関数のfinishReq = connection.requestWait()の部分です。
そこより少し前のところにsdkで場合分けしている箇所があるのですが、sdkが26以上の時のみエラーが起きます。
エラーは IllegalArgumentException java.nio.Buffer.limit でした
不明な点がある場合は質問をお願いします。
よろしくお願いします。
追記
説明不足でした。
開発で利用しているHUAWEIのmediaPad(Android9)ではエラーが起きないのですが
NECのPC-TAB08F01ではusb端末とつなげて数分通信していると上記のエラーが起きます。
※非同期処理にはCoroutineを使用しています
Kotlin
1//この関数をライフサイクル上で呼び出しています。 2fun sample() = GlobalScope.launch(Dispatchers.Main) { 3 val idm = connectDevice() 4 //ここから取得したidmでの処理 5} 6 7private suspend fun connectDevice():String = withContext(Dispatchers.Default) { 8 //connection:UsbDeviceConnection 9 //usbInterface:UsbInterface 10 val result = connection.claimInterface(usbInterface,true) 11 do { 12 doRequest(ByteArray型) 13 doRequest(ByteArray型) 14 last = doResponse(6) 15 last = doResponse(13) 16 doRequest(ByteArray型) 17 last = doResponse(6) 18 last = doResponse(13) 19 doRequest(ByteArray型) 20 last = doResponse(6) 21 last = doResponse(13) 22 doRequest(ByteArray型) 23 last = doResponse(6) 24 last = doResponse(13) 25 doRequest(ByteArray型) 26 last = doResponse(6) 27 last = doResponse(13) 28 doRequest(ByteArray型) 29 last = doResponse(6) 30 last = doResponse(13) 31 doRequest(ByteArray型) 32 last = doResponse(6) 33 last = doResponse(37) 34 }while(last!!.size <= 36) 35 //文字列に変換する関数(記載なし) 36 idmConverter(last!!) 37} 38 39@Throws(IOException::class) 40 suspend fun doRequest(buff: ByteArray) = withContext(Dispatchers.Default){ 41 val buffer = ByteBuffer.allocate(buff.size) 42 request = UsbRequest() 43 buffer.put(buff) 44 request.initialize(connection, epOut) 45 if(Build.VERSION.SDK_INT >= 26){ 46 request.queue(ByteBuffer.wrap(buff)) 47 }else{ 48 request.queue(buffer, buff.size) 49 } 50 do { 51 finishReq = connection.requestWait() 52 if(finishReq == request){ 53 finishReq.close() 54 break 55 } 56 if (finishReq == null) throw IOException("Request failed.") 57 Thread.sleep(100) 58 }while(true) 59 } 60 61 @Throws(IOException::class) 62 suspend fun doResponse(length:Int): ByteArray = withContext(Dispatchers.Default) { 63 var buffer:ByteBuffer? = null 64 request = UsbRequest() 65 request.initialize(connection, epIn) 66 if(Build.VERSION.SDK_INT >= 26){ 67 val buff = ByteArray(length) 68 buffer = ByteBuffer.wrap(buff) 69 buffer.clear() 70 request.queue(buffer) 71 }else{ 72 buffer = ByteBuffer.allocate(length) 73 buffer.clear() 74 request.queue(buffer,length) 75 } 76 do { 77 //ここでエラー 78 finishReq = connection.requestWait() 79 if(finishReq == request){ 80 finishReq.close() 81 break 82 } 83 if (finishReq == null) throw IOException("Request failed.") 84 Thread.sleep(100) 85 }while(true) 86 87 if (buffer.remaining() == 0) buffer.flip() 88 val buff = ByteArray(buffer.remaining()) 89 buffer.get(buff) 90 buff 91 }
あなたの回答
tips
プレビュー