前回までは、他の場所に設置したAndroidスマートフォンのカメラ映像を、別の場所で確認するアプリ開発の方法を紹介しました。
今回は、この機能に加えてAndroidスマートフォンの音声も一緒に伝送する機能を追加しました。
また、前回はアプリがバックグラウンドになると落ちるなど不安定になっており、それを改善したことも書いておきます。
これまでの履歴はこちらのとおりです。
使用した環境
Android Studio : 2024.3.2
Androidスマートフォン: Android 12
1. Serviceの活用
前回 (みまもりアプリ開発3) のとき、残っていた問題の中にAndroidアプリが落ちてしまうというのがありました。
問題 (まだ解決していないもの) ・スリープして復帰するととwebsocketサーバが落ちてしまう ・アプリを起動して30分未満でも、クライアント側からアクセスできないことがある ・一度サーバアプリがバックグラウンドに入ると、復帰後にアプリが落ちてしまう
これを解決するために、Serviceを使うことにしました。
Serviceとは、下記で紹介されているとおり、必要な処理をバックグラウンドで実行する方法です。
Service は、長時間実行オペレーションをバックグラウンドで実行できるアプリケーション コンポーネントです。
ユーザー インターフェースは提供されません。サービスは、ユーザーが別のアプリに切り替えた後も、しばらく実行され続けることがあります。また、コンポーネントはサービスにバインドしてサービスとやり取りしたり、プロセス間通信(IPC)を実行したりすることもできます。
たとえば、サービスはネットワーク トランザクションの処理、音楽の再生、ファイル I/O の実行、コンテンツ プロバイダとのやり取りをすべてバックグラウンドで行うことができます。
引用元:サービスの概要 | Background work | Android Developers
ということで、クライアント端末の接続受付、カメラ映像とマイク音声の取得と送信をServiceの中で実行する処理に変更しました。
2. 追加・変更した機能の一覧
追加・変更対象は以下のファイルです。
それぞれの行数が多く、gistでソースコードを貼っていくとものすごく長くなるため、GitHubにリポジトリを作りました。 詳細はこちらをご覧ください。
主なソースコードの役割です。
MainActivity.kt
起動、画面の描画、Websocket通信の開始と終了
CameraCapture.kt
Androidスマートフォンの映像を取得
AudioCapture.kt Androidスマートフォンのマイク音声を取得
CameraServerService.kt
Serviceとして起動し、Websocket通信関係を担当
MediaFrame.kt
映像と音声の型を定義
3. ビルドするまでの手順
ついでに、Android Studioで開いてビルドするまでの手順も書いておきます。
まず、上記のリポジトリをAndroid Studioで開きます。開くとビルド実行ツールのGradleが自動的に開始します。
Gradleについては、たとえばこちらをご覧ください。
Gradleを基本からまとめてみた【入門】 #gradle - Qiita
Gradleの実行が完了するまでは数分かかることがあります。また、build.gradleファイルを修正すると、再度Gradleのビルドが必要になります。
Gradleをビルドするには、以下の[1], [2]の順番でボタンを選択します。
Gradleのビルドが完了すると、アプリをビルド、シミュレータ実行 or 実機デプロイのための再生ボタンが表示されます。スクリーンショットの右上部分です。
もしこの三角ボタンが表示されない場合は、Gradleのビルドが失敗しています。[2]の画面右側にログが出るので、その内容に沿って修正します。
三角ボタンを押すと、シミュレータ実行 or 実機デプロイができます。
4. 動作確認
後述するマイクの問題が残っていますが、冒頭の図で示したように別の部屋からカメラ映像と音声を確認できるようになりました。
また、2台のクライアント端末 (別のスマートフォンやPCのブラウザ) から同時にアクセスして映像を見ることもできるようになりました。
クライアント端末側の表示例です。
実際に設置してみました。不定期ですが使い始めています。
5. おわりに
ひとまず、映像と音声が確認できるようになってよかったです。 ただ、マイクで取得した音声データがうまく処理できておらず、「ぱ、ぱ、ぱ、」という変な音になります。この辺は後日修正予定です。