アプリをビルドするにあたり、最もエネルギーを使うのが「仕様決め」です。特にプライバシーやセキュリティを扱うアプリでは、機能を増やせば増やすほどユーザーの手間が増え、シンプルさが失われてしまいます。
今回は、AIと共に一つずつ課題をクリアしていった、ファイル一覧画面の仕様決め、そして一番悩んだ「データ保存先」の葛藤と見落としがちな罠について記録を残します。
1. ファイル一覧表示画面の機能と「割り切り」の仕様
高齢の両親でも直感的に使えるよう、メニュー周りはサブメニューに格納してメイン画面を極限までシンプルに保ちつつ、裏側のシステムでは以下のようなトレードオフを意識して仕様を決定しました。
サムネイル表示の最適化(画像と動画の処理分離)
一覧画面にサムネイルは必須ですが、すべてを同じタイミングで処理すると端末の動作が著しく重くなります。 そこで、「画像ファイルは暗号化するその瞬間にサムネイルを作成」し、「動画ファイルは初回の再生時にサムネイル画像を暗号化して作成する」というハイブリッド方式を採用しました。重い動画処理のタイミングを後ろにずらすことで、アプリ全体の軽快さをキープしています。 *※作成した動画サムネイルのキャッシュクリア機能や、動画の再生位置の記録(レジューム再生)については、今後のバージョンアップでの再検討課題としています。*
フォルダ管理と識別性の向上
ファイルが増えても迷子にならないよう、フォルダ作成機能はもちろん、後からの「フォルダ名変更」にも対応しました。さらに、お年寄りでもパッと見で識別しやすいよう、「フォルダの色を変更できる機能」を用意しています。
暗号化の単位と、あえて「長押し」にした削除UI
使い勝手を考慮し、暗号化は「指定したファイル単体」だけでなく「指定したフォルダごと」一括で行える仕様にしました。
また、一番悩んだのが「ファイルの削除UI」です。「間違って消さないように確認ダイアログを出すべきか?」とも考えましたが、あの「本当に消しますか?」のポップアップは、日常的に使う上で非常に煩わしいものです。今回は引き算の美学としてダイアログを廃止し、「長押しによるスマートな削除UI」を採用しました。
バックアップの代替としての「個別・フォルダ復号」
セキュリティとローカル完結を最優先するため、いわゆる「クラウドバックアップ機能」は一切排除しています。しかし、利便性を完全に捨てるわけにはいきません。「フォト・守」には、画像プレビュー画面や動画再生画面でデータを暗号化したまま安全にスクリーンショットを撮る機能をつけたため、データ取り出し用として「ファイル個別、またはフォルダ毎の復号化機能」をしっかりと用意しました。
【現在迷い中】レイアウトのバリエーション(グリッド数の最適解)
現在は、一般的な「リスト表示」に加え、ベースとなる「2×2のグリッド表示」をすでに実装しています。
ただ、実際に自分で触っていると、「ファイル数が増えてきたときに、もっと一覧性が高い方が便利かもしれない」と感じるようになりました。そのため、4×4や8×8といった、さらに細分化した多段グリッド表示も用意すべきか、それともシンプルさを維持するために現在のままでいくべきか、今後のユーザーの反応を見ながら再検討したいと考えています。
今後の課題:指紋認証(生体認証)の組み込み
過去に別の開発アプリで実装経験のある「指紋認証」の機能についても、このアプリに組み込むかどうか悩んでいます。セキュリティを高めるという意味では強力ですが、アプリの最大の目標である「高齢者でも迷わないUI/UXのシンプルさ」を壊してしまわないか。こちらもバージョンアップの際の重要な課題としてストックしています。
2. 初のGoogle Play掲載と、広告に対する「実験」と「配慮」
実は、今回開発した『フォト・守』が、私にとって初めてのGoogle Playストアへの掲載(リリース)となります。
元々は自分や家族が使うためのプライベートなアプリなので、そもそも広告を載せる必要性はありませんでした。しかし、アプリをストアへ一般公開するまでの一連の手順や、Google AdMobなどの広告ライブラリの実装仕様を体系的に学ぶ「勉強」の絶好の機会でもあるため、あえて一部に広告表示を組み込んでみる実験を行いました。
もちろん、既存のアプリにありがちな「画面全体を覆い尽くすポップアップ広告」や「動画を見ようとした瞬間に強制挿入される全画面広告」は、自分がユーザーの立場なら絶対に許せない仕様です。特に高齢の両親が使うことを考えると、画面迷子の原因にししかありません。
そこで、広告を表示させる場所は**「ファイル一覧画面の最下部(ボトムバナー)」のみに徹底して限定**しました。
アプリの本来の目的である「写真のプレビュー表示」や「動画再生」を行っている最中は、広告を一切非表示にしています。大切な思い出の空間を、チラチラ動く広告で邪魔されることはありません。
広告を「UIの一部」として同化させるアプローチ
この配置に決めたもう一つの理由は、画面最下部の固定バナーであれば、ファイル一覧画面のUI(デザイン)の中に自然とシステムの一部として同化させることができるのではないか、と考えたからです。
取って付けたような邪魔なポップアップではなく、画面のレイアウトに最初から組み込まれた「帯状のエリア」として処理することで、アプリ全体のシンプルな世界観を壊さずに、技術的な実験(広告配信システムが正しく動くかどうかの検証)を両立させることができました。
3. 【一番悩んだ箇所】暗号化ファイルの保存先はどこが正解か?
このアプリの設計において、最も頭を悩ませたのが「ファイルの保存先(ストレージ領域)」でした。検討した選択肢は2つありました。
候補A:アプリ固有領域(Context.filesDirなど)
メリット: セキュリティが完璧。PCに繋いでも他アプリからも絶対に見えない。
デメリット: アプリをアンインストールすると、データが一緒に消えてしまう。
候補B:共有領域(Picturesフォルダなど)
メリット: アプリを消してもデータは残る。
デメリット: ファイル名や中身をAESで暗号化しているため、Picturesフォルダ内には「ユーザーにとっては意味不明な英数字のファイル」がゴロゴロ並ぶことになる。結果、ユーザーが「これ何だろう?」と誤って削除してしまうリスクが非常に高い。
暗号化アプリの多くがこの問題に直面しますが、私は最終的に、前回の記事でも触れた通り「このアプリはあくまで、自宅のPC等にマスターデータがあることを前提とした、持ち出し端末閲覧用のアプリである」とユースケースを完全に割り切りました。 「アンインストール時に消える」というリスクを受け入れてでも、誤削除を防ぎ、鉄壁のプライバシーを保てる**「アプリ固有領域への保存」**がこのアプリの思想にはベストである、という結論に至りました。
4. 【見落としていた点】実機テストで発覚した「スリープ」の罠
シミュレーター(エミュレーター)での開発中には全く気づかず、実機にアプリを転送して初めて見落としに気づいた致命的なポイントがありました。 それが、**「大量のファイルや重い動画を暗号化・復号化している最中に、端末がスリープ(画面消灯)してしまう問題」**です。
暗号化・復号化はCPUをフルに使う重い非同期処理ですが、Androidシステム側から見ると、ユーザーが画面を操作していない時間が続くと「操作がない」と判断され、処理の途中で無慈悲にスリープに入ってしまいます。スリープに入ると処理が中断され、データ破損の原因にもなりかねません。
解決策:
処理が走っている間はシステムに対して画面を消さないように要求する、スリープ防止処理(`FLAG_KEEP_SCREEN_ON` の制御やWakeLockの適切な運用)を組み込むことで、この罠を無事に突破しました。やはり、どれだけAIが優秀でも、実機で動かして初めて分かる泥臭い罠はあるものだと痛感した瞬間です。
5. 【意外な大誤算】AI(Copilot/Gemini)という最強の相棒
ここだけの話、開発を始める前は「ファイルの暗号化・復号化のロジック、ましてやそれをリアルタイムにストリーミングしながら動画再生するなんて、バグまみれになって何週間も足止めを食らうだろう」と覚悟していました。
ところが、いざ蓋を開けてみると、この一番重たいはずのコア処理が驚くほどスムーズに進んだのです。
今回はAI(CopilotやGemini)を思考のパートナーとしてフル活用しながらビルドしていったのですが、複雑な暗号化の基本アルゴリズムの実装はAIの助けを借りることで一発クリア。
さらに、当初の「ファイル丸ごと復号」から、高速化のために「一部を復号しながらリアルタイムに再生処理を流し込む」という複雑な仕様変更(リファクタリング)に踏み切ったときも、AIにコードの意図を壁打ちしながら進めることで、**考えていたよりも遥かに楽に、かつ安全にコードを修正することができました。**
どれだけ難解に見えるアルゴリズムでも、AIと正しく対話しながら泥臭い部分を任せることで、個人開発でもここまで高度な機能をスピード感を持って実装できる。まさに現代の開発スタイルの凄みを肌で実感した瞬間でした。
📥 アプリ「フォト・守」をPlayストアでチェックする
・価格:無料
・仕様:完全ローカル・通信なし
・広告:ファイル一覧下部のみ(写真・動画再生中はなし)
👉 Google Play ストアでダウンロード
🛠️ 次回予告:【再生・プレビュー編】暗号化と究極のサクサク感を両立する、画像・動画再生画面の仕様設計
無事に基本の保存先や広告の配置は決まったものの、アプリの「顔」であり、ユーザーが最も長く触れる「画像プレビュー」と「動画再生」の画面には、さらに深い仕様設計のトレードオフと実機テストでの血の滲むような罠が待っていました。
・今後の別アプリ展開も見据えた、画像・動画用「Adapter処理」の完全分離設計
・システムのスクショを鉄壁ガードしつつ、思い出を安全に残す「独自暗号化スクショ機能」
・【激しくハマった罠①】画像の拡大縮小・表示位置の保持が引き起こす深い沼と、等倍リセットの割り切り
・【激しくハマった罠②】タブレットの「システム左スワイプ戻り」vs「アプリの画像切り替え」の衝突とクローズドテストでの指摘
・MediaPlayerの限界と、暗号化ストリーミング再生を可能にしたExoPlayer(Media3)への完全移行
・【一番の苦労】iPhone由来の変換動画や破損MP4がもたらす不穏な挙動。再生不可ファイルをどう検出するか?
・AI(Copilot/Gemini)から突きつけられた「これ以上を求めるならエンジン切り替え」という今後の大課題




コメント