情報畑でつかまえてロゴ
本サイトは NTTテクノクロスが旬の IT をキーワードに
IT 部門が今知っておきたい最新テクノロジーに関する情報をお届けするサイトです

Android Oの世界(Picture In Picture編)

今回は、Android Oの目玉機能の1つである 「スマホ・タブレット向けのPicture In Picture機能」 について、具体的な実装方法や注意点などについてご紹介します。

はじめに

皆様、こんにちは。NTTテクノクロス株式会社の神原です。Androidで広がる世界の第19回目です。前回は、Android Oの特徴的な機能を幾つかご紹介しました。今回は、Android Oの目玉機能の1つである 「スマホ・タブレット向けのPicture In Picture機能」 について、具体的な実装方法や注意点などについてご紹介します。Android Oの正式版は公開されていないため、現時点での最新版であるDeveloper Preview 3を用いて解説します。

スマホ・タブレットでの「Picture In Picture」対応例

具体的なアプリを題材に、スマホ・タブレットにおけるPicture In Picture(以後、PIPと表記)機能の実装方法を解説していきます。まず、以下の図のように、画像表示アプリで本機能を実現したいとしましょう。画面下側の「PIPモード起動」ボタンを押すと、アプリのウィンドウが小さくなり、ミニウィンドウ内に画像が表示されます。この小さなウィンドウはドラッグ&ドロップすることで、自分の好きな位置に移動可能とします。

image

「Picture In Picture」実現方法

PIP機能を実現するには、以下の2つが必要となります。

  • (1)AndroidManifest.xmlの編集
  • (2)Javaソースファイルの編集

それぞれの詳細について、解説します。

(1)AndroidManifest.xmlの編集

アプリ内でPIPに対応させたい画面(Activity)がある場合、 AndroidManifest.xml 内の該当するActivityの属性として、 supportsPictureInPicture=true を設定しておく必要があります。以下のように定義しておきましょう。

image

もし複数の画面をPIPに対応させたい場合は、上記と同様に、各Activityの属性にsupportsPictureInPictureを設定することになります。

(2)Javaソースファイルの編集

「PIPモード起動」ボタンが押されたタイミングで、PIPモード(PIPが起動し、小さなウィンドウが表示されている状態)へ遷移するソースコード例は、以下のとおりです。

image

ソースコードの流れを見ていきましょう。PIPモードを起動する際に、ウィンドウの大きさの縦横比(アスペクト比)などの付加情報(PictureInPictureParams)を設定できます。そのために、PictureInPictureParamsのBuilderインスタンスを生成しています。続いて今回は、ウィンドウの大きさの横幅:縦幅を4:3にするため、Rational型のインスタンス生成時にその値を設定しています。最後に、PIPモードを起動するためのメソッドである enterPictureInPictureMode() を呼び出しています。その際、付加情報として、アスペクト比を設定済のPictureInPictureParamsのインスタンスを設定しています(build()メソッドを呼び出すと生成できます)。

注意点を幾つか補足しておきます。実装するときはご注意ください。

  • PictureInPictureParamsのクラス名
    • 以前は、PictureInPictureArgsという名前でした。OのDeveloper Preview 3でクラス名が変更されました。
  • PictureInPictureParams.BuilderのsetAspectRatio()メソッドの引数
    • 以前は、アスペクト比を示すfloat値(1.33fなど)を設定する仕様でした。こちらもOのDeveloper Preview 3で設定すべき型が変更されました。

ここまで実装した状態で、Android O(Developer Preview 3以降)を搭載している実機もしくはエミュレータにインストールすれば、PIPの振る舞いを確認できるはずです。「PIPモード起動」ボタンを押すことで、PIPモードが起動し小さなウィンドウが表示されるという振る舞いになります。

「Picture In Picture」応用編

上記でご紹介したアプリには、改善の余地があります。具体的には、PIPモードへの遷移時に、表示されるウィンドウの内容です。PIPモードでは画面が通常時と比較して小さいこともあり、画面に表示する内容は、特に重要なものに限定すべきです。今回のアプリでは、以下の図のように表示内容を画像のみに限定するのが望ましいでしょう。

image

実装のヒントをご紹介しておきます。PIPモードへの遷移(通常モード→PIPモード)、PIPモードからの復帰(PIPモード→通常モード)のタイミングで、onPictureInPictureModeChanged(boolean isInPictureInPictureMode)メソッドが呼び出されます。この契機で、不要なビューを非表示にしたり、再表示したりするロジックを実装することで、今回の目的を実現できます。実際にコードを書きながら、試していただければ幸いです。

また、今回はソースコードをシンプルにするために、画像を表示するアプリとしましたが、実際のユースケースでは、動画再生機能を持つアプリでPIPモードが役立つことが多いでしょう。例えば、通常モードで動画再生中だったら、PIPモードへ遷移しても動画再生はそのまま継続するといった配慮が必要となります。

おわりに

今回は、Android OのPicture In Picture機能に関して、ご紹介しました。Picture In Pictureは、これまでのAndroidに新たな世界観を提供してくれる機能です。さらに、Android Oからはスマホ・タブレットでも使えるようになるため、活用したアプリがさらに増えていくことを期待しています。次回のテーマは未定ですが、ぜひ楽しみにしていただけると幸いです。

参考URL

Androidで広がる世界(本ブログのトップページ)

Android Oの世界(Developer Preview 1編)

著者プロフィール
神原 健一
神原 健一
新技術開発を好み、Androidは正式版が出る前から試用するなど、公私にわたってモバイルの世界に没頭。 プライベートで開発した「セカイフォン」で、 Multi-Screen UX Competition優秀賞受賞。MWC(バルセロナ)/IFA(ベルリン)/CES(ラスベガス)へのプロダクト出展、 国内外(デブサミやDroidconなど)のセミナー講演や書籍執筆(単著・共著含め5冊)などの活動も行っている。NTTテクノクロスきってのモバイル技術者。 プライベートでは旅行が好きで、現地の外国人にセカイフォンをデモすることが密かな楽しみ。