SyntaxHigh

Thursday, November 27, 2014

Android Multiple USB-Serial

最近Androidのシリアル通信を使った周辺機器開発をしてます。

Androidでシリアル通信をしたい場合、こういうライブラリがあります。

https://github.com/mik3y/usb-serial-for-android

ドキュメントが最新版と合っていなかったり、そのせいで関数がごちゃごちゃになってて動かすのが大変でしたが、なんとかフォーラムを見て解決できます。

問題は、複数のUSB-Serial機器を動かす場合でした。ライブラリというよりは、アンドロイドのセキュリティがよくわかってなくて詰まりました。

<intent-filter>
    <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
</intent-filter>

という文を Android.Manifest.xml に書くのですが、USBデバイスを Android に接続した時にでてくるダイアログ(アプリケーションを選ぶもの)を選択すると、このUSBデバイスは「ユーザーの許可」を得たことになるそうです。しかし、一度のダイアログではひとつしかデバイスが許可されません。ですので、例えばUSBハブにUSBデバイスを二つ挿して、ハブを挿入すると、ひとつしか許可されません。

複数のUSBデバイスを使用する場合は、例えばデバイスAを挿してアプリを起動する –>デバイスBを挿してアプリを再度指定する、ということをしないといけないようです。

任意のタイミング(例えば onCreate の時のみ)でデバイスの使用を許可するには、

http://developer.android.com/guide/topics/connectivity/usb/host.html#permission-d

ここに書いてあるように、まず broadcast receiver というのを作って、そのレシーバーに向かって intent をとばしてやる必要があるようです。この辺の intent は、要するにOSからアプリに送られたメッセージらしいです(なんでこんな妙な名前にしたんだか)。

これだと、ハブに繋がれたデバイスを挿入すると、2回ダイアログが出ます。その後、一旦「デフォルトでOK」というダイアログでデバイスを登録すると、再度聞かれることはなくなりました。デバイス接続時にアプリを選択するより、こちらの方が安定しているようです。

デバイスを接続すると自動的アプリを起動する、という動作はかなり変なので、一般的には broadcast receiver を使う必要があるでしょう。