【再生・プレビュー編】暗号化と究極のサクサク感を両立する、画像・動画再生画面の仕様設計

Android

アプリの「顔」であり、最もユーザーが触れる場所――それが「画像プレビュー画面」と「動画再生画面」です。

データをガチガチに暗号化しつつも、ユーザーにはそれを意識させないほど「サクサク、快適に」動かす。そして高齢の両親が迷わず、子供の誤操作にも耐えるセキュリティを仕込む。この2つの画面には、そんな矛盾を解決するための数々の仕様設計と、実機テストで血を吐いた泥臭い罠がありました。

画像プレビュー表示画面の仕様:他アプリへの展開も見据えて

画像プレビューは単に写真を表示するだけでなく、今後の別アプリ開発でもそのまま使い回せる(コンポーネント化する)ことを前提に、最初から設計(仕様決め)を行いました。

  • Adapter処理の完全分離 汎用性を高めるため、画像用と動画用でAdapter処理を完全に別クラスに切り離しました。これにより、コードの肥大化を防ぎ、将来の別プロジェクトへの移植性を担保しています。
  • 充実のプレビュー機能 基本のスワイプによる画面切り替えに加え、自動で写真をめくる「スライドショー」、ピンチイン・アウトによる「拡大縮小」、細部を見るための「表示領域移動(ドラッグ)」、そして不要な写真をその場で消せる「削除機能」を実装しました。
  • 画面キャプチャの独自制御(暗号化スクリーンショット) システムのスクリーンショット機能は、セキュリティ保護のために一律で「禁止」に設定。その代わり、アプリ内に「暗号化ファイルを直接作成する独自のスクリーンショット機能」を設け、安全に思い出をキャプチャできる仕様にしました。
  • デバイス回転機能のコントロール 横向きの写真、縦向きの写真に合わせて、ユーザー側でデバイス回転機能の有効・無効を制御できる設定を盛り込みました。

動画再生画面の仕様:シンプルだけど妥協しないプレイヤー

操作感は極限までシンプルにしつつ、市販の動画プレイヤーに負けない快適な再生環境を目指しました。

  • プレイヤーの基本機能とシーク制御 スムーズな再生開始・停止はもちろん、動画の総尺(長さ)と現在の再生位置のリアルタイム表示、直感的に位置を飛ばせる「シークバー」を搭載しました。画面を広く使うため、各メニューは操作がないと消える「自動非表示」仕様です。
  • 快適な再生コントロール 動画をストレスなく楽しむため、スワイプ操作による「ボリューム変更」をはじめ、「速度再生変更(倍速再生)」にも対応。画像と同様に、動画再生画面でも「拡大縮小」「表示領域移動」「削除機能」、そして「システムスクショ禁止&独自暗号化スクショ機能」を網羅しました。
  • オンデマンドなサムネイル作成 前回の設計編でも触れた通り、動画は初回の再生時にその場で「サムネイルファイルを暗号化して作成」し、一覧画面の軽量化に貢献しています。

実装で激しくハマった「3つの罠」

ここが今回の開発において、AI(Copilot/Gemini)と共に一番頭を悩ませ、泥臭く突破したハイライトです。

① 拡大縮小・表示位置の保持という深い沼

画像を拡大したまま次の画像にスワイプした際、前の画像の拡大率や座標情報が残ってしまい、表示位置がズレまくるバグに直面しました。 AIと一緒に座標の保持やリセットのロジックを美しく実装しようと試みましたが、AndroidのタッチイベントとViewのライフサイクルの絡みが予想以上に根深く、今回はバグを確実に防ぐ安全策として「画像切り替え時に問答無用で拡大縮小情報を初期化する(等倍に戻す)」という仕様で着地させました。

② タブレットの「ジェスチャー操作」vs アプリの「戻るボタン」の衝突

実験用の検証端末として「NECのタブレット」を使用していたときのこと。 OS側の「画面左端をスワイプして戻る」機能と、アプリ内の「スワイプで画像切り替え」が競合し、UI操作が非常にわかりづらくなってしまいました。

「それならシステム側の左スワイプ戻りをアプリ内で禁止してしまおう!」と実装したのですが、クローズドテストに回した直後、テスターから「普通のスマホの『戻るボタン(下部ナビゲーション)』まで効かなくなった!」との指摘が。 慣れてくれば左スワイプでの戻りと画像切り替えを使い分けることができますが、使い始めの人は意図しない画面移動に強い違和感を覚えます。UI/UXの難しさを痛感しつつ、最終的にはシステムの左スワイプ禁止を「解除」し、OS標準の挙動に身を委ねる形に修正しました。

③ MediaPlayerからExoPlayerへの完全移行

最初はAndroid標準のMediaPlayerで実装を進めていました。しかし、本アプリの心臓部である「暗号化ファイルをリアルタイムに復号しながらストリーミング再生する」という高度な処理をさせようとしたところ、MediaPlayerの仕様限界に激突。対応しきれず、よりカスタマイズ性が高く強力なExoPlayerへと全面刷新する大手術を行いました。

【一番の苦労】再生不可ファイル(破損・独自フォーマット)の検出

今回、最も精神をすり減らしたのが「不穏な挙動をするMP4ファイルの検出」です。

アプリの対象ファイルは基本「MP4」ですが、一言にMP4と言っても中身は千差万別。特に「iPhoneで撮影した動画を無理やりPC等でMP4変換したファイル」や、「一部のデータが壊れている破損MP4」を再生しようとした際、ExoPlayerがエラーを吐かずにフリーズしたり、挙動が不穏になるケースが多発しました。

テスト環境でそういった「不穏な動きをするファイル」を見つけては、再生前にエラーメッセージを表示して安全に処理を止めるコードを書き足していきましたが、正直なところ、世の中にあるすべての例外ファイルを完璧に検出できているかは、今でも不安が残る部分です。

今後の大きな課題

「もっと対応できる動画フォーマット(拡張子)を増やしたい」と思い、AI(Copilot/Gemini)に相談してみたのですが、「これ以上を求めるなら、ExoPlayerの限界。動画再生のコアエンジン自体を別なものに切り換えるべき」とのアドバイスを受けました。 現在はExoPlayerの限界値までチューニングを施していますが、今後のバージョンアップでは、プレイヤーのエンジン選定そのものを見直す、さらなる大冒険が待っていそうです。

📥 アプリ「フォト・守」をPlayストアでチェックする

・価格:無料
・仕様:完全ローカル・通信なし
・広告:ファイル一覧下部のみ(写真・動画再生中はなし)

👉 Google Play ストアでダウンロード

▼ アプリのダウンロードはこちら(Google Playに移動します)

Google Play で手に入れよう

コメント