Android
Oculus
VR
OculusGo

Oculus GoでスカウターのようなViewをオーバーレイした

Oculus Goを買ったばかりのAndroidエンジニアが、
Mobile SDKやUnityに触れることなく、普通のAndroidの知識でいろいろ遊んでいます。
VRなひとたちは当たり前に皆やってることかもしれませんが、楽しかったので書いてます。

基本

さて、Androidは各アプリの上にViewを重ねて表示することができます。
いちばん有名なのはFacebook Messenger のチャットヘッドでしょうか。
その他の使い方としては、端末の通信状況などの情報を表示させるとか。
私が作ったものですが(宣伝)、2つのアプリをワンタップで往復するボタンを常時表示させておくこともできます。
https://play.google.com/store/apps/details?id=com.github.guignol.alternate

実装の基本については、qiita内にも記事がありますし、
https://qiita.com/farman0629/items/ce547821dd2e16e4399e
「facebook chatheads SYSTEM_ALERT_WINDOW」とかでググれば分かると思います。

パーミッション

これをやるにはSYSTEM_ALERT_WINDOWというパーミッションが必要です。
https://qiita.com/chibatching/items/add5e50921c2da5ee1c7

このパーミッション設定を変更させる画面はOculus Goでも出せましたが、
画面内のスイッチを押せないので、諦めてtargetSdkVersionを下げました。
API レベル 23未満なら何でもいいと思いますが、私は適当に21で確認しました。
こうすると、古いAndroidの挙動として、インストール時にパーミッションを得たことになります。

まだ試してませんが、https://www.vysor.io/ を使えば、
AndroidアプリのボタンをPCから押せるので、Runtime Permission等にも対応できるかもしれません。
できました。

わーい

screenshot-1526093270436.jpg
Oculus Goのキャプチャ機能だとこのViewは含まれなかったので、vysorを使いました。

起動と終了

起動はAndroid Studioからもできますし、
端末がスリープすると、
このViewを追加したサービスのonDestoryが呼ばれてるっぽいので、
自分で制御する必要は無いかもしれませんが、いちおう参考までにコマンドを載せておきます。

起動.するとき
adb shell monkey -p アプリケーションID -c android.intent.category.LAUNCHER 1
終了.するとき
adb shell am force-stop アプリケーションID

Connecting adb via Wi-Fi

adbを有線で繋ぐのはしんどいのですが、adbはWifi越しに通信できます。
oculusの公式ドキュメントにも「Connecting adb via Wi-Fi」というセクションがあります。
https://developer.oculus.com/documentation/mobilesdk/latest/concepts/mobile-adb/
うまくいかないときは

adb kill-server

パーミッションに関する追記

https://www.vysor.io/ で設定アプリをタップすることができるので、Runtime Permissionその他も何とでもなりました。

設定アプリの起動.
adb shell monkey -p com.android.settings -c android.intent.category.LAUNCHER 1
設定アプリの起動.
adb shell am force-stop

screenshot-1527344031348.jpg

(なみに、上記画像は、スカウターを卒業して、画面の左下の視界ギリギリに出るようにしたのものです。)

adb install-gオプション

しかし、この記事のコメント

adb install に -g オプションを付けるとすべてのパーミッションが付与されるので

と教えてもらったので、試したらできました。無敵ですね。

ヘルプを見ると

-g: grant all runtime permissions

だそうです。なるほど。
adb installのオプションは-rしか使ったことなかったです。

-r: replace existing application