たくさんの自由帳
Androidのお話
たくさんの自由帳
投稿日 : | 0 日前
文字数(だいたい) : 3316
どうもこんばんわ。
最近は数年ぶりにNova Launcher
ってホームアプリを使ってます。Android 7
くらいのときは有料版を買うくらいには気に入ってた。
列や行のサイズを変えたり(今なら標準で出来ますが、上限付き)、ウィジェットの最小幅を無視したり、上から下スワイプで通知領域を展開したり(これも今なら標準で出来ますが)、ページ丸々削除するやつとか、通知バッチとか気に入ってた。
しかしAndroid 10
が来てからは、ジェスチャーナビゲーションを使うために標準ホームアプリを使ってました。
正しくはサードパーティのホームアプリでもジェスチャーナビゲーションが使えたのですが、その頃のサードパーティのホームアプリにはホーム画面に戻ったときのアニメーションが実装されて無くて、使うのをやめちゃったんですよね。(そもそもデバイスメーカーによっては標準ホームアプリ以外を使う場合はジェスチャーナビゲーションが無効になるとか)
Android
がそれ用のAPI
を提供してくれないのが悪いみたいでサードパーティが対応するのは難しいとか。
が、やっぱりウィジェットを詰め込みたくて舞い戻ってきた。最小幅を無視したい。
今使ってますが、かなり再現度の高いジェスチャーのアニメーションがされるようになってました。
いつから実装されたんだろう?API
がないからサードパーティではもう無理なのかなって思い込んでたんだけど、Nova Launcher
側でフルスクラッチしたのか、かなり再現度の高いアニメーションがされるように進化してた、、、
ギブアップです。わかりません。
敗因はUVC
どころかUSB
自体がわからなかったことかなと思います。
Android NDK
、というよりかはC / C++
無しでUSB Video Class (UVC)
をやりたかった。。。
なんとかJava / Kotlin
だけで書けるようになりたかった。
だれか続きを書きたいという方がいらっしゃれば。
https://github.com/takusan23/AndroidKotlinUsbVideoClass
見るべきところはMainActivity
です。
https://github.com/takusan23/AndroidKotlinUsbVideoClass/blob/master/app/src/main/java/io/github/takusan23/androidkotlinusbvideoclass/MainActivity.kt
一応繋いで、権限を付与した後ボタンを押すと、こんな感じのぐちゃぐちゃな画像ができます。
本当はぐちゃぐちゃにならないはずですが。。
Xperia
の外部モニターだときれいに出ている。解像度が変なのは私があれこれいじったせい。
ぶっちゃけパクリです。すいません
仕様がダウンロードできます、が!USB
に関しての知識がないと多分わからない。私も分からん。
https://www.usb.org/document-library/video-class-v15-document-set
ブロードキャストレシーバーが出てきて懐かしい気持ち。クラスが何個か出てきて複雑
https://developer.android.com/develop/connectivity/usb/host
多分こんなことを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
くらいしか対応した機種がないです。
カメラ連携を謳ってるだけある!!!!