質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

0回答

1740閲覧

android・usb端末間通信について

rashild

総合スコア24

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

1グッド

2クリップ

投稿2020/03/11 10:03

編集2020/03/12 09:52

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 }
falcom_zx👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2020/03/11 15:15

> IllegalArgumentException java.nio.Buffer.limit その例外の全文を載せたほうが良いのではないでしょうか.
rashild

2020/03/12 09:55

いま追記したのですが、エラーが起きた端末は自分のタブレットではなくしばらく確認できそうにないです。 1行目のエラーだけ覚えていたのでもっと見ておくべきでした。 すみません。
jimbe

2020/03/12 11:09

必ず起きるのではなく機種依存や環境依存が考えられるのでしたら, とにかく実機で現象を捕らえてログ等で詳細な情報を得るしかありません.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問