• スポンサードリンク

AndroidにUSBでカメラを繋ぎた〜い(^o^)/〜その2

Android Camera NDK USB

前回の記事AndroidにUSBでカメラを繋ぎた〜い(^o^)/〜その1の続きです。

USBデバイス一覧の取得

前回のUSBMonitorクラスを使って接続されているUSBデバイスを取得してみます。
既にUSBMonitorのインスタンスを生成してmUSBMonitorに保持しているとすると、

簡単ですね。簡単すぎて説明する気にもならへんけど(-_-;)

USBデバイス一覧の取得

でもこれだと接続されているUSBデバイスはUSBメモリだろうとキーボードだろうとなんでも返って来てしまいます。
どげんかしてフィルターしないといけんって事で、AndroidのSDKのソースの中から探してきて修正してDeviceFilterクラスを作りました。まぁ自前で実装しても対して代わり映えしなですけどね。大元はcom.android.server.usb.UsbSettingsManagerの中にあります。
これにxmlリソースを渡してDeviceFilterを生成してそれを使ってフィルター処理を行います。

ちなみに、xmlファイル内の「class=”239″ subclass=”2″」ってのがUVC Webカメラを指定しています。他にも特定のメーカーとかだけを選択するようにも指定出来ます。

選択ダイアログ

でも、もしかすると端末に複数のカメラを繋ぐ人もいるかも・・・選択できるようにしないとダメですね。選択ダイアログを出すようにしましょう。絶対に最大1台しか繋がへんねんって言うなら上のList<UsbDevice> devicesがnullで無い時に先頭のUsbDeviceを使えばいいです。
なお、ライブラリ自体は複数のカメラをサポートしていますが、Android端末自体の処理速度が間に合うかどうかは別問題です。

選択ダイアログはこんな感じ。

先ほどのフィルター処理を使って接続されているUSBカメラの一覧を取得して専用のAdapterへセットしてSpinnerで選択するようにしています(133-135行)。USBで接続できる台数なんてしれているので毎回生成しても大したこと無いという言い訳をしながら、横着して毎回Adapterを生成しています。まっとうに作るなら#setDevicesみたいなメソッドを作って、変更されたdeviceだけを更新してからAdapter#notifyDataSetChangedを呼び出すべきでしょうね。

もしかすると、ダイアログ表示時にカメラを繋いでいないかもしれないので、「更新」ボタンも付けてみました。ここはちょっとしょうもないテクニックが有ります。普通にAlertDialog.Builder#setPositiveButton/#setNegativeButton/#setNeutralButtonにコールバックを渡してクリックした時の処理をしようとすると、問答無用でダイアログが閉じてしまいます。まぁ表示しているView内にボタンをつければいいだけなんですけど、コールバックの返り値にtrueを返すと閉じるとかにしてくれればよかったのに・・・と愚痴を言っても始まらないので、どげんか・・・もういいですね(-_-;)
どうするかというと、AlertDialog.Builder#setPositiveButton/#setNegativeButton/#setNeutralButtonを呼び出した時に表示されるボタンには実はidが付いています。それぞれandroid.R.id.button1/android.R.id.button2/android.R.id.button3になっています。なので、必要なボタンのidからfindViewByIdでボタンのインスタンスを取得してそれに#setOnClickListenerします(97-100行)。こうすると標準の処理を上書きしてクリックしてもダイアログを閉じないようにすることが出来ます。もしこのlistener内でダイアログを閉じたい状況になるのであればDialog#dismissやDialog#cancelを呼べばOKです。でも標準の処理を上書きするということは標準のデザインパターンから外れることにも繋がるのでよく考えてから実装しましょう。閑話休題。

本当ならベンダー名・製品名・シリアル番号等を取得して表示すればいいんですが、今回は省略。ベンダーIDと製品IDを表示するだけです。

パーミッションの要求(とUSBデバイスのopen)

無事ダイアログでカメラを選択できれば、ダイアログを閉じる時にパーミッションの要求をします。121行目になります。

USBMonitor#requestPermissionでは、既にパーミッションが有ればそのままopenし無ければパーミッションを要求します。パーミッションを持っているかどうかを確認するには、UsbManager#hasPermission(UsbDevice device)メソッドを使います。また、パーミッションを要求するにはUsbManager#requestPermission(UsbDeveice device, Intent intent)を使います。

requestPermissionUsbManager#requestPermissionが呼ばれると、AndroidのOSはパーミッションが有るかどうかを確認して、無ければユーザーに許可を求めるダイアログを表示します。右の画像みたいなやつです。ダイアログで[OK]とすると、無事パーミッションゲットです。USBデバイスを取り外すまではパーミッションが有効になります。
パーミッションが取得できると、USBMinitor内でUSBデバイスのopen処理を行ってからOnDeviceConnectListener#onConnectコールバックが呼ばれるので、ここでUSBカメラへの接続処理を行います。

« »

  • スポンサードリンク

%d人のブロガーが「いいね」をつけました。