たくさんの自由帳
Androidのお話
たくさんの自由帳
投稿日 : | 0 日前
文字数(だいたい) : 3322
どうもこんばんわ。
最近は数年ぶりにNova Launcherってホームアプリを使ってます。Android 7くらいのときは有料版を買うくらいには気に入ってた。
列や行のサイズを変えたり(今なら標準で出来ますが、上限付き)、ウィジェットの最小幅を無視したり、上から下スワイプで通知領域を展開したり(これも今なら標準で出来ますが)、ページ丸々削除するやつとか、通知バッチとか気に入ってた。
しかしAndroid 10が来てからは、ジェスチャーナビゲーションを使うために標準ホームアプリを使ってました。
正しくはサードパーティのホームアプリでもジェスチャーナビゲーションが使えたのですが、その頃のサードパーティのホームアプリにはホーム画面に戻ったときのアニメーションが実装されて無くて、使うのをやめちゃったんですよね。(そもそもデバイスメーカーによっては標準ホームアプリ以外を使う場合はジェスチャーナビゲーションが無効になるとか)Androidがそれ用のAPIを提供してくれないのが悪いみたいでサードパーティが対応するのは難しいとか。
が、やっぱりウィジェットを詰め込みたくて舞い戻ってきた。最小幅を無視したい。
今使ってますが、かなり再現度の高いジェスチャーのアニメーションがされるようになってました。
いつから実装されたんだろう?APIがないからサードパーティではもう無理なのかなって思い込んでたんだけど、Nova Launcher側でフルスクラッチしたのか、かなり再現度の高いアニメーションがされるように進化してた、、、
ギブアップです。わかりません。
敗因はUVCどころかUSB自体がわからなかったことかなと思います。
Android NDK、というよりかはC / C++無しでUSB Video Class (UVC)をやりたかった。。。
なんとかJava / Kotlinだけで書けるようになりたかった。
一応繋いで、権限を付与した後ボタンを押すと、こんな感じのぐちゃぐちゃな画像ができます。
本当はぐちゃぐちゃにならないはずですが。。
Xperiaの外部モニターだときれいに出ている。解像度が変なのは私があれこれいじったせい。
ぶっちゃけパクリです。すいません
Raw UVC on Android
It was time to integrate support for the Nreal Light's stereo camera into our Android build, but our go-to library (nokhwa) does not work on Android. In fact, nothing seemed to support this specific camera on Android... So it was time to make our own USB Video Device Class implementation (but not really).
https://voidcomputing.hu/blog/android-uvc
GitHub - libuvc/libuvc: a cross-platform library for USB video devices
a cross-platform library for USB video devices. Contribute to libuvc/libuvc development by creating an account on GitHub.
https://github.com/libuvc/libuvc
仕様がダウンロードできます、が!USBに関しての知識がないと多分わからない。私も分からん。
ブロードキャストレシーバーが出てきて懐かしい気持ち。クラスが何個か出てきて複雑
多分こんなことをlibuvcがやっている。C言語はわからない
UVCのデバイスを探すUVCデバイスに接続する
USBデバイスを操作する権限がなければ、ダイアログを表示し付与してもらう
USBデバイスのインターフェースやエンドポイントに触れるようになるこれ以降はUVCの仕様書を読んだり、libuvcがやっていることを真似すれば良いはず。理論上は
USBには通信路がいくつかある?この通信路をインターフェースとか呼んでいるそう
UVCの場合は、仕様書を見ると0番目がVideoControl、1番目がVideoStreamingになってて、映像のフレームが欲しい場合は1番目のインターフェースを使う1番目のインターフェースを取る。あとエンドポイントも取る
claimInterfaceで、USBデバイスを専有するコントロール転送を使って、UVCデバイスに命令を投げる
libuvcのこの辺で命令のバイト配列を作っている
バルク転送を使って、フレームを取り出す
YUY2(手元のやつだとこれだけっぽい)
AndroidだとYuvImageクラスを使うことでJPEGにできますYUY2をJPEGとかにする
libuvcはlibusbっていうライブラリを叩いてるので、Androidに持ち込むのは先人たちが言うには厳しいそう。(USBデバイスのファイルにアクセスできない)AndroidでUSBを触るにはUsbManagerってのがすでにあるため、それを使わないといけない。
なので、libuvcと同じように命令のバイト配列を組み立てたり、結果をパースしたりして、libusbを叩いてる部分はAndroidのUSB関連のクラス、UsbDeviceConnection#controlTransferやUsbDeviceConnection#bulkTransferを使えば、理論上は動くような気がしている
めちゃめちゃ大変そうだけど。
内容0で申し訳ない。まずはlibuvcを動かしてみるところからやらないとダメそう。
あとCamera2 APIでUVCデバイスにアクセスできるとか書いてありますが、あれはXperiaくらいしか対応した機種がないです。
カメラ連携を謳ってるだけある!!!!